diff --git a/packages/backend/src/apps/github/common/paginate-all.ts b/packages/backend/src/apps/github/common/paginate-all.ts new file mode 100644 index 00000000..78a01de9 --- /dev/null +++ b/packages/backend/src/apps/github/common/paginate-all.ts @@ -0,0 +1,36 @@ +import { IGlobalVariable, IJSONObject } from "@automatisch/types"; +import type { AxiosResponse } from 'axios'; +import parseLinkHeader from '../../../helpers/parse-header-link'; + +type TResponse = { + data: IJSONObject[], + error?: IJSONObject, +} + +export default async function paginateAll($: IGlobalVariable, request: Promise) { + const response = await request; + const aggregatedResponse: TResponse = { + data: [...response.data], + }; + + let links = parseLinkHeader(response.headers.link); + + while (links.next) { + const nextPageResponse = await $.http.request({ + ...response.config, + url: links.next.uri, + }); + + if (nextPageResponse.integrationError) { + aggregatedResponse.error = nextPageResponse.integrationError; + + links = null; + } else { + aggregatedResponse.data.push(...nextPageResponse.data); + + links = parseLinkHeader(nextPageResponse.headers.link); + } + } + + return aggregatedResponse; +}