feat: Convert all app files to JS
This commit is contained in:
@@ -1,15 +1,14 @@
|
||||
import { IGlobalVariable } from '@automatisch/types';
|
||||
import { URL, URLSearchParams } from 'url';
|
||||
import getBaseUrl from '../common/get-base-url';
|
||||
import getBaseUrl from '../common/get-base-url.js';
|
||||
|
||||
export default async function generateAuthUrl($: IGlobalVariable) {
|
||||
export default async function generateAuthUrl($) {
|
||||
// ref: https://docs.gitlab.com/ee/api/oauth2.html#authorization-code-flow
|
||||
|
||||
const scopes = ['api', 'read_user'];
|
||||
|
||||
const searchParams = new URLSearchParams({
|
||||
client_id: $.auth.data.clientId as string,
|
||||
redirect_uri: $.auth.data.oAuthRedirectUrl as string,
|
||||
client_id: $.auth.data.clientId,
|
||||
redirect_uri: $.auth.data.oAuthRedirectUrl,
|
||||
scope: scopes.join(' '),
|
||||
response_type: 'code',
|
||||
state: Date.now().toString(),
|
@@ -1,14 +1,14 @@
|
||||
import generateAuthUrl from './generate-auth-url';
|
||||
import verifyCredentials from './verify-credentials';
|
||||
import isStillVerified from './is-still-verified';
|
||||
import refreshToken from './refresh-token';
|
||||
import generateAuthUrl from './generate-auth-url.js';
|
||||
import verifyCredentials from './verify-credentials.js';
|
||||
import isStillVerified from './is-still-verified.js';
|
||||
import refreshToken from './refresh-token.js';
|
||||
|
||||
export default {
|
||||
fields: [
|
||||
{
|
||||
key: 'oAuthRedirectUrl',
|
||||
label: 'OAuth Redirect URL',
|
||||
type: 'string' as const,
|
||||
type: 'string',
|
||||
required: true,
|
||||
readOnly: true,
|
||||
value: '{WEB_APP_URL}/app/gitlab/connections/add',
|
||||
@@ -21,7 +21,7 @@ export default {
|
||||
{
|
||||
key: 'instanceUrl',
|
||||
label: 'Gitlab instance URL',
|
||||
type: 'string' as const,
|
||||
type: 'string',
|
||||
required: false,
|
||||
readOnly: false,
|
||||
value: 'https://gitlab.com',
|
||||
@@ -33,7 +33,7 @@ export default {
|
||||
{
|
||||
key: 'clientId',
|
||||
label: 'Client ID',
|
||||
type: 'string' as const,
|
||||
type: 'string',
|
||||
required: true,
|
||||
readOnly: false,
|
||||
value: null,
|
||||
@@ -45,7 +45,7 @@ export default {
|
||||
{
|
||||
key: 'clientSecret',
|
||||
label: 'Client Secret',
|
||||
type: 'string' as const,
|
||||
type: 'string',
|
||||
required: true,
|
||||
readOnly: false,
|
||||
value: null,
|
@@ -0,0 +1,8 @@
|
||||
import getCurrentUser from '../common/get-current-user.js';
|
||||
|
||||
const isStillVerified = async ($) => {
|
||||
const user = await getCurrentUser($);
|
||||
return !!user.id;
|
||||
};
|
||||
|
||||
export default isStillVerified;
|
@@ -1,9 +0,0 @@
|
||||
import { IGlobalVariable } from '@automatisch/types';
|
||||
import getCurrentUser from '../common/get-current-user';
|
||||
|
||||
const isStillVerified = async ($: IGlobalVariable) => {
|
||||
const user = await getCurrentUser($);
|
||||
return !!user.id;
|
||||
};
|
||||
|
||||
export default isStillVerified;
|
@@ -1,14 +1,13 @@
|
||||
import { IGlobalVariable } from '@automatisch/types';
|
||||
import { URLSearchParams } from 'url';
|
||||
|
||||
const refreshToken = async ($: IGlobalVariable) => {
|
||||
const refreshToken = async ($) => {
|
||||
// ref: https://docs.gitlab.com/ee/api/oauth2.html#authorization-code-flow
|
||||
|
||||
const params = new URLSearchParams({
|
||||
grant_type: 'refresh_token',
|
||||
client_id: $.auth.data.clientId as string,
|
||||
client_secret: $.auth.data.clientSecret as string,
|
||||
refresh_token: $.auth.data.refreshToken as string,
|
||||
client_id: $.auth.data.clientId,
|
||||
client_secret: $.auth.data.clientSecret,
|
||||
refresh_token: $.auth.data.refreshToken,
|
||||
});
|
||||
|
||||
const { data } = await $.http.post('/oauth/token', params.toString());
|
@@ -1,7 +1,6 @@
|
||||
import { IGlobalVariable } from '@automatisch/types';
|
||||
import getCurrentUser from '../common/get-current-user';
|
||||
import getCurrentUser from '../common/get-current-user.js';
|
||||
|
||||
const verifyCredentials = async ($: IGlobalVariable) => {
|
||||
const verifyCredentials = async ($) => {
|
||||
// ref: https://docs.gitlab.com/ee/api/oauth2.html#authorization-code-flow
|
||||
|
||||
const response = await $.http.post(
|
||||
@@ -25,10 +24,7 @@ const verifyCredentials = async ($: IGlobalVariable) => {
|
||||
$.auth.data.accessToken = data.access_token;
|
||||
|
||||
const currentUser = await getCurrentUser($);
|
||||
const screenName = [
|
||||
currentUser.username,
|
||||
$.auth.data.instanceUrl,
|
||||
]
|
||||
const screenName = [currentUser.username, $.auth.data.instanceUrl]
|
||||
.filter(Boolean)
|
||||
.join(' @ ');
|
||||
|
@@ -1,6 +1,4 @@
|
||||
import { TBeforeRequest } from '@automatisch/types';
|
||||
|
||||
const addAuthHeader: TBeforeRequest = ($, requestConfig) => {
|
||||
const addAuthHeader = ($, requestConfig) => {
|
||||
if ($.auth.data?.accessToken) {
|
||||
requestConfig.headers = requestConfig.headers || {};
|
||||
requestConfig.headers.Authorization = `Bearer ${$.auth.data.accessToken}`;
|
13
packages/backend/src/apps/gitlab/common/get-base-url.js
Normal file
13
packages/backend/src/apps/gitlab/common/get-base-url.js
Normal file
@@ -0,0 +1,13 @@
|
||||
const getBaseUrl = ($) => {
|
||||
if ($.auth.data.instanceUrl) {
|
||||
return $.auth.data.instanceUrl;
|
||||
}
|
||||
|
||||
if ($.app.apiBaseUrl) {
|
||||
return $.app.apiBaseUrl;
|
||||
}
|
||||
|
||||
return $.app.baseUrl;
|
||||
};
|
||||
|
||||
export default getBaseUrl;
|
@@ -1,15 +0,0 @@
|
||||
import { IGlobalVariable } from '@automatisch/types';
|
||||
|
||||
const getBaseUrl = ($: IGlobalVariable): string => {
|
||||
if ($.auth.data.instanceUrl) {
|
||||
return $.auth.data.instanceUrl as string;
|
||||
}
|
||||
|
||||
if ($.app.apiBaseUrl) {
|
||||
return $.app.apiBaseUrl;
|
||||
}
|
||||
|
||||
return $.app.baseUrl;
|
||||
};
|
||||
|
||||
export default getBaseUrl;
|
@@ -1,6 +1,4 @@
|
||||
import { IGlobalVariable, IJSONObject } from '@automatisch/types';
|
||||
|
||||
const getCurrentUser = async ($: IGlobalVariable): Promise<IJSONObject> => {
|
||||
const getCurrentUser = async ($) => {
|
||||
// ref: https://docs.gitlab.com/ee/api/users.html#list-current-user
|
||||
|
||||
const response = await $.http.get('/api/v4/user');
|
@@ -1,19 +1,9 @@
|
||||
import { IGlobalVariable, IJSONObject } from '@automatisch/types';
|
||||
import type { AxiosResponse } from 'axios';
|
||||
import parseLinkHeader from '../../../helpers/parse-header-link';
|
||||
import parseLinkHeader from '../../../helpers/parse-header-link.js';
|
||||
|
||||
type TResponse = {
|
||||
data: IJSONObject[];
|
||||
error?: IJSONObject;
|
||||
};
|
||||
|
||||
export default async function paginateAll(
|
||||
$: IGlobalVariable,
|
||||
request: Promise<AxiosResponse>
|
||||
) {
|
||||
export default async function paginateAll($, request) {
|
||||
const response = await request;
|
||||
|
||||
const aggregatedResponse: TResponse = {
|
||||
const aggregatedResponse = {
|
||||
data: [...response.data],
|
||||
};
|
||||
|
11
packages/backend/src/apps/gitlab/common/set-base-url.js
Normal file
11
packages/backend/src/apps/gitlab/common/set-base-url.js
Normal file
@@ -0,0 +1,11 @@
|
||||
const setBaseUrl = ($, requestConfig) => {
|
||||
if ($.auth.data.instanceUrl) {
|
||||
requestConfig.baseURL = $.auth.data.instanceUrl;
|
||||
} else if ($.app.apiBaseUrl) {
|
||||
requestConfig.baseURL = $.app.apiBaseUrl;
|
||||
}
|
||||
|
||||
return requestConfig;
|
||||
};
|
||||
|
||||
export default setBaseUrl;
|
@@ -1,13 +0,0 @@
|
||||
import { TBeforeRequest } from '@automatisch/types';
|
||||
|
||||
const setBaseUrl: TBeforeRequest = ($, requestConfig) => {
|
||||
if ($.auth.data.instanceUrl) {
|
||||
requestConfig.baseURL = $.auth.data.instanceUrl as string;
|
||||
} else if ($.app.apiBaseUrl) {
|
||||
requestConfig.baseURL = $.app.apiBaseUrl as string;
|
||||
}
|
||||
|
||||
return requestConfig;
|
||||
};
|
||||
|
||||
export default setBaseUrl;
|
3
packages/backend/src/apps/gitlab/dynamic-data/index.js
Normal file
3
packages/backend/src/apps/gitlab/dynamic-data/index.js
Normal file
@@ -0,0 +1,3 @@
|
||||
import listProjects from './list-projects/index.js';
|
||||
|
||||
export default [listProjects];
|
@@ -1,3 +0,0 @@
|
||||
import listProjects from './list-projects';
|
||||
|
||||
export default [listProjects];
|
@@ -1,11 +1,10 @@
|
||||
import { IGlobalVariable } from '@automatisch/types';
|
||||
import paginateAll from '../../common/paginate-all';
|
||||
import paginateAll from '../../common/paginate-all.js';
|
||||
|
||||
export default {
|
||||
name: 'List projects',
|
||||
key: 'listProjects',
|
||||
|
||||
async run($: IGlobalVariable) {
|
||||
async run($) {
|
||||
// ref:
|
||||
// - https://docs.gitlab.com/ee/api/projects.html#list-all-projects
|
||||
// - https://docs.gitlab.com/ee/api/rest/index.html#keyset-based-pagination
|
||||
@@ -21,7 +20,7 @@ export default {
|
||||
|
||||
const response = await paginateAll($, firstPageRequest);
|
||||
|
||||
response.data = response.data.map((repo: { name: string; id: number }) => {
|
||||
response.data = response.data.map((repo) => {
|
||||
return {
|
||||
value: repo.id,
|
||||
name: repo.name,
|
1
packages/backend/src/apps/gitlab/index.d.ts
vendored
1
packages/backend/src/apps/gitlab/index.d.ts
vendored
@@ -1 +0,0 @@
|
||||
|
@@ -1,9 +1,9 @@
|
||||
import defineApp from '../../helpers/define-app';
|
||||
import addAuthHeader from './common/add-auth-header';
|
||||
import setBaseUrl from './common/set-base-url';
|
||||
import auth from './auth';
|
||||
import triggers from './triggers';
|
||||
import dynamicData from './dynamic-data';
|
||||
import defineApp from '../../helpers/define-app.js';
|
||||
import addAuthHeader from './common/add-auth-header.js';
|
||||
import setBaseUrl from './common/set-base-url.js';
|
||||
import auth from './auth/index.js';
|
||||
import triggers from './triggers/index.js';
|
||||
import dynamicData from './dynamic-data/index.js';
|
||||
|
||||
export default defineApp({
|
||||
name: 'GitLab',
|
@@ -1,18 +1,17 @@
|
||||
import { IRawTrigger } from '@automatisch/types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger.js';
|
||||
import { GITLAB_EVENT_TYPE } from '../types.js';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
} from '../lib';
|
||||
} from '../lib.js';
|
||||
|
||||
// confidential_issues_events has the same event data as issues_events
|
||||
import data from './issue_event';
|
||||
import data from './issue_event.js';
|
||||
|
||||
export const triggerDescriptor: IRawTrigger = {
|
||||
export const triggerDescriptor = {
|
||||
name: 'Confidential issue event',
|
||||
description:
|
||||
'Confidential issue event (triggered when a new confidential issue is created or an existing issue is updated, closed, or reopened)',
|
@@ -1,18 +1,17 @@
|
||||
import { IRawTrigger } from '@automatisch/types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger.js';
|
||||
import { GITLAB_EVENT_TYPE } from '../types.js';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
} from '../lib';
|
||||
} from '../lib.js';
|
||||
|
||||
// confidential_note_events has the same event data as note_events
|
||||
import data from './note_event';
|
||||
import data from './note_event.js';
|
||||
|
||||
export const triggerDescriptor: IRawTrigger = {
|
||||
export const triggerDescriptor = {
|
||||
name: 'Confidential comment event',
|
||||
description:
|
||||
'Confidential comment event (triggered when a new confidential comment is made on commits, merge requests, issues, and code snippets)',
|
@@ -1,17 +1,16 @@
|
||||
import { IRawTrigger } from '@automatisch/types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger.js';
|
||||
import { GITLAB_EVENT_TYPE } from '../types.js';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
} from '../lib';
|
||||
} from '../lib.js';
|
||||
|
||||
import data from './deployment_event';
|
||||
import data from './deployment_event.js';
|
||||
|
||||
export const triggerDescriptor: IRawTrigger = {
|
||||
export const triggerDescriptor = {
|
||||
name: 'Deployment event',
|
||||
description:
|
||||
'Deployment event (triggered when a deployment starts, succeeds, fails or is canceled)',
|
@@ -1,17 +1,16 @@
|
||||
import { IRawTrigger } from '@automatisch/types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger.js';
|
||||
import { GITLAB_EVENT_TYPE } from '../types.js';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
} from '../lib';
|
||||
} from '../lib.js';
|
||||
|
||||
import data from './feature_flag_event';
|
||||
import data from './feature_flag_event.js';
|
||||
|
||||
export const triggerDescriptor: IRawTrigger = {
|
||||
export const triggerDescriptor = {
|
||||
name: 'Feature flag event',
|
||||
description:
|
||||
'Feature flag event (triggered when a feature flag is turned on or off)',
|
29
packages/backend/src/apps/gitlab/triggers/index.js
Normal file
29
packages/backend/src/apps/gitlab/triggers/index.js
Normal file
@@ -0,0 +1,29 @@
|
||||
import confidentialIssueEvent from './confidential-issue-event/index.js';
|
||||
import confidentialNoteEvent from './confidential-note-event/index.js';
|
||||
import deploymentEvent from './deployment-event/index.js';
|
||||
import featureFlagEvent from './feature-flag-event/index.js';
|
||||
import issueEvent from './issue-event/index.js';
|
||||
import jobEvent from './job-event/index.js';
|
||||
import mergeRequestEvent from './merge-request-event/index.js';
|
||||
import noteEvent from './note-event/index.js';
|
||||
import pipelineEvent from './pipeline-event/index.js';
|
||||
import pushEvent from './push-event/index.js';
|
||||
import releaseEvent from './release-event/index.js';
|
||||
import tagPushEvent from './tag-push-event/index.js';
|
||||
import wikiPageEvent from './wiki-page-event/index.js';
|
||||
|
||||
export default [
|
||||
confidentialIssueEvent,
|
||||
confidentialNoteEvent,
|
||||
deploymentEvent,
|
||||
featureFlagEvent,
|
||||
issueEvent,
|
||||
jobEvent,
|
||||
mergeRequestEvent,
|
||||
noteEvent,
|
||||
pipelineEvent,
|
||||
pushEvent,
|
||||
releaseEvent,
|
||||
tagPushEvent,
|
||||
wikiPageEvent,
|
||||
];
|
@@ -1,29 +0,0 @@
|
||||
import confidentialIssueEvent from './confidential-issue-event';
|
||||
import confidentialNoteEvent from './confidential-note-event';
|
||||
import deploymentEvent from './deployment-event';
|
||||
import featureFlagEvent from './feature-flag-event';
|
||||
import issueEvent from './issue-event';
|
||||
import jobEvent from './job-event';
|
||||
import mergeRequestEvent from './merge-request-event';
|
||||
import noteEvent from './note-event';
|
||||
import pipelineEvent from './pipeline-event';
|
||||
import pushEvent from './push-event';
|
||||
import releaseEvent from './release-event';
|
||||
import tagPushEvent from './tag-push-event';
|
||||
import wikiPageEvent from './wiki-page-event';
|
||||
|
||||
export default [
|
||||
confidentialIssueEvent,
|
||||
confidentialNoteEvent,
|
||||
deploymentEvent,
|
||||
featureFlagEvent,
|
||||
issueEvent,
|
||||
jobEvent,
|
||||
mergeRequestEvent,
|
||||
noteEvent,
|
||||
pipelineEvent,
|
||||
pushEvent,
|
||||
releaseEvent,
|
||||
tagPushEvent,
|
||||
wikiPageEvent,
|
||||
];
|
@@ -1,17 +1,16 @@
|
||||
import { IRawTrigger } from '@automatisch/types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger.js';
|
||||
import { GITLAB_EVENT_TYPE } from '../types.js';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
} from '../lib';
|
||||
} from '../lib.js';
|
||||
|
||||
import data from './issue_event';
|
||||
import data from './issue_event.js';
|
||||
|
||||
export const triggerDescriptor: IRawTrigger = {
|
||||
export const triggerDescriptor = {
|
||||
name: 'Issue event',
|
||||
description:
|
||||
'Issue event (triggered when a new issue is created or an existing issue is updated, closed, or reopened)',
|
@@ -1,17 +1,16 @@
|
||||
import { IRawTrigger } from '@automatisch/types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger.js';
|
||||
import { GITLAB_EVENT_TYPE } from '../types.js';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
} from '../lib';
|
||||
} from '../lib.js';
|
||||
|
||||
import data from './job_event';
|
||||
import data from './job_event.js';
|
||||
|
||||
export const triggerDescriptor: IRawTrigger = {
|
||||
export const triggerDescriptor = {
|
||||
name: 'Job event',
|
||||
description: 'Job event (triggered when the status of a job changes)',
|
||||
// info: 'https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#job-events',
|
94
packages/backend/src/apps/gitlab/triggers/lib.js
Normal file
94
packages/backend/src/apps/gitlab/triggers/lib.js
Normal file
@@ -0,0 +1,94 @@
|
||||
import Crypto from 'crypto';
|
||||
import appConfig from '../../../config/app.js';
|
||||
|
||||
export const projectArgumentDescriptor = {
|
||||
label: 'Project',
|
||||
key: 'projectId',
|
||||
type: 'dropdown',
|
||||
required: true,
|
||||
description: 'Pick a project to receive events from',
|
||||
variables: false,
|
||||
source: {
|
||||
type: 'query',
|
||||
name: 'getDynamicData',
|
||||
arguments: [
|
||||
{
|
||||
name: 'key',
|
||||
value: 'listProjects',
|
||||
},
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
export const getRunFn = async ($) => {
|
||||
const dataItem = {
|
||||
raw: $.request.body,
|
||||
meta: {
|
||||
internalId: Crypto.randomUUID(),
|
||||
},
|
||||
};
|
||||
|
||||
$.pushTriggerItem(dataItem);
|
||||
};
|
||||
|
||||
export const getTestRunFn = (eventData) => ($) => {
|
||||
/*
|
||||
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) => async ($) => {
|
||||
// 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)
|
||||
) {
|
||||
subscriptionPayload.branch_filter_strategy =
|
||||
$.step.parameters.branch_filter_strategy;
|
||||
subscriptionPayload.push_events_branch_filter =
|
||||
$.step.parameters.push_events_branch_filter;
|
||||
}
|
||||
|
||||
const { data } = await $.http.post(
|
||||
`/api/v4/projects/${$.step.parameters.projectId}/hooks`,
|
||||
subscriptionPayload
|
||||
);
|
||||
|
||||
await $.flow.setRemoteWebhookId(data.id.toString());
|
||||
};
|
||||
|
||||
export const unregisterHook = async ($) => {
|
||||
// ref: https://docs.gitlab.com/ee/api/projects.html#delete-project-hook
|
||||
await $.http.delete(
|
||||
`/api/v4/projects/${$.step.parameters.projectId}/hooks/${$.flow.remoteWebhookId}`
|
||||
);
|
||||
};
|
@@ -1,100 +0,0 @@
|
||||
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 getRunFn = async ($: IGlobalVariable) => {
|
||||
const dataItem = {
|
||||
raw: $.request.body,
|
||||
meta: {
|
||||
internalId: Crypto.randomUUID(),
|
||||
},
|
||||
};
|
||||
|
||||
$.pushTriggerItem(dataItem);
|
||||
};
|
||||
|
||||
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}`
|
||||
);
|
||||
};
|
@@ -1,17 +1,16 @@
|
||||
import { IRawTrigger } from '@automatisch/types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger.js';
|
||||
import { GITLAB_EVENT_TYPE } from '../types.js';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
} from '../lib';
|
||||
} from '../lib.js';
|
||||
|
||||
import data from './merge_request_event';
|
||||
import data from './merge_request_event.js';
|
||||
|
||||
export const triggerDescriptor: IRawTrigger = {
|
||||
export const triggerDescriptor = {
|
||||
name: 'Merge request event',
|
||||
description:
|
||||
'Merge request event (triggered when merge request is created, updated, or closed)',
|
@@ -1,17 +1,16 @@
|
||||
import { IRawTrigger } from '@automatisch/types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger.js';
|
||||
import { GITLAB_EVENT_TYPE } from '../types.js';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
} from '../lib';
|
||||
} from '../lib.js';
|
||||
|
||||
import data from './note_event';
|
||||
import data from './note_event.js';
|
||||
|
||||
export const triggerDescriptor: IRawTrigger = {
|
||||
export const triggerDescriptor = {
|
||||
name: 'Comment event',
|
||||
description:
|
||||
'Comment event (triggered when a new comment is made on commits, merge requests, issues, and code snippets)',
|
@@ -1,17 +1,16 @@
|
||||
import { IRawTrigger } from '@automatisch/types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger.js';
|
||||
import { GITLAB_EVENT_TYPE } from '../types.js';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
} from '../lib';
|
||||
} from '../lib.js';
|
||||
|
||||
import data from './pipeline_event';
|
||||
import data from './pipeline_event.js';
|
||||
|
||||
export const triggerDescriptor: IRawTrigger = {
|
||||
export const triggerDescriptor = {
|
||||
name: 'Pipeline event',
|
||||
description:
|
||||
'Pipeline event (triggered when the status of a pipeline changes)',
|
@@ -1,20 +1,19 @@
|
||||
import { IRawTrigger } from '@automatisch/types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger.js';
|
||||
import { GITLAB_EVENT_TYPE } from '../types.js';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
} from '../lib';
|
||||
} from '../lib.js';
|
||||
|
||||
import data from './push_event';
|
||||
import data from './push_event.js';
|
||||
|
||||
export const branchFilterStrategyArgumentDescriptor = {
|
||||
label: 'What type of filter to use?',
|
||||
key: 'branch_filter_strategy',
|
||||
type: 'dropdown' as const,
|
||||
type: 'dropdown',
|
||||
description: 'Defaults to including all branches',
|
||||
required: true,
|
||||
variables: false,
|
||||
@@ -39,12 +38,12 @@ export const pushEventsBranchFilterArgumentDescriptor = {
|
||||
label: 'Filter value',
|
||||
key: 'push_events_branch_filter',
|
||||
description: 'Leave empty when using "all branches"',
|
||||
type: 'string' as const,
|
||||
type: 'string',
|
||||
required: false,
|
||||
variables: false,
|
||||
};
|
||||
|
||||
export const triggerDescriptor: IRawTrigger = {
|
||||
export const triggerDescriptor = {
|
||||
name: 'Push event',
|
||||
description: 'Push event (triggered when you push to the repository)',
|
||||
// info: 'https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#push-events',
|
@@ -1,17 +1,16 @@
|
||||
import { IRawTrigger } from '@automatisch/types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger.js';
|
||||
import { GITLAB_EVENT_TYPE } from '../types.js';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
} from '../lib';
|
||||
} from '../lib.js';
|
||||
|
||||
import data from './release_event';
|
||||
import data from './release_event.js';
|
||||
|
||||
export const triggerDescriptor: IRawTrigger = {
|
||||
export const triggerDescriptor = {
|
||||
name: 'Release event',
|
||||
description: 'Release event (triggered when a release is created or updated)',
|
||||
// info: 'https://docs.gitlab.com/ee/user/project/integrations/webhook_events.html#release-events',
|
@@ -1,17 +1,16 @@
|
||||
import { IRawTrigger } from '@automatisch/types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger.js';
|
||||
import { GITLAB_EVENT_TYPE } from '../types.js';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
} from '../lib';
|
||||
} from '../lib.js';
|
||||
|
||||
import data from './tag_push_event';
|
||||
import data from './tag_push_event.js';
|
||||
|
||||
export const triggerDescriptor: IRawTrigger = {
|
||||
export const triggerDescriptor = {
|
||||
name: 'Tag event',
|
||||
description:
|
||||
'Tag event (triggered when you create or delete tags in the repository)',
|
15
packages/backend/src/apps/gitlab/triggers/types.js
Normal file
15
packages/backend/src/apps/gitlab/triggers/types.js
Normal file
@@ -0,0 +1,15 @@
|
||||
export const GITLAB_EVENT_TYPE = {
|
||||
confidential_issues_events: 'confidential_issues_events',
|
||||
confidential_note_events: 'confidential_note_events',
|
||||
deployment_events: 'deployment_events',
|
||||
feature_flag_events: 'feature_flag_events',
|
||||
issues_events: 'issues_events',
|
||||
job_events: 'job_events',
|
||||
merge_requests_events: 'merge_requests_events',
|
||||
note_events: 'note_events',
|
||||
pipeline_events: 'pipeline_events',
|
||||
push_events: 'push_events',
|
||||
releases_events: 'releases_events',
|
||||
tag_push_events: 'tag_push_events',
|
||||
wiki_page_events: 'wiki_page_events',
|
||||
};
|
@@ -1,24 +0,0 @@
|
||||
export enum GITLAB_EVENT_TYPE {
|
||||
// ref: https://docs.gitlab.com/ee/api/projects.html#add-project-hook
|
||||
confidential_issues_events = 'confidential_issues_events',
|
||||
confidential_note_events = 'confidential_note_events',
|
||||
deployment_events = 'deployment_events',
|
||||
feature_flag_events = 'feature_flag_events',
|
||||
issues_events = 'issues_events',
|
||||
job_events = 'job_events',
|
||||
merge_requests_events = 'merge_requests_events',
|
||||
note_events = 'note_events',
|
||||
pipeline_events = 'pipeline_events',
|
||||
push_events = 'push_events',
|
||||
releases_events = 'releases_events',
|
||||
tag_push_events = 'tag_push_events',
|
||||
wiki_page_events = 'wiki_page_events',
|
||||
}
|
||||
|
||||
export type EventDescriptor = {
|
||||
name: string;
|
||||
description: string;
|
||||
info?: string;
|
||||
type: GITLAB_EVENT_TYPE;
|
||||
data: any;
|
||||
};
|
@@ -1,17 +1,16 @@
|
||||
import { IRawTrigger } from '@automatisch/types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger';
|
||||
import { GITLAB_EVENT_TYPE } from '../types';
|
||||
import defineTrigger from '../../../../helpers/define-trigger.js';
|
||||
import { GITLAB_EVENT_TYPE } from '../types.js';
|
||||
import {
|
||||
getRegisterHookFn,
|
||||
getRunFn,
|
||||
getTestRunFn,
|
||||
projectArgumentDescriptor,
|
||||
unregisterHook,
|
||||
} from '../lib';
|
||||
} from '../lib.js';
|
||||
|
||||
import data from './wiki_page_event';
|
||||
import data from './wiki_page_event.js';
|
||||
|
||||
export const triggerDescriptor: IRawTrigger = {
|
||||
export const triggerDescriptor = {
|
||||
name: 'Wiki page event',
|
||||
description:
|
||||
'Wiki page event (triggered when a wiki page is created, updated, or deleted)',
|
Reference in New Issue
Block a user