Skip to content

Commit a957d2f

Browse files
committed
feat(bulk-import): refactored getAllPages function for paginated API responses
Signed-off-by: Dominik Augustín <daugusti@redhat.com>
1 parent 1888ce1 commit a957d2f

1 file changed

Lines changed: 41 additions & 0 deletions

File tree

  • workspaces/bulk-import/plugins/bulk-import-backend/src/github/utils

workspaces/bulk-import/plugins/bulk-import-backend/src/github/utils/utils.ts

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,3 +486,44 @@ export async function listAllRepositoriesAccessibleToInstallation(
486486
repository_selection,
487487
};
488488
}
489+
490+
async function getAllPages<ResponseType>(
491+
deps: {
492+
logger: LoggerService;
493+
},
494+
ghApiName: string,
495+
fetchPageFn: (pageNumber: number) => Promise<OctokitResponse<ResponseType>>,
496+
): Promise<OctokitResponse<ResponseType>['data'][]> {
497+
const PAGE_NUMBER_REGEX_MATCH_INDEX = 1;
498+
const SECOND_PAGE_NUMBER = 2;
499+
500+
const firstPageResponse = await fetchPageFn(1);
501+
502+
const lastPageNumberString = firstPageResponse?.headers?.link
503+
?.split(',')
504+
?.find(s => s.includes('rel="last"'))
505+
?.match(/page=(\d+)/)?.[PAGE_NUMBER_REGEX_MATCH_INDEX];
506+
507+
if (!lastPageNumberString) {
508+
deps.logger.debug(
509+
`Unable to extract page number from rel='last' link found in response headers from '${ghApiName}' GH endpoint => returning current page size`,
510+
);
511+
return [firstPageResponse.data];
512+
}
513+
514+
const lastPageNumber = Number.parseInt(lastPageNumberString, 10);
515+
516+
if (lastPageNumber < SECOND_PAGE_NUMBER) {
517+
return [firstPageResponse.data];
518+
}
519+
520+
const pagePromises = [];
521+
for (let i = SECOND_PAGE_NUMBER; i <= lastPageNumber; i++) {
522+
pagePromises.push(fetchPageFn(i));
523+
}
524+
const remainingPages = await Promise.all(pagePromises);
525+
526+
const allPages = [firstPageResponse, ...remainingPages];
527+
528+
return allPages.map(page => page.data);
529+
}

0 commit comments

Comments
 (0)