Files
automatisch/packages/backend/src/apps/github/triggers/new-watchers/new-watchers.ts

54 lines
1.6 KiB
TypeScript

import { IGlobalVariable, ITriggerOutput } from '@automatisch/types';
import getRepoOwnerAndRepo from '../../common/get-repo-owner-and-repo';
import parseLinkHeader from '../../../../helpers/parse-header-link';
const newWatchers = 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 firstPagePathname = `/repos/${repoOwner}/${repo}/subscribers`;
const requestConfig = {
params: {
per_page: 100,
},
};
const firstPageResponse = await $.http.get(firstPagePathname, requestConfig);
const firstPageLinks = parseLinkHeader(firstPageResponse.headers.link);
// in case there is only single page to fetch
let pathname = firstPageLinks.last?.uri || firstPagePathname;
do {
const response = await $.http.get(pathname, requestConfig);
const links = parseLinkHeader(response.headers.link);
pathname = links.prev?.uri;
if (response.data.length) {
// to iterate reverse-chronologically
response.data.reverse();
for (const watcher of response.data) {
const watcherId = watcher.id.toString();
if ($.flow.isAlreadyProcessed(watcherId) && !$.execution.testRun)
return;
const dataItem = {
raw: watcher,
meta: {
internalId: watcherId,
},
};
$.pushTriggerItem(dataItem);
}
}
} while (pathname && !$.execution.testRun === false);
};
export default newWatchers;