diff --git a/packages/backend/src/apps/gitea/dynamic-data/index.js b/packages/backend/src/apps/gitea/dynamic-data/index.js index 94a7b7c7..04afcbdd 100644 --- a/packages/backend/src/apps/gitea/dynamic-data/index.js +++ b/packages/backend/src/apps/gitea/dynamic-data/index.js @@ -1,3 +1,4 @@ +import listLabels from './list-labels/index.js'; import listRepos from './list-repos/index.js'; -export default [listRepos]; +export default [listLabels, listRepos]; diff --git a/packages/backend/src/apps/gitea/dynamic-data/list-labels/index.js b/packages/backend/src/apps/gitea/dynamic-data/list-labels/index.js new file mode 100644 index 00000000..4c950f16 --- /dev/null +++ b/packages/backend/src/apps/gitea/dynamic-data/list-labels/index.js @@ -0,0 +1,40 @@ +export default { + name: 'List labels', + key: 'listLabels', + + async run($) { + const labels = { + data: [], + }; + const repoOwner = $.auth.data.repoOwner; + const repo = $.step.parameters.repo; + + const params = { + page: 1, + limit: 100, + }; + + let totalCount; + let totalRequestedCount; + do { + const { data, headers } = await $.http.get( + `/repos/${repoOwner}/${repo}/labels`, + { params } + ); + params.page = params.page + 1; + totalCount = Number(headers['x-total-count']); + totalRequestedCount = params.page * params.limit; + + if (data?.length) { + for (const label of data) { + labels.data.push({ + value: label.name, + name: label.name, + }); + } + } + } while (totalRequestedCount <= totalCount); + + return labels; + }, +}; diff --git a/packages/backend/src/apps/gitea/triggers/index.js b/packages/backend/src/apps/gitea/triggers/index.js index 0bda049e..8304c0d9 100644 --- a/packages/backend/src/apps/gitea/triggers/index.js +++ b/packages/backend/src/apps/gitea/triggers/index.js @@ -1,4 +1,5 @@ +import newIssues from './new-issues/index.js'; import newStargazers from './new-stargazers/index.js'; import newWatchers from './new-watchers/index.js'; -export default [newStargazers, newWatchers]; +export default [newIssues, newStargazers, newWatchers]; diff --git a/packages/backend/src/apps/gitea/triggers/new-issues/index.js b/packages/backend/src/apps/gitea/triggers/new-issues/index.js new file mode 100644 index 00000000..10085eec --- /dev/null +++ b/packages/backend/src/apps/gitea/triggers/new-issues/index.js @@ -0,0 +1,121 @@ +import defineTrigger from '../../../../helpers/define-trigger.js'; + +export default defineTrigger({ + name: 'New issues', + key: 'newIssues', + pollInterval: 15, + description: 'Triggers when a new issue is created.', + arguments: [ + { + label: 'Repo', + key: 'repo', + type: 'dropdown', + required: true, + variables: true, + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listRepos', + }, + ], + }, + }, + { + label: 'Which types of issues should this trigger on?', + key: 'issueType', + type: 'dropdown', + description: 'Defaults to any issue you can see.', + required: true, + variables: true, + value: 'all', + options: [ + { + label: 'Closed', + value: 'closed', + }, + { + label: 'Open', + value: 'open', + }, + { + label: 'All', + value: 'all', + }, + ], + }, + { + label: 'Labels', + key: 'labels', + type: 'dynamic', + required: false, + fields: [ + { + label: 'Label', + key: 'label', + type: 'dropdown', + description: 'Only trigger on issues when this label is added.', + required: false, + variables: true, + dependsOn: ['parameters.repo'], + source: { + type: 'query', + name: 'getDynamicData', + arguments: [ + { + name: 'key', + value: 'listLabels', + }, + { + name: 'parameters.repo', + value: '{parameters.repo}', + }, + ], + }, + }, + ], + }, + ], + + async run($) { + const repo = $.step.parameters.repo; + const issueType = $.step.parameters.issueType; + const allLabels = $.step.parameters.labels; + const formattedAllLabels = allLabels.map((label) => label.label).join(','); + const repoOwner = $.auth.data.repoOwner; + + const params = { + page: 1, + limit: 100, + state: issueType, + labels: formattedAllLabels, + }; + + let totalCount; + let totalRequestedCount; + do { + const { data, headers } = await $.http.get( + `/repos/${repoOwner}/${repo}/issues`, + { + params, + } + ); + params.page = params.page + 1; + totalCount = Number(headers['x-total-count']); + totalRequestedCount = params.page * params.limit; + + if (data?.length) { + for (const issue of data) { + $.pushTriggerItem({ + raw: issue, + meta: { + internalId: issue.id.toString(), + }, + }); + } + } + } while (totalRequestedCount <= totalCount); + }, +}); diff --git a/packages/docs/pages/apps/gitea/triggers.md b/packages/docs/pages/apps/gitea/triggers.md index 9f651286..6bbdbcd1 100644 --- a/packages/docs/pages/apps/gitea/triggers.md +++ b/packages/docs/pages/apps/gitea/triggers.md @@ -1,6 +1,8 @@ --- favicon: /favicons/gitea.svg items: + - name: New issues + desc: Triggers when a new issue is created. - name: New stargazers desc: Triggers when a user stars a repository. - name: New watchers