From 97f88d6c4afd79c85d4df72d8e438f6cc526d0c5 Mon Sep 17 00:00:00 2001 From: Ali BARIN Date: Thu, 20 Oct 2022 20:44:02 +0200 Subject: [PATCH] feat(github): add new pull requests trigger --- .../github/triggers/new-issues/new-issues.ts | 6 +- .../triggers/new-pull-requests/index.ts | 46 +++++++++++++ .../new-pull-requests/new-pull-requests.ts | 66 +++++++++++++++++++ 3 files changed, 115 insertions(+), 3 deletions(-) create mode 100644 packages/backend/src/apps/github/triggers/new-pull-requests/index.ts create mode 100644 packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.ts diff --git a/packages/backend/src/apps/github/triggers/new-issues/new-issues.ts b/packages/backend/src/apps/github/triggers/new-issues/new-issues.ts index 712571f0..ca0d5eee 100644 --- a/packages/backend/src/apps/github/triggers/new-issues/new-issues.ts +++ b/packages/backend/src/apps/github/triggers/new-issues/new-issues.ts @@ -42,14 +42,14 @@ const newIssues = async ($: IGlobalVariable) => { if (response.data.length) { for (const issue of response.data) { - const issueId = issue.id.toString(); + const issueId = issue.id; - if (issueId <= $.flow.lastInternalId && !$.execution.testRun) return issues; + if (issueId <= Number($.flow.lastInternalId) && !$.execution.testRun) return issues; const dataItem = { raw: issue, meta: { - internalId: issueId, + internalId: issueId.toString(), }, }; diff --git a/packages/backend/src/apps/github/triggers/new-pull-requests/index.ts b/packages/backend/src/apps/github/triggers/new-pull-requests/index.ts new file mode 100644 index 00000000..828b4fce --- /dev/null +++ b/packages/backend/src/apps/github/triggers/new-pull-requests/index.ts @@ -0,0 +1,46 @@ +import defineTrigger from '../../../../helpers/define-trigger'; +import newPullRequests from './new-pull-requests'; + +export default defineTrigger({ + name: 'New pull requests', + key: 'newPullRequests', + pollInterval: 15, + description: 'Triggers when a new pull request is created', + substeps: [ + { + key: 'chooseConnection', + name: 'Choose connection' + }, + { + key: 'chooseTrigger', + name: 'Set up a trigger', + arguments: [ + { + label: 'Repo', + key: 'repo', + type: 'dropdown', + required: true, + variables: false, + source: { + type: 'query', + name: 'getData', + arguments: [ + { + name: 'key', + value: 'listRepos' + } + ] + } + } + ] + }, + { + key: 'testStep', + name: 'Test trigger' + } + ], + + async run($) { + return await newPullRequests($); + }, +}); diff --git a/packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.ts b/packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.ts new file mode 100644 index 00000000..03c168d2 --- /dev/null +++ b/packages/backend/src/apps/github/triggers/new-pull-requests/new-pull-requests.ts @@ -0,0 +1,66 @@ +import { + IGlobalVariable, + ITriggerOutput, +} from '@automatisch/types'; +import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo'; +import parseLinkHeader from '../../../../helpers/parse-header-link'; + +const fetchPullRequests = async ($: IGlobalVariable) => { + const repoParameter = $.step.parameters.repo as string; + + if (!repoParameter) throw new Error('A repo must be set!'); + + const { repoOwner, repo } = getRepoOwnerAndRepo(repoParameter); + + const pathname = `/repos/${repoOwner}/${repo}/pulls`; + const params = { + state: 'all', + sort: 'created', + direction: 'desc', + per_page: 100, + }; + + const pullRequests: ITriggerOutput = { + data: [], + }; + + let links; + do { + const response = await $.http.get(pathname, { params }); + links = parseLinkHeader(response.headers.link); + + if (response.integrationError) { + pullRequests.error = response.integrationError; + return pullRequests; + } + + if (response.data.length) { + for (const pullRequest of response.data) { + const pullRequestId = pullRequest.id; + + if (pullRequestId <= Number($.flow.lastInternalId) && !$.execution.testRun) return pullRequests; + + const dataItem = { + raw: pullRequest, + meta: { + internalId: pullRequestId.toString(), + }, + }; + + pullRequests.data.push(dataItem); + } + } + } while (links.next && !$.execution.testRun); + + return pullRequests; +} + +const newPullRequests = async ($: IGlobalVariable) => { + const pullRequests = await fetchPullRequests($); + + pullRequests.data.reverse(); + + return pullRequests; +}; + +export default newPullRequests;