diff --git a/packages/backend/src/apps/github/info.json b/packages/backend/src/apps/github/info.json index 215dd9db..bdb3659a 100644 --- a/packages/backend/src/apps/github/info.json +++ b/packages/backend/src/apps/github/info.json @@ -560,6 +560,45 @@ "name": "Test trigger" } ] + }, + { + "name": "New release", + "key": "newRelease", + "interval": "15m", + "description": "Triggers when a new release is created", + "substeps": [ + { + "key": "chooseAccount", + "name": "Choose account" + }, + { + "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" + } + ] } ] } diff --git a/packages/backend/src/apps/github/triggers.ts b/packages/backend/src/apps/github/triggers.ts index e8246764..55b8efbf 100644 --- a/packages/backend/src/apps/github/triggers.ts +++ b/packages/backend/src/apps/github/triggers.ts @@ -9,6 +9,7 @@ import NewMilestone from './triggers/new-milestone'; import NewCommitComment from './triggers/new-commit-comment'; import NewLabel from './triggers/new-label'; import NewCollaborator from './triggers/new-collaborator'; +import NewRelease from './triggers/new-release'; export default class Triggers { newRepository: NewRepository; @@ -21,6 +22,7 @@ export default class Triggers { newCommitComment: NewCommitComment; newLabel: NewLabel; newCollaborator: NewCollaborator; + newRelease: NewRelease; constructor(connectionData: IJSONObject, parameters: IJSONObject) { this.newRepository = new NewRepository(connectionData); @@ -33,5 +35,6 @@ export default class Triggers { this.newCommitComment = new NewCommitComment(connectionData, parameters); this.newLabel = new NewLabel(connectionData, parameters); this.newCollaborator = new NewCollaborator(connectionData, parameters); + this.newRelease = new NewRelease(connectionData, parameters); } } diff --git a/packages/backend/src/apps/github/triggers/new-release.ts b/packages/backend/src/apps/github/triggers/new-release.ts new file mode 100644 index 00000000..1c5fb1f5 --- /dev/null +++ b/packages/backend/src/apps/github/triggers/new-release.ts @@ -0,0 +1,62 @@ +import { Octokit } from 'octokit'; +import { DateTime } from 'luxon'; +import { IJSONObject } from '@automatisch/types'; + +export default class NewRelease { + client?: Octokit; + repoOwner?: string; + repo?: string; + + constructor(connectionData: IJSONObject, parameters: IJSONObject) { + if (connectionData.accessToken) { + this.client = new Octokit({ + auth: connectionData.accessToken as string, + }); + } + + if (parameters?.repo) { + const [owner, repo] = (parameters.repo as string).split('/'); + + this.repoOwner = 'facebook' || owner; + this.repo = 'react' || repo; + } + } + + get options() { + return { + owner: this.repoOwner, + repo: this.repo, + }; + } + + async run(startTime: Date) { + const iterator = await this.client.paginate.iterator(this.client.rest.repos.listReleases, this.options); + const newReleases = []; + + const startTimeDateObject = DateTime.fromJSDate(startTime); + + releaseIterator: + for await (const { data: releases } of iterator) { + for (const release of releases) { + const createdAtDateObject = DateTime.fromISO(release.created_at); + + if (createdAtDateObject < startTimeDateObject) { + break releaseIterator; + } + + newReleases.push(release); + } + } + + return newReleases; + } + + async testRun() { + const options = { + ...this.options, + per_page: 1, + }; + + return (await this.client.rest.repos.listReleases(options)).data; + } +}