From 69ae448d648feaa6558366381f0859ca4243dd7e Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Sat, 7 May 2022 20:47:02 +0200 Subject: [PATCH] feat: new find project merge requests action in GitLab --- packages/backend/src/apps/gitlab/actions.ts | 13 ++++ .../actions/find-project-merge-requests.ts | 35 +++++++++ packages/backend/src/apps/gitlab/data.ts | 10 +++ .../src/apps/gitlab/data/list-projects.ts | 26 +++++++ packages/backend/src/apps/gitlab/index.ts | 14 +++- packages/backend/src/apps/gitlab/info.json | 71 +++++++++++++++++++ packages/backend/src/graphql/schema.graphql | 6 ++ packages/web/src/graphql/queries/get-apps.ts | 4 ++ 8 files changed, 177 insertions(+), 2 deletions(-) create mode 100644 packages/backend/src/apps/gitlab/actions.ts create mode 100644 packages/backend/src/apps/gitlab/actions/find-project-merge-requests.ts create mode 100644 packages/backend/src/apps/gitlab/data.ts create mode 100644 packages/backend/src/apps/gitlab/data/list-projects.ts diff --git a/packages/backend/src/apps/gitlab/actions.ts b/packages/backend/src/apps/gitlab/actions.ts new file mode 100644 index 00000000..2f2828be --- /dev/null +++ b/packages/backend/src/apps/gitlab/actions.ts @@ -0,0 +1,13 @@ +import { IJSONObject } from '@automatisch/types'; +import FindProjectMergeRequests from './actions/find-project-merge-requests'; + +export default class Actions { + findProjectMergeRequests: FindProjectMergeRequests; + + constructor(connectionData: IJSONObject, parameters: IJSONObject) { + this.findProjectMergeRequests = new FindProjectMergeRequests( + connectionData, + parameters + ); + } +} diff --git a/packages/backend/src/apps/gitlab/actions/find-project-merge-requests.ts b/packages/backend/src/apps/gitlab/actions/find-project-merge-requests.ts new file mode 100644 index 00000000..b3ef46b7 --- /dev/null +++ b/packages/backend/src/apps/gitlab/actions/find-project-merge-requests.ts @@ -0,0 +1,35 @@ +import { Gitlab } from '@gitbeaker/node'; +import { IJSONObject } from '@automatisch/types'; + +export default class FindProjectMergeRequests { + client: any; + projectId: number; + state: string; + + constructor(connectionData: IJSONObject, parameters: IJSONObject) { + if (connectionData?.accessToken) { + this.client = new Gitlab({ + host: `https://${connectionData.host}`, + oauthToken: connectionData?.accessToken as string, + }); + } + + if (parameters.project) { + this.projectId = parameters.project as number; + } + + if (parameters.state) { + this.state = parameters.state as string; + } + } + + async run() { + const mergeRequests = await this.client.MergeRequests.all({ + state: this.state, + projectId: this.projectId, + maxPages: 1, + }); + + return { data: mergeRequests }; + } +} diff --git a/packages/backend/src/apps/gitlab/data.ts b/packages/backend/src/apps/gitlab/data.ts new file mode 100644 index 00000000..5505f0cb --- /dev/null +++ b/packages/backend/src/apps/gitlab/data.ts @@ -0,0 +1,10 @@ +import { IJSONObject } from '@automatisch/types'; +import ListProjects from './data/list-projects'; + +export default class Data { + listProjects: ListProjects; + + constructor(connectionData: IJSONObject, parameters?: IJSONObject) { + this.listProjects = new ListProjects(connectionData, parameters); + } +} diff --git a/packages/backend/src/apps/gitlab/data/list-projects.ts b/packages/backend/src/apps/gitlab/data/list-projects.ts new file mode 100644 index 00000000..75237e0f --- /dev/null +++ b/packages/backend/src/apps/gitlab/data/list-projects.ts @@ -0,0 +1,26 @@ +import { Gitlab } from '@gitbeaker/node'; +import type { IJSONObject } from '@automatisch/types'; + +export default class ListProjects { + client?: any; + + constructor(connectionData: IJSONObject, parameters?: IJSONObject) { + if (connectionData?.accessToken) { + this.client = new Gitlab({ + host: `https://${connectionData.host}`, + oauthToken: connectionData?.accessToken as string, + }); + } + } + + async run() { + const projects = await this.client.Projects.all({ + membership: true, + }); + + return projects.map((project: any) => ({ + value: project.id, + name: project.name_with_namespace, + })); + } +} diff --git a/packages/backend/src/apps/gitlab/index.ts b/packages/backend/src/apps/gitlab/index.ts index 592ea6e9..efff8e9c 100644 --- a/packages/backend/src/apps/gitlab/index.ts +++ b/packages/backend/src/apps/gitlab/index.ts @@ -1,15 +1,25 @@ -import Authentication from './authentication'; import { IService, IAuthentication, IApp, IJSONObject, } from '@automatisch/types'; +import Authentication from './authentication'; +import Actions from './actions'; +import Data from './data'; export default class Gitlab implements IService { authenticationClient: IAuthentication; + actions: Actions; + data: Data; - constructor(appData: IApp, connectionData: IJSONObject) { + constructor( + appData: IApp, + connectionData: IJSONObject, + parameters: IJSONObject + ) { this.authenticationClient = new Authentication(appData, connectionData); + this.actions = new Actions(connectionData, parameters); + this.data = new Data(connectionData, parameters); } } diff --git a/packages/backend/src/apps/gitlab/info.json b/packages/backend/src/apps/gitlab/info.json index 82a2696d..9defc807 100644 --- a/packages/backend/src/apps/gitlab/info.json +++ b/packages/backend/src/apps/gitlab/info.json @@ -234,5 +234,76 @@ } ] } + ], + "actions": [ + { + "name": "Find project merge requests", + "key": "findProjectMergeRequests", + "description": "Find merge requests for a project.", + "substeps": [ + { + "key": "chooseAccount", + "name": "Choose account" + }, + { + "key": "setupAction", + "name": "Set up action", + "arguments": [ + { + "label": "Project", + "key": "project", + "type": "dropdown", + "required": true, + "description": "Search for merge requests in this project.", + "variables": false, + "source": { + "type": "query", + "name": "getData", + "arguments": [ + { + "name": "key", + "value": "listProjects" + } + ] + } + }, + { + "label": "State", + "key": "state", + "type": "dropdown", + "required": true, + "description": "Filter merge requests by their state.", + "variables": false, + "options": [ + { + "label": "All", + "value": "all" + }, + { + "label": "Opened", + "value": "opened" + }, + { + "label": "Closed", + "value": "closed" + }, + { + "label": "Locked", + "value": "locked" + }, + { + "label": "Merged", + "value": "merged" + } + ] + } + ] + }, + { + "key": "testStep", + "name": "Test action" + } + ] + } ] } diff --git a/packages/backend/src/graphql/schema.graphql b/packages/backend/src/graphql/schema.graphql index 1a44fdaf..bfc1e64f 100644 --- a/packages/backend/src/graphql/schema.graphql +++ b/packages/backend/src/graphql/schema.graphql @@ -68,6 +68,7 @@ type ActionSubstepArgument { variables: Boolean source: ActionSubstepArgumentSource dependsOn: [String] + options: [TriggerSubstepArgumentOption] } type ActionSubstepArgumentSource { @@ -76,6 +77,11 @@ type ActionSubstepArgumentSource { arguments: [ActionSubstepArgumentSourceArgument] } +type TriggerSubstepArgumentOption { + label: String + value: JSONObject +} + type ActionSubstepArgumentSourceArgument { name: String value: String diff --git a/packages/web/src/graphql/queries/get-apps.ts b/packages/web/src/graphql/queries/get-apps.ts index 8e91cecf..1f694aef 100644 --- a/packages/web/src/graphql/queries/get-apps.ts +++ b/packages/web/src/graphql/queries/get-apps.ts @@ -94,6 +94,10 @@ export const GET_APPS = gql` description variables dependsOn + options { + label + value + } source { type name