Files
automatisch/packages/backend/src/apps/gitlab/triggers/lib.ts
Krzysztof Dukszta-Kwiatkowski 6e80ff4eb6 post review fixes
2023-05-30 15:21:13 +02:00

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}`
);
};