diff --git a/backend/src/serverless/integrations/usecases/github/rest/getInstalledRepositories.ts b/backend/src/serverless/integrations/usecases/github/rest/getInstalledRepositories.ts index f5ab3af267..fc6d02034d 100644 --- a/backend/src/serverless/integrations/usecases/github/rest/getInstalledRepositories.ts +++ b/backend/src/serverless/integrations/usecases/github/rest/getInstalledRepositories.ts @@ -4,32 +4,55 @@ import { Repos } from '../../../types/regularTypes' const log = createServiceChildLogger('getInstalledRepositories') +const getRepositoriesFromGH = async (page: number, installToken: string): Promise => { + const REPOS_PER_PAGE = 100 + + const requestConfig = { + method: 'get', + url: `https://api.github.com/installation/repositories?page=${page}&per_page=${REPOS_PER_PAGE}`, + headers: { + Authorization: `Bearer ${installToken}`, + }, + } as AxiosRequestConfig + + const response = await axios(requestConfig) + return response.data +} + +const parseRepos = (repositories: any): Repos => { + const repos: Repos = [] + + for (const repo of repositories) { + repos.push({ + url: repo.html_url, + owner: repo.owner.login, + createdAt: repo.created_at, + name: repo.name, + }) + } + + return repos +} + export const getInstalledRepositories = async (installToken: string): Promise => { try { - const requestConfig = { - method: 'get', - url: `https://api.github.com/installation/repositories`, - headers: { - Authorization: `Bearer ${installToken}`, - }, - } as AxiosRequestConfig - const response = await axios(requestConfig) - const data = response.data + let page = 1 + let hasMorePages = true + const repos: Repos = [] - if (data.repositories) { - for (const repo of data.repositories) { - repos.push({ - url: repo.html_url, - owner: repo.owner.login, - createdAt: repo.created_at, - name: repo.name, - }) + while (hasMorePages) { + const data = await getRepositoriesFromGH(page, installToken) + + if (data.repositories) { + repos.push(...parseRepos(data.repositories)) } - return repos + + hasMorePages = data.total_count && data.total_count > 0 && data.total_count > repos.length + page += 1 } - return [] + return repos } catch (err: any) { log.error(err, 'Error fetching installed repositories!') throw err