90 lines
2.5 KiB
TypeScript
90 lines
2.5 KiB
TypeScript
import { IGlobalVariable, IJSONObject } from '@automatisch/types';
|
|
import Crypto from 'crypto';
|
|
import { GITLAB_EVENT_TYPE } from './types';
|
|
import appConfig from '../../../config/app';
|
|
|
|
export const projectArgumentDescriptor = {
|
|
label: 'Project',
|
|
key: 'projectId',
|
|
type: 'dropdown' as const,
|
|
required: true,
|
|
description: 'Pick a project to receive events from',
|
|
variables: false,
|
|
source: {
|
|
type: 'query',
|
|
name: 'getDynamicData',
|
|
arguments: [
|
|
{
|
|
name: 'key',
|
|
value: 'listProjects',
|
|
},
|
|
],
|
|
},
|
|
};
|
|
|
|
export const getTestRunFn =
|
|
(eventData: IJSONObject) => ($: IGlobalVariable) => {
|
|
/*
|
|
Not fetching actual events from gitlab and using static event data from documentation
|
|
as there is no way to filter out events of one category using gitlab event types,
|
|
filtering is very limited and uses different grouping than what is applicable when creating a webhook.
|
|
|
|
ref:
|
|
- https://docs.gitlab.com/ee/api/events.html#target-types
|
|
- https://docs.gitlab.com/ee/api/projects.html#add-project-hook
|
|
*/
|
|
|
|
if (!eventData) {
|
|
return;
|
|
}
|
|
|
|
const dataItem = {
|
|
raw: eventData,
|
|
meta: {
|
|
// there is no distinct id on gitlab event object thus creating it
|
|
internalId: Crypto.randomUUID(),
|
|
},
|
|
};
|
|
|
|
$.pushTriggerItem(dataItem);
|
|
|
|
return Promise.resolve();
|
|
};
|
|
|
|
export const getRegisterHookFn =
|
|
(eventType: GITLAB_EVENT_TYPE) => async ($: IGlobalVariable) => {
|
|
// ref: https://docs.gitlab.com/ee/api/projects.html#add-project-hook
|
|
|
|
const subscriptionPayload = {
|
|
url: $.webhookUrl,
|
|
token: appConfig.webhookSecretKey,
|
|
enable_ssl_verification: true,
|
|
[eventType]: true,
|
|
};
|
|
|
|
if (
|
|
['wildcard', 'regex'].includes(
|
|
$.step.parameters.branch_filter_strategy as string
|
|
)
|
|
) {
|
|
subscriptionPayload.branch_filter_strategy = $.step.parameters
|
|
.branch_filter_strategy as string;
|
|
subscriptionPayload.push_events_branch_filter = $.step.parameters
|
|
.push_events_branch_filter as string;
|
|
}
|
|
|
|
const { data } = await $.http.post(
|
|
`/api/v4/projects/${$.step.parameters.projectId}/hooks`,
|
|
subscriptionPayload
|
|
);
|
|
|
|
await $.flow.setRemoteWebhookId(data.id.toString());
|
|
};
|
|
|
|
export const unregisterHook = async ($: IGlobalVariable) => {
|
|
// ref: https://docs.gitlab.com/ee/api/projects.html#delete-project-hook
|
|
await $.http.delete(
|
|
`/api/v4/projects/${$.step.parameters.projectId}/hooks/${$.flow.remoteWebhookId}`
|
|
);
|
|
};
|