File tree Expand file tree Collapse file tree
workspaces/bulk-import/plugins/bulk-import-backend/src/github/utils Expand file tree Collapse file tree Original file line number Diff line number Diff 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 ( / p a g e = ( \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+ }
You can’t perform that action at this time.
0 commit comments