@red-hat-developer-hub/backstage-plugin-bulk-import-backend 7.2.1 → 7.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +41 -4
  3. package/dist/database/repositoryDao.cjs.js +6 -0
  4. package/dist/database/repositoryDao.cjs.js.map +1 -1
  5. package/dist/generated/openapidocument.cjs.js +89 -0
  6. package/dist/generated/openapidocument.cjs.js.map +1 -1
  7. package/dist/github/GithubAppManager.cjs.js +3 -0
  8. package/dist/github/GithubAppManager.cjs.js.map +1 -1
  9. package/dist/github/githubApiService.cjs.js +140 -144
  10. package/dist/github/githubApiService.cjs.js.map +1 -1
  11. package/dist/github/types.cjs.js.map +1 -1
  12. package/dist/github/utils/ghUtils.cjs.js +3 -3
  13. package/dist/github/utils/ghUtils.cjs.js.map +1 -1
  14. package/dist/github/utils/repoUtils.cjs.js +53 -99
  15. package/dist/github/utils/repoUtils.cjs.js.map +1 -1
  16. package/dist/gitlab/GitlabAppManager.cjs.js +2 -0
  17. package/dist/gitlab/GitlabAppManager.cjs.js.map +1 -1
  18. package/dist/gitlab/gitlabApiService.cjs.js +65 -8
  19. package/dist/gitlab/gitlabApiService.cjs.js.map +1 -1
  20. package/dist/gitlab/utils/glUtils.cjs.js +1 -1
  21. package/dist/gitlab/utils/glUtils.cjs.js.map +1 -1
  22. package/dist/gitlab/utils/repoUtils.cjs.js +32 -57
  23. package/dist/gitlab/utils/repoUtils.cjs.js.map +1 -1
  24. package/dist/service/handlers/import/bulkImports.cjs.js +14 -6
  25. package/dist/service/handlers/import/bulkImports.cjs.js.map +1 -1
  26. package/dist/service/handlers/import/importStatus.cjs.js.map +1 -1
  27. package/dist/service/handlers/organization/organizations.cjs.js +2 -2
  28. package/dist/service/handlers/organization/organizations.cjs.js.map +1 -1
  29. package/dist/service/handlers/repository/repositories.cjs.js +41 -6
  30. package/dist/service/handlers/repository/repositories.cjs.js.map +1 -1
  31. package/dist/service/handlers/scm/scm.cjs.js +16 -0
  32. package/dist/service/handlers/scm/scm.cjs.js.map +1 -0
  33. package/dist/service/router.cjs.js +81 -9
  34. package/dist/service/router.cjs.js.map +1 -1
  35. package/package.json +16 -16
@@ -1 +1 @@
1
- {"version":3,"file":"githubApiService.cjs.js","sources":["../../src/github/githubApiService.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n CacheService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport {\n DefaultGithubCredentialsProvider,\n GithubIntegrationConfig,\n ScmIntegrations,\n} from '@backstage/integration';\n\nimport { Octokit } from '@octokit/rest';\nimport gitUrlParse from 'git-url-parse';\n\nimport { getBranchName, getCatalogFilename } from '../catalog/catalogUtils';\nimport {\n computeTotalCount,\n extractLocationOwnerMap,\n logErrorIfNeeded,\n} from '../helpers';\nimport {\n DefaultPageNumber,\n DefaultPageSize,\n} from '../service/handlers/handlers';\nimport { CustomGithubCredentialsProvider } from './GithubAppManager';\nimport {\n isGithubAppCredential,\n type ExtendedGithubCredentials,\n type GithubFetchError,\n type GithubOrganization,\n type GithubOrganizationResponse,\n type GithubRepository,\n type GithubRepositoryResponse,\n} from './types';\nimport { buildOcto } from './utils/ghUtils';\nimport {\n addGithubAppOrgs,\n addGithubTokenOrgs,\n getAllAppOrgs,\n} from './utils/orgUtils';\nimport {\n closePRWithComment,\n findOpenPRForBranch,\n getCatalogInfoContentFromPR,\n} from './utils/prUtils';\nimport {\n addGithubAppRepositories,\n addGithubTokenOrgRepositories,\n addGithubTokenRepositories,\n fileExistsInDefaultBranch,\n type ValidatedRepo,\n} from './utils/repoUtils';\nimport {\n executeFunctionOnFirstSuccessfulIntegration,\n fetchFromAllIntegrations,\n fetchFromMatchedIntegration,\n} from './utils/utils';\n\nexport class GithubApiService {\n private readonly logger: LoggerService;\n private readonly integrations: ScmIntegrations;\n public readonly githubCredentialsProvider: CustomGithubCredentialsProvider;\n private readonly config: Config;\n // Cache for storing ETags (used for efficient caching of unchanged data returned by GitHub)\n private readonly cache: CacheService;\n\n constructor(\n logger: LoggerService,\n config: Config,\n cacheService: CacheService,\n ) {\n this.logger = logger;\n this.config = config;\n this.integrations = ScmIntegrations.fromConfig(config);\n this.githubCredentialsProvider =\n CustomGithubCredentialsProvider.fromIntegrations(this.integrations);\n this.cache = cacheService;\n }\n\n async getCredentials(repoUrl: string): Promise<{ token: string }> {\n const provider = DefaultGithubCredentialsProvider.fromIntegrations(\n this.integrations,\n );\n const creds = await provider.getCredentials({\n url: repoUrl,\n });\n if (!creds || !creds.token) {\n throw new Error(`Token not configured for 'github' provider`);\n }\n return {\n token: creds.token,\n };\n }\n\n async getRepositoryFromIntegrations(repoUrl: string): Promise<{\n repository?: GithubRepository;\n errors?: GithubFetchError[];\n }> {\n const { data, errors } = await fetchFromMatchedIntegration(\n {\n logger: this.logger,\n cache: this.cache,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n this.integrations,\n repoUrl,\n async (octokit, gitUrl) => {\n const resp = await octokit.rest.repos.get({\n owner: gitUrl.owner,\n repo: gitUrl.name,\n });\n const repo = resp?.data;\n if (!repo) {\n return undefined;\n }\n return {\n name: repo.name,\n full_name: repo.full_name,\n url: repo.url,\n html_url: repo.html_url,\n default_branch: repo.default_branch,\n updated_at: repo.updated_at,\n };\n },\n );\n\n return {\n repository: data,\n errors,\n };\n }\n\n async getOrganizationsFromIntegrations(\n search?: string,\n pageNumber: number = DefaultPageNumber,\n pageSize: number = DefaultPageSize,\n ): Promise<GithubOrganizationResponse> {\n const orgs = new Map<string, GithubOrganization>();\n const result = await fetchFromAllIntegrations(\n {\n logger: this.logger,\n cache: this.cache,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n this.integrations,\n {\n dataFetcher: async (\n octokit: Octokit,\n credential: ExtendedGithubCredentials,\n ghConfig: GithubIntegrationConfig,\n ) => {\n const dataFetchErrors = new Map<number, GithubFetchError>();\n const resp = isGithubAppCredential(credential)\n ? await addGithubAppOrgs(\n {\n logger: this.logger,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n octokit,\n ghConfig,\n {\n credentialAccountLogin: credential.accountLogin,\n search,\n orgs,\n errors: dataFetchErrors,\n },\n )\n : await addGithubTokenOrgs(\n {\n logger: this.logger,\n },\n octokit,\n credential,\n {\n search,\n orgs,\n pageNumber,\n pageSize,\n errors: dataFetchErrors,\n },\n );\n\n this.logger.debug(\n `Got ${resp.totalCount} org(s) for ${ghConfig.host}`,\n );\n return {\n result: resp.totalCount ?? 0,\n errors: Array.from(dataFetchErrors.values()),\n };\n },\n },\n );\n\n const orgList = Array.from(orgs.values());\n const totalCount = computeTotalCount(orgList, result.data, pageSize);\n return {\n organizations: orgList,\n errors: Array.from(result.errors?.values() ?? []),\n totalCount,\n };\n }\n\n async getOrgRepositoriesFromIntegrations(\n orgName: string,\n search?: string,\n pageNumber: number = DefaultPageNumber,\n pageSize: number = DefaultPageSize,\n ): Promise<GithubRepositoryResponse> {\n const repositories = new Map<string, GithubRepository>();\n const result = await fetchFromAllIntegrations(\n {\n logger: this.logger,\n cache: this.cache,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n this.integrations,\n {\n dataFetcher: async (\n octokit: Octokit,\n credential: ExtendedGithubCredentials,\n ghConfig: GithubIntegrationConfig,\n ) => {\n const dataFetchErrors = new Map<number, GithubFetchError>();\n let resp: { totalCount?: number };\n if (isGithubAppCredential(credential)) {\n if (credential.accountLogin !== orgName) {\n return {};\n }\n resp = await addGithubAppRepositories(\n {\n logger: this.logger,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n octokit,\n credential,\n ghConfig,\n repositories,\n dataFetchErrors,\n {\n search,\n pageNumber,\n pageSize,\n },\n );\n } else {\n resp = await addGithubTokenOrgRepositories(\n {\n logger: this.logger,\n },\n octokit,\n credential,\n orgName,\n repositories,\n dataFetchErrors,\n {\n search,\n pageNumber,\n pageSize,\n },\n );\n }\n this.logger.debug(\n `Got ${resp.totalCount} org repo(s) for ${ghConfig.host}`,\n );\n return {\n stopFetchingData: true,\n result: resp.totalCount ?? 0,\n errors: Array.from(dataFetchErrors.values()),\n };\n },\n },\n );\n\n const repoList = Array.from(repositories.values());\n const totalCount = computeTotalCount(repoList, result.data, pageSize);\n return {\n repositories: repoList,\n errors: Array.from(result.errors?.values() ?? []),\n totalCount,\n };\n }\n\n /**\n * Returns GithubRepositoryResponse containing:\n * - a list of unique repositories the github integrations have access to\n * - a list of errors encountered by each app and/or token (if any exist)\n */\n async getRepositoriesFromIntegrations(\n search?: string,\n pageNumber: number = DefaultPageNumber,\n pageSize: number = DefaultPageSize,\n ): Promise<GithubRepositoryResponse> {\n const repositories = new Map<string, GithubRepository>();\n const result = await fetchFromAllIntegrations(\n {\n logger: this.logger,\n cache: this.cache,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n this.integrations,\n {\n dataFetcher: async (\n octokit: Octokit,\n credential: ExtendedGithubCredentials,\n ghConfig: GithubIntegrationConfig,\n ) => {\n const dataFetchErrors = new Map<number, GithubFetchError>();\n const resp = isGithubAppCredential(credential)\n ? await addGithubAppRepositories(\n {\n logger: this.logger,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n octokit,\n credential,\n ghConfig,\n repositories,\n dataFetchErrors,\n {\n search,\n pageNumber,\n pageSize,\n },\n )\n : await addGithubTokenRepositories(\n {\n logger: this.logger,\n },\n octokit,\n credential,\n repositories,\n dataFetchErrors,\n {\n search,\n pageNumber,\n pageSize,\n },\n );\n this.logger.debug(\n `Got ${resp.totalCount} repo(s) for ${ghConfig.host}`,\n );\n return {\n result: resp.totalCount ?? 0,\n errors: Array.from(dataFetchErrors.values()),\n };\n },\n },\n );\n\n const repoList = Array.from(repositories.values());\n const totalCount = computeTotalCount(repoList, result.data, pageSize);\n return {\n repositories: repoList,\n errors: Array.from(result.errors?.values() ?? []),\n totalCount,\n };\n }\n\n async filterLocationsAccessibleFromIntegrations(\n locationUrls: string[],\n ): Promise<string[]> {\n const locationGitOwnerMap = extractLocationOwnerMap(locationUrls);\n\n const allAccessibleAppOrgs = new Set<string>();\n const allAccessibleTokenOrgs = new Set<string>();\n const allAccessibleUsernames = new Set<string>();\n await fetchFromAllIntegrations(\n {\n logger: this.logger,\n cache: this.cache,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n this.integrations,\n {\n dataFetcher: async (\n octokit: Octokit,\n credential: ExtendedGithubCredentials,\n ghConfig: GithubIntegrationConfig,\n ) => {\n if (isGithubAppCredential(credential)) {\n const appOrgMap = await getAllAppOrgs(\n this.githubCredentialsProvider,\n ghConfig,\n credential.accountLogin,\n );\n for (const [_, ghOrg] of appOrgMap) {\n allAccessibleAppOrgs.add(ghOrg.name);\n }\n } else {\n // find authenticated GitHub owner...\n const username = (await octokit.rest.users.getAuthenticated())?.data\n ?.login;\n if (username) {\n allAccessibleUsernames.add(username);\n }\n // ... along with orgs accessible from the token auth\n (await octokit.paginate(octokit.rest.orgs.listForAuthenticatedUser))\n ?.map(org => org.login)\n ?.forEach(orgName => allAccessibleTokenOrgs.add(orgName));\n }\n return {};\n },\n },\n );\n\n return locationUrls.filter(loc => {\n if (!locationGitOwnerMap.has(loc)) {\n return false;\n }\n const owner = locationGitOwnerMap.get(loc)!;\n return (\n allAccessibleAppOrgs.has(owner) ||\n allAccessibleTokenOrgs.has(owner) ||\n allAccessibleUsernames.has(owner)\n );\n });\n }\n\n async getPullRequest(\n repoUrl: string,\n pullRequestNumber: number,\n ): Promise<{\n title?: string;\n body?: string;\n merged?: boolean;\n lastUpdated?: string;\n prSha?: string;\n prBranch?: string;\n }> {\n const { data } = await fetchFromMatchedIntegration(\n {\n logger: this.logger,\n cache: this.cache,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n this.integrations,\n repoUrl,\n async (octokit, gitUrl) => {\n try {\n const resp = await octokit.rest.pulls.get({\n owner: gitUrl.owner,\n repo: gitUrl.name,\n pull_number: pullRequestNumber,\n });\n const pr = resp.data;\n return {\n title: pr.title,\n body: pr.body ?? undefined,\n merged: pr.merged,\n lastUpdated: pr.updated_at,\n prSha: pr.head.sha,\n prBranch: pr.head.ref,\n };\n } catch (error: any) {\n logErrorIfNeeded(this.logger, 'Error fetching pull requests', error);\n return undefined;\n }\n },\n );\n return data ?? {};\n }\n\n async updatePullRequest(\n repoUrl: string,\n pullRequestNumber: number,\n title?: string,\n body?: string,\n ): Promise<void> {\n await fetchFromMatchedIntegration(\n {\n logger: this.logger,\n cache: this.cache,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n this.integrations,\n repoUrl,\n async (octokit, gitUrl) => {\n try {\n await octokit.rest.pulls.update({\n owner: gitUrl.owner,\n repo: gitUrl.name,\n pull_number: pullRequestNumber,\n title: title,\n body: body,\n });\n return;\n } catch (error: any) {\n logErrorIfNeeded(this.logger, 'Error updating pull requests', error);\n throw error;\n }\n },\n );\n }\n\n async createOrUpdateFileInBranch(\n owner: string,\n repo: string,\n branchName: string,\n fileName: string,\n fileContent: string,\n ): Promise<void> {\n try {\n const ghConfig = this.integrations.github.byUrl(\n `https://github.com/${owner}/${repo}`,\n )?.config;\n if (!ghConfig) {\n throw new Error(\n `Could not find GH integration from https://github.com/${owner}/${repo}`,\n );\n }\n\n const credentials =\n await this.githubCredentialsProvider.getAllCredentials({\n host: ghConfig.host,\n });\n\n if (credentials.length === 0) {\n throw new Error(`No credentials for GH integration`);\n }\n\n for (const credential of credentials) {\n const octokit = buildOcto(\n {\n logger: this.logger,\n cache: this.cache,\n },\n { credential, owner },\n ghConfig.apiBaseUrl,\n );\n if (!octokit) {\n continue;\n }\n\n try {\n const { data: existingFile } = await octokit.rest.repos.getContent({\n owner: owner,\n repo: repo,\n path: fileName,\n ref: branchName,\n });\n // Response can either be a directory (array of files) or a single file element. In this case, we ensure it has the sha property to update it.\n if (Array.isArray(existingFile) || !('sha' in existingFile)) {\n throw new Error(\n `The content at path ${fileName} is not a file or the response from GitHub does not contain the 'sha' property.`,\n );\n }\n // If the file already exists, update it\n await octokit.rest.repos.createOrUpdateFileContents({\n owner,\n repo,\n path: fileName,\n message: `Add ${fileName} config file`,\n content: btoa(fileContent),\n sha: existingFile.sha,\n branch: branchName,\n });\n } catch (error: any) {\n if (error.status === 404) {\n // If the file does not exist, create it\n await octokit.rest.repos.createOrUpdateFileContents({\n owner,\n repo,\n path: fileName,\n message: `Add ${fileName} config file`,\n content: btoa(fileContent),\n branch: branchName,\n });\n } else {\n throw error;\n }\n }\n }\n } catch (error: any) {\n this.logger.error(\n `Error creating or updating file in branch ${branchName}`,\n error,\n );\n throw error;\n }\n }\n\n async findImportOpenPr(\n logger: LoggerService,\n input: {\n repoUrl: string;\n includeCatalogInfoContent?: boolean;\n },\n ): Promise<{\n prNum?: number;\n prUrl?: string;\n prTitle?: string;\n prBody?: string;\n prCatalogInfoContent?: string;\n lastUpdate?: string;\n }> {\n const branchName = getBranchName(this.config);\n const { data } = await fetchFromMatchedIntegration(\n {\n logger: this.logger,\n cache: this.cache,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n this.integrations,\n input.repoUrl,\n async (octokit, gitUrl) => {\n try {\n return await findOpenPRForBranch(\n logger,\n this.config,\n octokit,\n gitUrl.organization,\n gitUrl.name,\n branchName,\n input.includeCatalogInfoContent,\n );\n } catch (error: any) {\n logErrorIfNeeded(this.logger, 'Error fetching pull requests', error);\n return undefined;\n }\n },\n );\n return data ?? {};\n }\n\n async getCatalogInfoFile(\n logger: LoggerService,\n input: {\n repoUrl: string;\n prNumber: number;\n prHeadSha: string;\n },\n ): Promise<string | undefined> {\n const { data } = await fetchFromMatchedIntegration(\n {\n logger: this.logger,\n cache: this.cache,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n this.integrations,\n input.repoUrl,\n async (octokit, gitUrl) => {\n try {\n return await getCatalogInfoContentFromPR(\n logger,\n this.config,\n octokit,\n gitUrl.organization,\n gitUrl.name,\n input.prNumber,\n input.prHeadSha,\n );\n } catch (error: any) {\n logErrorIfNeeded(\n this.logger,\n 'Error fetching catalog info file content requests',\n error,\n );\n return undefined;\n }\n },\n );\n return data;\n }\n\n async submitPrToRepo(\n logger: LoggerService,\n input: {\n repoUrl: string;\n gitUrl: gitUrlParse.GitUrl;\n defaultBranch?: string;\n prTitle: string;\n prBody: string;\n catalogInfoContent: string;\n },\n ): Promise<{\n prUrl?: string;\n prNumber?: number;\n hasChanges?: boolean;\n lastUpdate?: string;\n errors?: string[];\n }> {\n const fileName = getCatalogFilename(this.config);\n const errors: any[] = [];\n\n const result = await executeFunctionOnFirstSuccessfulIntegration(\n {\n logger: this.logger,\n cache: this.cache,\n config: this.config,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n this.integrations,\n {\n repoUrl: input.repoUrl,\n fn: async (\n validatedRepo: ValidatedRepo,\n octo: Octokit,\n ): Promise<{\n successful: boolean;\n result?: {\n prUrl?: string;\n prNumber?: number;\n hasChanges?: boolean;\n lastUpdate?: string;\n };\n }> => {\n const { owner, repo, branchName } = validatedRepo;\n try {\n // Check if there is already a catalogInfo in the default branch\n const catalogInfoFileExists = await fileExistsInDefaultBranch(\n logger,\n octo,\n owner,\n repo,\n fileName,\n input.defaultBranch,\n );\n if (catalogInfoFileExists) {\n // No need to create a PR => component will be imported as is\n return {\n successful: true,\n result: {\n hasChanges: false,\n },\n };\n }\n\n const existingPrForBranch = await findOpenPRForBranch(\n logger,\n this.config,\n octo,\n owner,\n repo,\n branchName,\n );\n\n const repoData = await octo.rest.repos.get({\n owner,\n repo,\n });\n const parentRef = await octo.rest.git.getRef({\n owner,\n repo,\n ref: `heads/${repoData.data.default_branch}`,\n });\n if (existingPrForBranch.prNum) {\n await this.createOrUpdateFileInBranch(\n owner,\n repo,\n branchName,\n fileName,\n input.catalogInfoContent,\n );\n const pullRequestResponse = await octo.rest.pulls.update({\n owner,\n repo,\n pull_number: existingPrForBranch.prNum,\n title: input.prTitle,\n body: input.prBody,\n head: branchName,\n base: repoData.data.default_branch,\n });\n return {\n successful: true,\n result: {\n prNumber: existingPrForBranch.prNum,\n prUrl: pullRequestResponse.data.html_url,\n lastUpdate: pullRequestResponse.data.updated_at,\n },\n };\n }\n\n let branchExists = false;\n try {\n await octo.rest.git.getRef({\n owner,\n repo,\n ref: `heads/${branchName}`,\n });\n branchExists = true;\n } catch (error: any) {\n if (error.status === 404) {\n await octo.rest.git.createRef({\n owner,\n repo,\n ref: `refs/heads/${branchName}`,\n sha: parentRef.data.object.sha,\n });\n } else {\n throw error;\n }\n }\n\n if (branchExists) {\n // update it in case it is outdated compared to the base branch\n try {\n await octo.repos.merge({\n owner: owner,\n repo: repo,\n base: branchName,\n head: repoData.data.default_branch,\n });\n } catch (error: any) {\n logErrorIfNeeded(\n this.logger,\n `Could not merge default branch ${repoData.data.default_branch} into import branch ${branchName}`,\n error,\n );\n }\n }\n\n await this.createOrUpdateFileInBranch(\n owner,\n repo,\n branchName,\n fileName,\n input.catalogInfoContent,\n );\n\n const pullRequestResponse = await octo.rest.pulls.create({\n owner,\n repo,\n title: input.prTitle,\n body: input.prBody,\n head: branchName,\n base: repoData.data.default_branch,\n });\n return {\n successful: true,\n result: {\n prNumber: pullRequestResponse.data.number,\n prUrl: pullRequestResponse.data.html_url,\n lastUpdate: pullRequestResponse.data.updated_at,\n hasChanges: true,\n },\n };\n } catch (e: any) {\n logErrorIfNeeded(\n this.logger,\n `Couldn't create PR in ${input.repoUrl}`,\n e,\n );\n errors.push(e.message);\n return { successful: false };\n }\n },\n },\n );\n\n if (result) {\n return result;\n }\n\n logger.warn(\n `Tried all possible GitHub credentials, but could not create PR in ${input.repoUrl}. Please try again later...`,\n );\n\n return {\n errors: errors,\n };\n }\n\n async hasFileInRepo(input: {\n repoUrl: string;\n defaultBranch?: string;\n fileName: string;\n }) {\n const fileExists = await executeFunctionOnFirstSuccessfulIntegration(\n {\n logger: this.logger,\n cache: this.cache,\n config: this.config,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n this.integrations,\n {\n repoUrl: input.repoUrl,\n fn: async (validatedRepo: ValidatedRepo, octo: Octokit) => {\n const { owner, repo } = validatedRepo;\n const exists = await fileExistsInDefaultBranch(\n this.logger,\n octo,\n owner,\n repo,\n input.fileName,\n input.defaultBranch,\n );\n if (exists === undefined) {\n return { successful: false };\n }\n return { successful: true, result: exists };\n },\n },\n );\n\n if (fileExists === undefined) {\n throw new Error(\n `Could not determine if repo at ${input.repoUrl} already has a file named ${input.fileName} in its default branch (${input.defaultBranch})`,\n );\n }\n\n return fileExists;\n }\n\n async closeImportPR(\n logger: LoggerService,\n input: {\n repoUrl: string;\n gitUrl: gitUrlParse.GitUrl;\n comment: string;\n },\n ) {\n await executeFunctionOnFirstSuccessfulIntegration(\n {\n logger: this.logger,\n cache: this.cache,\n config: this.config,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n this.integrations,\n {\n repoUrl: input.repoUrl,\n fn: async (validatedRepo: ValidatedRepo, octo: Octokit) => {\n const { owner, repo, branchName } = validatedRepo;\n try {\n const existingPrForBranch = await findOpenPRForBranch(\n logger,\n this.config,\n octo,\n owner,\n repo,\n branchName,\n );\n if (existingPrForBranch.prNum) {\n await closePRWithComment(\n octo,\n owner,\n repo,\n existingPrForBranch.prNum,\n input.comment,\n );\n }\n return { successful: true };\n } catch (e: any) {\n logErrorIfNeeded(\n this.logger,\n `Couldn't close PR in ${input.repoUrl}`,\n e,\n );\n return { successful: false };\n }\n },\n },\n );\n }\n\n async deleteImportBranch(input: {\n repoUrl: string;\n gitUrl: gitUrlParse.GitUrl;\n }) {\n await executeFunctionOnFirstSuccessfulIntegration(\n {\n logger: this.logger,\n cache: this.cache,\n config: this.config,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n this.integrations,\n {\n repoUrl: input.repoUrl,\n fn: async (validatedRepo: ValidatedRepo, octo: Octokit) => {\n const { owner, repo, branchName } = validatedRepo;\n try {\n await octo.git.deleteRef({\n owner: owner,\n repo: repo,\n ref: `heads/${branchName}`,\n });\n return { successful: true };\n } catch (e: any) {\n logErrorIfNeeded(\n this.logger,\n `Couldn't close import PR and/or delete import branch in ${input.repoUrl}`,\n e,\n );\n return { successful: false };\n }\n },\n },\n );\n }\n\n async isRepoEmpty(input: { repoUrl: string }) {\n return await executeFunctionOnFirstSuccessfulIntegration(\n {\n logger: this.logger,\n cache: this.cache,\n config: this.config,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n this.integrations,\n {\n repoUrl: input.repoUrl,\n fn: async (validatedRepo: ValidatedRepo, octo: Octokit) => {\n const { owner, repo } = validatedRepo;\n const resp = await octo.rest.repos.listContributors({\n owner: owner,\n repo: repo,\n page: 1,\n per_page: 1,\n });\n const status = resp.status as 200 | 204;\n return { successful: true, result: status === 204 };\n },\n },\n );\n }\n}\n"],"names":["ScmIntegrations","CustomGithubCredentialsProvider","DefaultGithubCredentialsProvider","fetchFromMatchedIntegration","DefaultPageNumber","DefaultPageSize","fetchFromAllIntegrations","isGithubAppCredential","addGithubAppOrgs","addGithubTokenOrgs","computeTotalCount","addGithubAppRepositories","addGithubTokenOrgRepositories","addGithubTokenRepositories","extractLocationOwnerMap","getAllAppOrgs","logErrorIfNeeded","buildOcto","getBranchName","findOpenPRForBranch","getCatalogInfoContentFromPR","getCatalogFilename","executeFunctionOnFirstSuccessfulIntegration","fileExistsInDefaultBranch","pullRequestResponse","closePRWithComment"],"mappings":"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"}
1
+ {"version":3,"file":"githubApiService.cjs.js","sources":["../../src/github/githubApiService.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n CacheService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport {\n DefaultGithubCredentialsProvider,\n GithubCredentials,\n GithubIntegrationConfig,\n ScmIntegrations,\n} from '@backstage/integration';\n\nimport { Octokit } from '@octokit/rest';\nimport gitUrlParse from 'git-url-parse';\n\nimport { getBranchName, getCatalogFilename } from '../catalog/catalogUtils';\nimport {\n computeTotalCount,\n extractLocationOwnerMap,\n logErrorIfNeeded,\n} from '../helpers';\nimport { GitApiService } from '../scm/GitApiService';\nimport {\n DefaultPageNumber,\n DefaultPageSize,\n} from '../service/handlers/handlers';\nimport { CustomGithubCredentialsProvider } from './GithubAppManager';\nimport {\n isGithubAppCredential,\n type ExtendedGithubCredentials,\n type GithubFetchError,\n type GithubOrganization,\n type GithubOrganizationResponse,\n type GithubRepository,\n type GithubRepositoryResponse,\n} from './types';\nimport { buildOcto } from './utils/ghUtils';\nimport {\n addGithubAppOrgs,\n addGithubTokenOrgs,\n getAllAppOrgs,\n} from './utils/orgUtils';\nimport {\n closePRWithComment,\n findOpenPRForBranch,\n getCatalogInfoContentFromPR,\n} from './utils/prUtils';\nimport {\n addGithubAppRepositories,\n addGithubTokenOrgRepositories,\n addGithubTokenRepositories,\n fileExistsInDefaultBranch,\n type ValidatedRepo,\n} from './utils/repoUtils';\nimport {\n executeFunctionOnFirstSuccessfulIntegration,\n fetchFromAllIntegrations,\n fetchFromMatchedIntegration,\n} from './utils/utils';\n\nexport class GithubApiService implements GitApiService {\n private readonly logger: LoggerService;\n private readonly integrations: ScmIntegrations;\n public readonly githubCredentialsProvider: CustomGithubCredentialsProvider;\n private readonly config: Config;\n // Cache for storing ETags (used for efficient caching of unchanged data returned by GitHub)\n private readonly cache: CacheService;\n\n constructor(\n logger: LoggerService,\n config: Config,\n cacheService: CacheService,\n ) {\n this.logger = logger;\n this.config = config;\n this.integrations = ScmIntegrations.fromConfig(config);\n this.githubCredentialsProvider =\n CustomGithubCredentialsProvider.fromIntegrations(this.integrations);\n this.cache = cacheService;\n }\n\n private get integrationDeps() {\n return {\n logger: this.logger,\n cache: this.cache,\n githubCredentialsProvider: this.githubCredentialsProvider,\n };\n }\n\n private get executionDeps() {\n return {\n ...this.integrationDeps,\n config: this.config,\n };\n }\n\n private buildRepositoryResponse(\n repositories: Map<string, GithubRepository>,\n result: { data: number[]; errors: Map<number, GithubFetchError> },\n pageSize: number,\n ): GithubRepositoryResponse {\n const repoList = Array.from(repositories.values());\n const totalCount = computeTotalCount(repoList, result.data, pageSize);\n return {\n repositories: repoList,\n errors: Array.from(result.errors.values()),\n totalCount,\n };\n }\n\n async getCredentials(repoUrl: string): Promise<{ token: string }> {\n const provider = DefaultGithubCredentialsProvider.fromIntegrations(\n this.integrations,\n );\n const creds = await provider.getCredentials({\n url: repoUrl,\n });\n if (!creds || !creds.token) {\n throw new Error(`Token not configured for 'github' provider`);\n }\n return {\n token: creds.token,\n };\n }\n\n async getRepositoryFromIntegrations(repoUrl: string): Promise<{\n repository?: GithubRepository;\n errors?: GithubFetchError[];\n }> {\n const { data, errors } = await fetchFromMatchedIntegration(\n this.integrationDeps,\n this.integrations,\n repoUrl,\n async (octokit, gitUrl) => {\n const resp = await octokit.rest.repos.get({\n owner: gitUrl.owner,\n repo: gitUrl.name,\n });\n const repo = resp?.data;\n if (!repo) {\n return undefined;\n }\n return {\n name: repo.name,\n full_name: repo.full_name,\n url: repo.url,\n html_url: repo.html_url,\n default_branch: repo.default_branch,\n updated_at: repo.updated_at,\n };\n },\n );\n\n return {\n repository: data,\n errors,\n };\n }\n\n async getOrganizationsFromIntegrations(\n pageNumber: number = DefaultPageNumber,\n pageSize: number = DefaultPageSize,\n search?: string,\n ): Promise<GithubOrganizationResponse> {\n const orgs = new Map<string, GithubOrganization>();\n const result = await fetchFromAllIntegrations(\n this.integrationDeps,\n this.integrations,\n {\n dataFetcher: async (\n octokit: Octokit,\n credential: ExtendedGithubCredentials,\n ghConfig: GithubIntegrationConfig,\n ) => {\n const dataFetchErrors = new Map<number, GithubFetchError>();\n const resp = isGithubAppCredential(credential)\n ? await addGithubAppOrgs(\n {\n logger: this.logger,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n octokit,\n ghConfig,\n {\n credentialAccountLogin: credential.accountLogin,\n search,\n orgs,\n errors: dataFetchErrors,\n },\n )\n : await addGithubTokenOrgs(\n {\n logger: this.logger,\n },\n octokit,\n credential,\n {\n search,\n orgs,\n pageNumber,\n pageSize,\n errors: dataFetchErrors,\n },\n );\n\n this.logger.debug(\n `Got ${resp.totalCount} org(s) for ${ghConfig.host}`,\n );\n return {\n result: resp.totalCount ?? 0,\n errors: Array.from(dataFetchErrors.values()),\n };\n },\n },\n );\n\n const orgList = Array.from(orgs.values());\n const totalCount = computeTotalCount(orgList, result.data, pageSize);\n return {\n organizations: orgList,\n errors: Array.from(result.errors?.values() ?? []),\n totalCount,\n };\n }\n\n private async fetchUserTokenGithubIntegrationRepositories(\n userTokens: Record<string, string>,\n fetcher: (\n octokit: Octokit,\n credential: GithubCredentials,\n errors: Map<number, GithubFetchError>,\n ) => Promise<{ totalCount?: number }>,\n ): Promise<{ errors: GithubFetchError[]; totalCount: number | undefined }> {\n const allErrors: GithubFetchError[] = [];\n let totalCount: number | undefined;\n const ghConfigs = this.integrations.github.list().map(i => i.config);\n for (const ghConfig of ghConfigs) {\n const hostUrl = `https://${ghConfig.host}`;\n const token = userTokens[hostUrl];\n if (!token) {\n continue;\n }\n // Synthesize a token credential — same shape buildOcto already accepts\n const userCredential: GithubCredentials = { token, type: 'token' };\n\n // Intentionally no cache: user-token requests must not share the\n // server-credential ETag cache to avoid cross-user data leakage.\n const userOctokit = buildOcto(\n { logger: this.logger, cache: undefined },\n { credential: userCredential },\n ghConfig.apiBaseUrl,\n );\n if (!userOctokit) {\n continue;\n }\n const dataFetchErrors = new Map<number, GithubFetchError>();\n const result = await fetcher(\n userOctokit,\n userCredential,\n dataFetchErrors,\n );\n totalCount = (totalCount ?? 0) + (result.totalCount ?? 0);\n dataFetchErrors.forEach(err => allErrors.push(err));\n }\n return { errors: allErrors, totalCount };\n }\n\n async getOrgRepositoriesFromIntegrations(\n orgName: string,\n search?: string,\n pageNumber: number = DefaultPageNumber,\n pageSize: number = DefaultPageSize,\n userTokens?: Record<string, string>,\n ): Promise<GithubRepositoryResponse> {\n const repositories = new Map<string, GithubRepository>();\n\n // When a user token is present, build a user-scoped Octokit per integration\n // config and call addGithubTokenOrgRepositories with it. This scopes the\n // listing to repositories the user has access to within the given organization.\n // When absent, fall through to the existing server-credential path.\n if (userTokens && Object.keys(userTokens).length > 0) {\n const { errors: allErrors, totalCount } =\n await this.fetchUserTokenGithubIntegrationRepositories(\n userTokens,\n (userOctokit, userCredential, dataFetchErrors) =>\n addGithubTokenOrgRepositories(\n { logger: this.logger },\n userOctokit,\n userCredential,\n orgName,\n repositories,\n dataFetchErrors,\n { search, pageNumber, pageSize },\n ),\n );\n const repoList = Array.from(repositories.values());\n return { repositories: repoList, errors: allErrors, totalCount };\n }\n\n const result = await fetchFromAllIntegrations(\n this.integrationDeps,\n this.integrations,\n {\n dataFetcher: async (\n octokit: Octokit,\n credential: ExtendedGithubCredentials,\n ghConfig: GithubIntegrationConfig,\n ) => {\n const dataFetchErrors = new Map<number, GithubFetchError>();\n let resp: { totalCount?: number };\n if (isGithubAppCredential(credential)) {\n if (credential.accountLogin !== orgName) {\n return {};\n }\n resp = await addGithubAppRepositories(\n {\n logger: this.logger,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n octokit,\n credential,\n repositories,\n dataFetchErrors,\n {\n search,\n },\n );\n } else {\n resp = await addGithubTokenOrgRepositories(\n {\n logger: this.logger,\n },\n octokit,\n credential,\n orgName,\n repositories,\n dataFetchErrors,\n {\n search,\n },\n );\n }\n this.logger.debug(\n `Got ${resp.totalCount} org repo(s) for ${ghConfig.host}`,\n );\n return {\n stopFetchingData: true,\n result: resp.totalCount ?? 0,\n errors: Array.from(dataFetchErrors.values()),\n };\n },\n },\n );\n\n return this.buildRepositoryResponse(repositories, result, pageSize);\n }\n\n /**\n * Returns GithubRepositoryResponse containing:\n * - a list of unique repositories the github integrations have access to\n * - a list of errors encountered by each app and/or token (if any exist)\n */\n async getRepositoriesFromIntegrations(\n search?: string,\n userTokens?: Record<string, string>,\n ): Promise<GithubRepositoryResponse> {\n const repositories = new Map<string, GithubRepository>();\n\n // When a user token is present, build a user-scoped Octokit per integration\n // config and call addGithubTokenRepositories with it. This makes\n // listForAuthenticatedUser return only repos the user personally has access to.\n // When absent, fall through to the existing server-credential path.\n if (userTokens && Object.keys(userTokens).length > 0) {\n const { errors: allErrors, totalCount } =\n await this.fetchUserTokenGithubIntegrationRepositories(\n userTokens,\n (userOctokit, userCredential, dataFetchErrors) =>\n addGithubTokenRepositories(\n { logger: this.logger },\n userOctokit,\n userCredential,\n repositories,\n dataFetchErrors,\n { search },\n ),\n );\n const repoList = Array.from(repositories.values());\n return { repositories: repoList, errors: allErrors, totalCount };\n }\n\n const result = await fetchFromAllIntegrations(\n this.integrationDeps,\n this.integrations,\n {\n dataFetcher: async (\n octokit: Octokit,\n credential: ExtendedGithubCredentials,\n ghConfig: GithubIntegrationConfig,\n ) => {\n const dataFetchErrors = new Map<number, GithubFetchError>();\n const resp = isGithubAppCredential(credential)\n ? await addGithubAppRepositories(\n {\n logger: this.logger,\n githubCredentialsProvider: this.githubCredentialsProvider,\n },\n octokit,\n credential,\n repositories,\n dataFetchErrors,\n {\n search,\n },\n )\n : await addGithubTokenRepositories(\n {\n logger: this.logger,\n },\n octokit,\n credential,\n repositories,\n dataFetchErrors,\n {\n search,\n },\n );\n this.logger.debug(\n `Got ${resp.totalCount} repo(s) for ${ghConfig.host}`,\n );\n return {\n result: resp.totalCount ?? 0,\n errors: Array.from(dataFetchErrors.values()),\n };\n },\n },\n );\n\n return this.buildRepositoryResponse(repositories, result, DefaultPageSize);\n }\n\n async filterLocationsAccessibleFromIntegrations(\n locationUrls: string[],\n ): Promise<string[]> {\n const locationGitOwnerMap = extractLocationOwnerMap(locationUrls);\n\n const allAccessibleAppOrgs = new Set<string>();\n const allAccessibleTokenOrgs = new Set<string>();\n const allAccessibleUsernames = new Set<string>();\n await fetchFromAllIntegrations(this.integrationDeps, this.integrations, {\n dataFetcher: async (\n octokit: Octokit,\n credential: ExtendedGithubCredentials,\n ghConfig: GithubIntegrationConfig,\n ) => {\n if (isGithubAppCredential(credential)) {\n const appOrgMap = await getAllAppOrgs(\n this.githubCredentialsProvider,\n ghConfig,\n credential.accountLogin,\n );\n for (const [_, ghOrg] of appOrgMap) {\n allAccessibleAppOrgs.add(ghOrg.name);\n }\n } else {\n // find authenticated GitHub owner...\n const username = (await octokit.rest.users.getAuthenticated())?.data\n ?.login;\n if (username) {\n allAccessibleUsernames.add(username);\n }\n // ... along with orgs accessible from the token auth\n (await octokit.paginate(octokit.rest.orgs.listForAuthenticatedUser))\n ?.map(org => org.login)\n ?.forEach(orgName => allAccessibleTokenOrgs.add(orgName));\n }\n return {};\n },\n });\n\n return locationUrls.filter(loc => {\n if (!locationGitOwnerMap.has(loc)) {\n return false;\n }\n const owner = locationGitOwnerMap.get(loc)!;\n return (\n allAccessibleAppOrgs.has(owner) ||\n allAccessibleTokenOrgs.has(owner) ||\n allAccessibleUsernames.has(owner)\n );\n });\n }\n\n async getPullRequest(\n repoUrl: string,\n pullRequestNumber: number,\n ): Promise<{\n title?: string;\n body?: string;\n merged?: boolean;\n lastUpdated?: string;\n prSha?: string;\n prBranch?: string;\n }> {\n const { data } = await fetchFromMatchedIntegration(\n this.integrationDeps,\n this.integrations,\n repoUrl,\n async (octokit, gitUrl) => {\n try {\n const resp = await octokit.rest.pulls.get({\n owner: gitUrl.owner,\n repo: gitUrl.name,\n pull_number: pullRequestNumber,\n });\n const pr = resp.data;\n return {\n title: pr.title,\n body: pr.body ?? undefined,\n merged: pr.merged,\n lastUpdated: pr.updated_at,\n prSha: pr.head.sha,\n prBranch: pr.head.ref,\n };\n } catch (error: any) {\n logErrorIfNeeded(this.logger, 'Error fetching pull requests', error);\n return undefined;\n }\n },\n );\n return data ?? {};\n }\n\n async updatePullRequest(\n repoUrl: string,\n pullRequestNumber: number,\n title?: string,\n body?: string,\n ): Promise<void> {\n await fetchFromMatchedIntegration(\n this.integrationDeps,\n this.integrations,\n repoUrl,\n async (octokit, gitUrl) => {\n try {\n await octokit.rest.pulls.update({\n owner: gitUrl.owner,\n repo: gitUrl.name,\n pull_number: pullRequestNumber,\n title: title,\n body: body,\n });\n return;\n } catch (error: any) {\n logErrorIfNeeded(this.logger, 'Error updating pull requests', error);\n throw error;\n }\n },\n );\n }\n\n async createOrUpdateFileInBranch(\n owner: string,\n repo: string,\n branchName: string,\n fileName: string,\n fileContent: string,\n ): Promise<void> {\n try {\n const ghConfig = this.integrations.github.byUrl(\n `https://github.com/${owner}/${repo}`,\n )?.config;\n if (!ghConfig) {\n throw new Error(\n `Could not find GH integration from https://github.com/${owner}/${repo}`,\n );\n }\n\n const credentials =\n await this.githubCredentialsProvider.getAllCredentials({\n host: ghConfig.host,\n });\n\n if (credentials.length === 0) {\n throw new Error(`No credentials for GH integration`);\n }\n\n for (const credential of credentials) {\n const octokit = buildOcto(\n {\n logger: this.logger,\n cache: this.cache,\n },\n { credential, owner },\n ghConfig.apiBaseUrl,\n );\n if (!octokit) {\n continue;\n }\n\n try {\n const { data: existingFile } = await octokit.rest.repos.getContent({\n owner: owner,\n repo: repo,\n path: fileName,\n ref: branchName,\n });\n // Response can either be a directory (array of files) or a single file element. In this case, we ensure it has the sha property to update it.\n if (Array.isArray(existingFile) || !('sha' in existingFile)) {\n throw new Error(\n `The content at path ${fileName} is not a file or the response from GitHub does not contain the 'sha' property.`,\n );\n }\n // If the file already exists, update it\n await octokit.rest.repos.createOrUpdateFileContents({\n owner,\n repo,\n path: fileName,\n message: `Add ${fileName} config file`,\n content: btoa(fileContent),\n sha: existingFile.sha,\n branch: branchName,\n });\n } catch (error: any) {\n if (error.status === 404) {\n // If the file does not exist, create it\n await octokit.rest.repos.createOrUpdateFileContents({\n owner,\n repo,\n path: fileName,\n message: `Add ${fileName} config file`,\n content: btoa(fileContent),\n branch: branchName,\n });\n } else {\n throw error;\n }\n }\n }\n } catch (error: any) {\n this.logger.error(\n `Error creating or updating file in branch ${branchName}`,\n error,\n );\n throw error;\n }\n }\n\n async findImportOpenPr(\n logger: LoggerService,\n input: {\n repoUrl: string;\n includeCatalogInfoContent?: boolean;\n },\n ): Promise<{\n prNum?: number;\n prUrl?: string;\n prTitle?: string;\n prBody?: string;\n prCatalogInfoContent?: string;\n lastUpdate?: string;\n }> {\n const branchName = getBranchName(this.config);\n const { data } = await fetchFromMatchedIntegration(\n this.integrationDeps,\n this.integrations,\n input.repoUrl,\n async (octokit, gitUrl) => {\n try {\n return await findOpenPRForBranch(\n logger,\n this.config,\n octokit,\n gitUrl.organization,\n gitUrl.name,\n branchName,\n input.includeCatalogInfoContent,\n );\n } catch (error: any) {\n logErrorIfNeeded(this.logger, 'Error fetching pull requests', error);\n return undefined;\n }\n },\n );\n return data ?? {};\n }\n\n async getCatalogInfoFile(\n logger: LoggerService,\n input: {\n repoUrl: string;\n prNumber: number;\n prHeadSha: string;\n },\n ): Promise<string | undefined> {\n const { data } = await fetchFromMatchedIntegration(\n this.integrationDeps,\n this.integrations,\n input.repoUrl,\n async (octokit, gitUrl) => {\n try {\n return await getCatalogInfoContentFromPR(\n logger,\n this.config,\n octokit,\n gitUrl.organization,\n gitUrl.name,\n input.prNumber,\n input.prHeadSha,\n );\n } catch (error: any) {\n logErrorIfNeeded(\n this.logger,\n 'Error fetching catalog info file content requests',\n error,\n );\n return undefined;\n }\n },\n );\n return data;\n }\n\n async submitPrToRepo(\n logger: LoggerService,\n input: {\n repoUrl: string;\n gitUrl: gitUrlParse.GitUrl;\n defaultBranch?: string;\n prTitle: string;\n prBody: string;\n catalogInfoContent: string;\n },\n ): Promise<{\n prUrl?: string;\n prNumber?: number;\n hasChanges?: boolean;\n lastUpdate?: string;\n errors?: string[];\n }> {\n const fileName = getCatalogFilename(this.config);\n const errors: any[] = [];\n\n const result = await executeFunctionOnFirstSuccessfulIntegration(\n this.executionDeps,\n this.integrations,\n {\n repoUrl: input.repoUrl,\n fn: async (\n validatedRepo: ValidatedRepo,\n octo: Octokit,\n ): Promise<{\n successful: boolean;\n result?: {\n prUrl?: string;\n prNumber?: number;\n hasChanges?: boolean;\n lastUpdate?: string;\n };\n }> => {\n const { owner, repo, branchName } = validatedRepo;\n try {\n // Check if there is already a catalogInfo in the default branch\n const catalogInfoFileExists = await fileExistsInDefaultBranch(\n logger,\n octo,\n owner,\n repo,\n fileName,\n input.defaultBranch,\n );\n if (catalogInfoFileExists) {\n // No need to create a PR => component will be imported as is\n return {\n successful: true,\n result: {\n hasChanges: false,\n },\n };\n }\n\n const existingPrForBranch = await findOpenPRForBranch(\n logger,\n this.config,\n octo,\n owner,\n repo,\n branchName,\n );\n\n const repoData = await octo.rest.repos.get({\n owner,\n repo,\n });\n const parentRef = await octo.rest.git.getRef({\n owner,\n repo,\n ref: `heads/${repoData.data.default_branch}`,\n });\n if (existingPrForBranch.prNum) {\n await this.createOrUpdateFileInBranch(\n owner,\n repo,\n branchName,\n fileName,\n input.catalogInfoContent,\n );\n const pullRequestResponse = await octo.rest.pulls.update({\n owner,\n repo,\n pull_number: existingPrForBranch.prNum,\n title: input.prTitle,\n body: input.prBody,\n head: branchName,\n base: repoData.data.default_branch,\n });\n return {\n successful: true,\n result: {\n prNumber: existingPrForBranch.prNum,\n prUrl: pullRequestResponse.data.html_url,\n lastUpdate: pullRequestResponse.data.updated_at,\n },\n };\n }\n\n let branchExists = false;\n try {\n await octo.rest.git.getRef({\n owner,\n repo,\n ref: `heads/${branchName}`,\n });\n branchExists = true;\n } catch (error: any) {\n if (error.status === 404) {\n await octo.rest.git.createRef({\n owner,\n repo,\n ref: `refs/heads/${branchName}`,\n sha: parentRef.data.object.sha,\n });\n } else {\n throw error;\n }\n }\n\n if (branchExists) {\n // update it in case it is outdated compared to the base branch\n try {\n await octo.repos.merge({\n owner: owner,\n repo: repo,\n base: branchName,\n head: repoData.data.default_branch,\n });\n } catch (error: any) {\n logErrorIfNeeded(\n this.logger,\n `Could not merge default branch ${repoData.data.default_branch} into import branch ${branchName}`,\n error,\n );\n }\n }\n\n await this.createOrUpdateFileInBranch(\n owner,\n repo,\n branchName,\n fileName,\n input.catalogInfoContent,\n );\n\n const pullRequestResponse = await octo.rest.pulls.create({\n owner,\n repo,\n title: input.prTitle,\n body: input.prBody,\n head: branchName,\n base: repoData.data.default_branch,\n });\n return {\n successful: true,\n result: {\n prNumber: pullRequestResponse.data.number,\n prUrl: pullRequestResponse.data.html_url,\n lastUpdate: pullRequestResponse.data.updated_at,\n hasChanges: true,\n },\n };\n } catch (e: any) {\n logErrorIfNeeded(\n this.logger,\n `Couldn't create PR in ${input.repoUrl}`,\n e,\n );\n errors.push(e.message);\n return { successful: false };\n }\n },\n },\n );\n\n if (result) {\n return result;\n }\n\n logger.warn(\n `Tried all possible GitHub credentials, but could not create PR in ${input.repoUrl}. Please try again later...`,\n );\n\n return {\n errors: errors,\n };\n }\n\n async hasFileInRepo(input: {\n repoUrl: string;\n defaultBranch?: string;\n fileName: string;\n }): Promise<boolean> {\n const fileExists = await executeFunctionOnFirstSuccessfulIntegration(\n this.executionDeps,\n this.integrations,\n {\n repoUrl: input.repoUrl,\n fn: async (validatedRepo: ValidatedRepo, octo: Octokit) => {\n const { owner, repo } = validatedRepo;\n const exists = await fileExistsInDefaultBranch(\n this.logger,\n octo,\n owner,\n repo,\n input.fileName,\n input.defaultBranch,\n );\n if (exists === undefined) {\n return { successful: false };\n }\n return { successful: true, result: exists };\n },\n },\n );\n\n if (fileExists === undefined) {\n throw new Error(\n `Could not determine if repo at ${input.repoUrl} already has a file named ${input.fileName} in its default branch (${input.defaultBranch})`,\n );\n }\n\n return fileExists;\n }\n\n async closeImportPR(\n logger: LoggerService,\n input: {\n repoUrl: string;\n gitUrl: gitUrlParse.GitUrl;\n comment: string;\n },\n ): Promise<void> {\n await executeFunctionOnFirstSuccessfulIntegration(\n this.executionDeps,\n this.integrations,\n {\n repoUrl: input.repoUrl,\n fn: async (validatedRepo: ValidatedRepo, octo: Octokit) => {\n const { owner, repo, branchName } = validatedRepo;\n try {\n const existingPrForBranch = await findOpenPRForBranch(\n logger,\n this.config,\n octo,\n owner,\n repo,\n branchName,\n );\n if (existingPrForBranch.prNum) {\n await closePRWithComment(\n octo,\n owner,\n repo,\n existingPrForBranch.prNum,\n input.comment,\n );\n }\n return { successful: true };\n } catch (e: any) {\n logErrorIfNeeded(\n this.logger,\n `Couldn't close PR in ${input.repoUrl}`,\n e,\n );\n return { successful: false };\n }\n },\n },\n );\n }\n\n async deleteImportBranch(input: {\n repoUrl: string;\n gitUrl: gitUrlParse.GitUrl;\n }): Promise<void> {\n await executeFunctionOnFirstSuccessfulIntegration(\n this.executionDeps,\n this.integrations,\n {\n repoUrl: input.repoUrl,\n fn: async (validatedRepo: ValidatedRepo, octo: Octokit) => {\n const { owner, repo, branchName } = validatedRepo;\n try {\n await octo.git.deleteRef({\n owner: owner,\n repo: repo,\n ref: `heads/${branchName}`,\n });\n return { successful: true };\n } catch (e: any) {\n logErrorIfNeeded(\n this.logger,\n `Couldn't close import PR and/or delete import branch in ${input.repoUrl}`,\n e,\n );\n return { successful: false };\n }\n },\n },\n );\n }\n\n async isRepoEmpty(input: { repoUrl: string }): Promise<boolean | undefined> {\n return await executeFunctionOnFirstSuccessfulIntegration(\n this.executionDeps,\n this.integrations,\n {\n repoUrl: input.repoUrl,\n fn: async (validatedRepo: ValidatedRepo, octo: Octokit) => {\n const { owner, repo } = validatedRepo;\n const resp = await octo.rest.repos.listContributors({\n owner: owner,\n repo: repo,\n page: 1,\n per_page: 1,\n });\n const status = resp.status as 200 | 204;\n return { successful: true, result: status === 204 };\n },\n },\n );\n }\n}\n"],"names":["ScmIntegrations","CustomGithubCredentialsProvider","computeTotalCount","DefaultGithubCredentialsProvider","fetchFromMatchedIntegration","DefaultPageNumber","DefaultPageSize","fetchFromAllIntegrations","isGithubAppCredential","addGithubAppOrgs","addGithubTokenOrgs","buildOcto","addGithubTokenOrgRepositories","addGithubAppRepositories","addGithubTokenRepositories","extractLocationOwnerMap","getAllAppOrgs","logErrorIfNeeded","getBranchName","findOpenPRForBranch","getCatalogInfoContentFromPR","getCatalogFilename","executeFunctionOnFirstSuccessfulIntegration","fileExistsInDefaultBranch","pullRequestResponse","closePRWithComment"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.cjs.js","sources":["../../src/github/types.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { SerializedError } from '@backstage/errors';\nimport type {\n GithubCredentials,\n GithubCredentialsProvider,\n} from '@backstage/integration';\n\n// From https://docs.github.com/en/rest/orgs/orgs?apiVersion=2022-11-28#list-organizations\nexport type GithubOrganization = {\n name: string;\n id: number;\n description?: string;\n url?: string;\n html_url?: string;\n repos_url?: string;\n events_url?: string;\n hooks_url?: string;\n issues_url?: string;\n members_url?: string;\n public_members_url?: string;\n avatar_url?: string;\n public_repos?: number;\n total_private_repos?: number;\n /**\n * Number of internal repositories, accessible to all members in a GH enterprise\n */\n owned_private_repos?: number;\n};\n\nexport type GithubRepository = {\n name: string;\n /**\n * The full name of the repository in the form of owner/repo\n */\n full_name: string;\n /**\n * The API url to the repository\n */\n url: string;\n /**\n * The HTML URL to the repository\n */\n html_url: string;\n /**\n * The default \"main\" branch of the repository to place the `catalog-info.yaml` file into\n */\n default_branch: string;\n /**\n * The date-time the repository was last updated at\n */\n updated_at?: string | null;\n};\n\n/**\n * The type of credentials produced by the credential provider.\n *\n * @public\n */\n\nexport type GithubFetchError =\n | {\n type: 'app';\n appId: number;\n error: SerializedError;\n }\n | {\n type: 'token';\n error: SerializedError;\n };\n\nexport type GithubOrganizationResponse = {\n organizations: GithubOrganization[];\n errors: GithubFetchError[];\n totalCount?: number;\n};\n\nexport type GithubRepositoryResponse = {\n repositories: GithubRepository[];\n errors: GithubFetchError[];\n totalCount?: number;\n};\n\nexport type AppCredentialFetchResult = AppCredential | AppCredentialError;\n\nexport type AppCredential = {\n appId: number;\n accessToken: string | undefined;\n installationAccountLogin?: string;\n};\nexport type AppCredentialError = { appId: number; error: Error };\n\nexport type ExtendedGithubCredentials =\n | GithubCredentials\n | GithubAppCredentials\n | GithubAppError;\n\nexport type GithubAppCredentials = GithubCredentials & {\n type: 'app';\n appId: number;\n accountLogin?: string;\n};\n\nexport type GithubAppError = {\n type: 'app';\n appId: number;\n error: Error;\n};\n\nexport function isGithubAppCredential(\n credential: ExtendedGithubCredentials,\n): credential is GithubAppCredentials {\n return 'appId' in credential && credential.type === 'app';\n}\n\nexport interface ExtendedGithubCredentialsProvider extends GithubCredentialsProvider {\n getAllCredentials: (options: {\n host: string;\n }) => Promise<ExtendedGithubCredentials[]>;\n}\n"],"names":[],"mappings":";;AA2HO,SAAS,sBACd,UAAA,EACoC;AACpC,EAAA,OAAO,OAAA,IAAW,UAAA,IAAc,UAAA,CAAW,IAAA,KAAS,KAAA;AACtD;;;;"}
1
+ {"version":3,"file":"types.cjs.js","sources":["../../src/github/types.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n GithubCredentials,\n GithubCredentialsProvider,\n} from '@backstage/integration';\n\nimport { type RestEndpointMethodTypes } from '@octokit/rest';\n\nexport type {\n SCMFetchError as GithubFetchError,\n SCMOrganization as GithubOrganization,\n SCMOrganizationResponse as GithubOrganizationResponse,\n SCMRepository as GithubRepository,\n SCMRepositoryResponse as GithubRepositoryResponse,\n} from '../scm/types';\n\nexport type AppCredentialFetchResult = AppCredential | AppCredentialError;\n\nexport type AppCredential = {\n appId: number;\n accessToken: string | undefined;\n installationAccountLogin?: string;\n};\nexport type AppCredentialError = { appId: number; error: Error };\n\nexport type ExtendedGithubCredentials =\n | GithubCredentials\n | GithubAppCredentials\n | GithubAppError;\n\nexport type GithubAppCredentials = GithubCredentials & {\n type: 'app';\n appId: number;\n accountLogin?: string;\n};\n\nexport type GithubAppError = {\n type: 'app';\n appId: number;\n error: Error;\n};\n\nexport function isGithubAppCredential(\n credential: ExtendedGithubCredentials,\n): credential is GithubAppCredentials {\n return 'appId' in credential && credential.type === 'app';\n}\n\nexport interface ExtendedGithubCredentialsProvider extends GithubCredentialsProvider {\n getAllCredentials: (options: {\n host: string;\n }) => Promise<ExtendedGithubCredentials[]>;\n}\n\nexport type AuthenticatedUserRepositoryResponse =\n RestEndpointMethodTypes['repos']['listForAuthenticatedUser']['response'];\n\nexport type AuthenticatedUserRepositoryList =\n AuthenticatedUserRepositoryResponse['data'];\n\nexport type AppInstallationRepositoriesResponse =\n RestEndpointMethodTypes['apps']['listReposAccessibleToInstallation']['response'];\n\nexport type AppInstallationRepositories =\n AppInstallationRepositoriesResponse['data'];\n"],"names":[],"mappings":";;AAyDO,SAAS,sBACd,UAAA,EACoC;AACpC,EAAA,OAAO,OAAA,IAAW,UAAA,IAAc,UAAA,CAAW,IAAA,KAAS,KAAA;AACtD;;;;"}
@@ -42,7 +42,7 @@ function registerHooks(deps, octokit) {
42
42
  };
43
43
  }
44
44
  const cacheKey = extractCacheKey(options);
45
- const existingEtag = await deps.cache.get(cacheKey)?.then((val) => val?.etag);
45
+ const existingEtag = await deps.cache?.get(cacheKey)?.then((val) => val?.etag);
46
46
  if (existingEtag) {
47
47
  options.headers["If-None-Match"] = existingEtag;
48
48
  } else {
@@ -54,7 +54,7 @@ function registerHooks(deps, octokit) {
54
54
  `[GH API] ${options.method} ${tryReplacingPlaceholdersInUrl(options)}: ${response.status}`
55
55
  );
56
56
  const cacheKey = extractCacheKey(options);
57
- await deps.cache.set(
57
+ await deps.cache?.set(
58
58
  cacheKey,
59
59
  {
60
60
  etag: response.headers.etag,
@@ -70,7 +70,7 @@ function registerHooks(deps, octokit) {
70
70
  if (error.status !== 304) {
71
71
  throw error;
72
72
  }
73
- return await deps.cache.get(extractCacheKey(options));
73
+ return await deps.cache?.get(extractCacheKey(options));
74
74
  });
75
75
  }
76
76
  function tryReplacingPlaceholdersInUrl(options) {
@@ -1 +1 @@
1
- {"version":3,"file":"ghUtils.cjs.js","sources":["../../../src/github/utils/ghUtils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n CacheService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\n\nimport { Octokit } from '@octokit/rest';\n\nimport {\n isGithubAppCredential,\n type ExtendedGithubCredentials,\n type GithubFetchError,\n} from '../types';\nimport { createCredentialError } from './utils';\n\nconst GITHUB_DEFAULT_API_ENDPOINT = 'https://api.github.com';\n\n// Cache TTL per entry added, based on the lower values of rate limits imposed by GH,\n// i.e., 5K requests per hour for requests using a personal token.\n// GitHub Apps owned by enterprises have a higher limit of 15K per hour.\n// See https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api?apiVersion=2022-11-28\nconst RESPONSE_CACHE_TTL_MILLIS = 60 * 60 * 1000;\n\nexport function buildOcto(\n deps: {\n logger: LoggerService;\n cache: CacheService;\n },\n input: {\n credential: ExtendedGithubCredentials;\n owner?: string;\n errors?: Map<number, GithubFetchError>;\n },\n apiBaseUrl: string = GITHUB_DEFAULT_API_ENDPOINT,\n): Octokit | undefined {\n if ('error' in input.credential) {\n if (input.credential.error?.name !== 'NotFoundError') {\n deps.logger.error(\n `Obtaining the Access Token Github App with appId: ${input.credential.appId} failed with ${input.credential.error}`,\n );\n const credentialError = createCredentialError(input.credential);\n if (credentialError) {\n deps.logger.debug(`${input.credential.appId}: ${credentialError}`);\n if (input.errors) {\n input.errors.set(input.credential.appId, credentialError);\n }\n }\n }\n return undefined;\n }\n if (\n isGithubAppCredential(input.credential) &&\n input.owner &&\n input.credential.accountLogin !== input.owner\n ) {\n return undefined;\n }\n const octokit = new Octokit({\n baseUrl: apiBaseUrl,\n auth: input.credential.token,\n });\n registerHooks(deps, octokit);\n return octokit;\n}\n\nfunction registerHooks(\n deps: {\n logger: LoggerService;\n cache: CacheService;\n },\n octokit: Octokit,\n) {\n const extractCacheKey = (options: any) =>\n `${options.method}--${tryReplacingPlaceholdersInUrl(options)}`;\n\n octokit.hook.before('request', async options => {\n if (!options.headers) {\n options.headers = {\n accept: 'application/json',\n 'user-agent': 'rhdh/bulk-import',\n };\n }\n // Use ETag from in-memory cache if available\n const cacheKey = extractCacheKey(options);\n const existingEtag = await deps.cache\n .get(cacheKey)\n ?.then((val?: any) => val?.etag);\n if (existingEtag) {\n options.headers['If-None-Match'] = existingEtag;\n } else {\n deps.logger.debug(`cache miss for key \"${cacheKey}\"`);\n }\n });\n\n octokit.hook.after('request', async (response, options) => {\n deps.logger.debug(\n `[GH API] ${options.method} ${tryReplacingPlaceholdersInUrl(options)}: ${\n response.status\n }`,\n );\n // If we get a successful response, the resource has changed, so update the in-memory cache\n const cacheKey = extractCacheKey(options);\n await deps.cache.set(\n cacheKey,\n {\n etag: response.headers.etag,\n ...response,\n },\n { ttl: RESPONSE_CACHE_TTL_MILLIS },\n );\n });\n\n octokit.hook.error('request', async (error: any, options) => {\n deps.logger.debug(\n `[GH API] ${options.method} ${tryReplacingPlaceholdersInUrl(options)}: ${\n error.status\n }`,\n );\n if (error.status !== 304) {\n throw error;\n }\n // \"304 Not Modified\" means that the resource hasn't changed,\n // and we should have a version of it in the cache\n return await deps.cache.get(extractCacheKey(options));\n });\n}\n\nfunction tryReplacingPlaceholdersInUrl(options: any) {\n // options.url might contain placeholders => need to replace them with their actual values to not get colliding keys\n\n let result = '';\n let startIdx = 0;\n\n const url = options.url as string | undefined;\n if (!url) {\n return undefined;\n }\n while (startIdx < url.length) {\n const openBraceIdx = url.indexOf('{', startIdx);\n if (openBraceIdx === -1) {\n // no '{' => append the rest of the string\n result += url.slice(startIdx);\n break;\n }\n\n // append part of the string before '{'\n result += url.slice(startIdx, openBraceIdx);\n\n const closeBraceIdx = url.indexOf('}', openBraceIdx);\n if (closeBraceIdx === -1) {\n // no '}' => append the rest of the string\n result += url.slice(openBraceIdx);\n break;\n }\n\n const key = url.slice(openBraceIdx + 1, closeBraceIdx);\n result += options[key] ?? `{${key}}`;\n\n startIdx = closeBraceIdx + 1;\n }\n\n return result;\n}\n"],"names":["createCredentialError","isGithubAppCredential","Octokit"],"mappings":"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"}
1
+ {"version":3,"file":"ghUtils.cjs.js","sources":["../../../src/github/utils/ghUtils.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type {\n CacheService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\n\nimport { Octokit } from '@octokit/rest';\n\nimport {\n isGithubAppCredential,\n type ExtendedGithubCredentials,\n type GithubFetchError,\n} from '../types';\nimport { createCredentialError } from './utils';\n\nconst GITHUB_DEFAULT_API_ENDPOINT = 'https://api.github.com';\n\n// Cache TTL per entry added, based on the lower values of rate limits imposed by GH,\n// i.e., 5K requests per hour for requests using a personal token.\n// GitHub Apps owned by enterprises have a higher limit of 15K per hour.\n// See https://docs.github.com/en/rest/using-the-rest-api/rate-limits-for-the-rest-api?apiVersion=2022-11-28\nconst RESPONSE_CACHE_TTL_MILLIS = 60 * 60 * 1000;\n\nexport function buildOcto(\n deps: {\n logger: LoggerService;\n cache: CacheService | undefined;\n },\n input: {\n credential: ExtendedGithubCredentials;\n owner?: string;\n errors?: Map<number, GithubFetchError>;\n },\n apiBaseUrl: string = GITHUB_DEFAULT_API_ENDPOINT,\n): Octokit | undefined {\n if ('error' in input.credential) {\n if (input.credential.error?.name !== 'NotFoundError') {\n deps.logger.error(\n `Obtaining the Access Token Github App with appId: ${input.credential.appId} failed with ${input.credential.error}`,\n );\n const credentialError = createCredentialError(input.credential);\n if (credentialError) {\n deps.logger.debug(`${input.credential.appId}: ${credentialError}`);\n if (input.errors) {\n input.errors.set(input.credential.appId, credentialError);\n }\n }\n }\n return undefined;\n }\n if (\n isGithubAppCredential(input.credential) &&\n input.owner &&\n input.credential.accountLogin !== input.owner\n ) {\n return undefined;\n }\n const octokit = new Octokit({\n baseUrl: apiBaseUrl,\n auth: input.credential.token,\n });\n registerHooks(deps, octokit);\n return octokit;\n}\n\nfunction registerHooks(\n deps: {\n logger: LoggerService;\n cache: CacheService | undefined;\n },\n octokit: Octokit,\n) {\n const extractCacheKey = (options: any) =>\n `${options.method}--${tryReplacingPlaceholdersInUrl(options)}`;\n\n octokit.hook.before('request', async options => {\n if (!options.headers) {\n options.headers = {\n accept: 'application/json',\n 'user-agent': 'rhdh/bulk-import',\n };\n }\n // Use ETag from in-memory cache if available\n const cacheKey = extractCacheKey(options);\n const existingEtag = await deps.cache\n ?.get(cacheKey)\n ?.then((val?: any) => val?.etag);\n if (existingEtag) {\n options.headers['If-None-Match'] = existingEtag;\n } else {\n deps.logger.debug(`cache miss for key \"${cacheKey}\"`);\n }\n });\n\n octokit.hook.after('request', async (response, options) => {\n deps.logger.debug(\n `[GH API] ${options.method} ${tryReplacingPlaceholdersInUrl(options)}: ${\n response.status\n }`,\n );\n // If we get a successful response, the resource has changed, so update the in-memory cache\n const cacheKey = extractCacheKey(options);\n await deps.cache?.set(\n cacheKey,\n {\n etag: response.headers.etag,\n ...response,\n },\n { ttl: RESPONSE_CACHE_TTL_MILLIS },\n );\n });\n\n octokit.hook.error('request', async (error: any, options) => {\n deps.logger.debug(\n `[GH API] ${options.method} ${tryReplacingPlaceholdersInUrl(options)}: ${\n error.status\n }`,\n );\n if (error.status !== 304) {\n throw error;\n }\n // \"304 Not Modified\" means that the resource hasn't changed,\n // and we should have a version of it in the cache\n return await deps.cache?.get(extractCacheKey(options));\n });\n}\n\nfunction tryReplacingPlaceholdersInUrl(options: any) {\n // options.url might contain placeholders => need to replace them with their actual values to not get colliding keys\n\n let result = '';\n let startIdx = 0;\n\n const url = options.url as string | undefined;\n if (!url) {\n return undefined;\n }\n while (startIdx < url.length) {\n const openBraceIdx = url.indexOf('{', startIdx);\n if (openBraceIdx === -1) {\n // no '{' => append the rest of the string\n result += url.slice(startIdx);\n break;\n }\n\n // append part of the string before '{'\n result += url.slice(startIdx, openBraceIdx);\n\n const closeBraceIdx = url.indexOf('}', openBraceIdx);\n if (closeBraceIdx === -1) {\n // no '}' => append the rest of the string\n result += url.slice(openBraceIdx);\n break;\n }\n\n const key = url.slice(openBraceIdx + 1, closeBraceIdx);\n result += options[key] ?? `{${key}}`;\n\n startIdx = closeBraceIdx + 1;\n }\n\n return result;\n}\n"],"names":["createCredentialError","isGithubAppCredential","Octokit"],"mappings":";;;;;;AA8BA,MAAM,2BAAA,GAA8B,wBAAA;AAMpC,MAAM,yBAAA,GAA4B,KAAK,EAAA,GAAK,GAAA;AAErC,SAAS,SAAA,CACd,IAAA,EAIA,KAAA,EAKA,UAAA,GAAqB,2BAAA,EACA;AACrB,EAAA,IAAI,OAAA,IAAW,MAAM,UAAA,EAAY;AAC/B,IAAA,IAAI,KAAA,CAAM,UAAA,CAAW,KAAA,EAAO,IAAA,KAAS,eAAA,EAAiB;AACpD,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,QACV,qDAAqD,KAAA,CAAM,UAAA,CAAW,KAAK,CAAA,aAAA,EAAgB,KAAA,CAAM,WAAW,KAAK,CAAA;AAAA,OACnH;AACA,MAAA,MAAM,eAAA,GAAkBA,2BAAA,CAAsB,KAAA,CAAM,UAAU,CAAA;AAC9D,MAAA,IAAI,eAAA,EAAiB;AACnB,QAAA,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,EAAG,KAAA,CAAM,WAAW,KAAK,CAAA,EAAA,EAAK,eAAe,CAAA,CAAE,CAAA;AACjE,QAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,UAAA,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,KAAA,CAAM,UAAA,CAAW,OAAO,eAAe,CAAA;AAAA,QAC1D;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,IACEC,2BAAA,CAAsB,KAAA,CAAM,UAAU,CAAA,IACtC,KAAA,CAAM,SACN,KAAA,CAAM,UAAA,CAAW,YAAA,KAAiB,KAAA,CAAM,KAAA,EACxC;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,MAAM,OAAA,GAAU,IAAIC,YAAA,CAAQ;AAAA,IAC1B,OAAA,EAAS,UAAA;AAAA,IACT,IAAA,EAAM,MAAM,UAAA,CAAW;AAAA,GACxB,CAAA;AACD,EAAA,aAAA,CAAc,MAAM,OAAO,CAAA;AAC3B,EAAA,OAAO,OAAA;AACT;AAEA,SAAS,aAAA,CACP,MAIA,OAAA,EACA;AACA,EAAA,MAAM,eAAA,GAAkB,CAAC,OAAA,KACvB,CAAA,EAAG,QAAQ,MAAM,CAAA,EAAA,EAAK,6BAAA,CAA8B,OAAO,CAAC,CAAA,CAAA;AAE9D,EAAA,OAAA,CAAQ,IAAA,CAAK,MAAA,CAAO,SAAA,EAAW,OAAM,OAAA,KAAW;AAC9C,IAAA,IAAI,CAAC,QAAQ,OAAA,EAAS;AACpB,MAAA,OAAA,CAAQ,OAAA,GAAU;AAAA,QAChB,MAAA,EAAQ,kBAAA;AAAA,QACR,YAAA,EAAc;AAAA,OAChB;AAAA,IACF;AAEA,IAAA,MAAM,QAAA,GAAW,gBAAgB,OAAO,CAAA;AACxC,IAAA,MAAM,YAAA,GAAe,MAAM,IAAA,CAAK,KAAA,EAC5B,GAAA,CAAI,QAAQ,CAAA,EACZ,IAAA,CAAK,CAAC,GAAA,KAAc,GAAA,EAAK,IAAI,CAAA;AACjC,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,OAAA,CAAQ,OAAA,CAAQ,eAAe,CAAA,GAAI,YAAA;AAAA,IACrC,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,oBAAA,EAAuB,QAAQ,CAAA,CAAA,CAAG,CAAA;AAAA,IACtD;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,OAAO,UAAU,OAAA,KAAY;AACzD,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,CAAA,SAAA,EAAY,QAAQ,MAAM,CAAA,CAAA,EAAI,8BAA8B,OAAO,CAAC,CAAA,EAAA,EAClE,QAAA,CAAS,MACX,CAAA;AAAA,KACF;AAEA,IAAA,MAAM,QAAA,GAAW,gBAAgB,OAAO,CAAA;AACxC,IAAA,MAAM,KAAK,KAAA,EAAO,GAAA;AAAA,MAChB,QAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,SAAS,OAAA,CAAQ,IAAA;AAAA,QACvB,GAAG;AAAA,OACL;AAAA,MACA,EAAE,KAAK,yBAAA;AAA0B,KACnC;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,SAAA,EAAW,OAAO,OAAY,OAAA,KAAY;AAC3D,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA;AAAA,MACV,CAAA,SAAA,EAAY,QAAQ,MAAM,CAAA,CAAA,EAAI,8BAA8B,OAAO,CAAC,CAAA,EAAA,EAClE,KAAA,CAAM,MACR,CAAA;AAAA,KACF;AACA,IAAA,IAAI,KAAA,CAAM,WAAW,GAAA,EAAK;AACxB,MAAA,MAAM,KAAA;AAAA,IACR;AAGA,IAAA,OAAO,MAAM,IAAA,CAAK,KAAA,EAAO,GAAA,CAAI,eAAA,CAAgB,OAAO,CAAC,CAAA;AAAA,EACvD,CAAC,CAAA;AACH;AAEA,SAAS,8BAA8B,OAAA,EAAc;AAGnD,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,QAAA,GAAW,CAAA;AAEf,EAAA,MAAM,MAAM,OAAA,CAAQ,GAAA;AACpB,EAAA,IAAI,CAAC,GAAA,EAAK;AACR,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,QAAA,GAAW,IAAI,MAAA,EAAQ;AAC5B,IAAA,MAAM,YAAA,GAAe,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,QAAQ,CAAA;AAC9C,IAAA,IAAI,iBAAiB,EAAA,EAAI;AAEvB,MAAA,MAAA,IAAU,GAAA,CAAI,MAAM,QAAQ,CAAA;AAC5B,MAAA;AAAA,IACF;AAGA,IAAA,MAAA,IAAU,GAAA,CAAI,KAAA,CAAM,QAAA,EAAU,YAAY,CAAA;AAE1C,IAAA,MAAM,aAAA,GAAgB,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,YAAY,CAAA;AACnD,IAAA,IAAI,kBAAkB,EAAA,EAAI;AAExB,MAAA,MAAA,IAAU,GAAA,CAAI,MAAM,YAAY,CAAA;AAChC,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,GAAA,GAAM,GAAA,CAAI,KAAA,CAAM,YAAA,GAAe,GAAG,aAAa,CAAA;AACrD,IAAA,MAAA,IAAU,OAAA,CAAQ,GAAG,CAAA,IAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,CAAA;AAEjC,IAAA,QAAA,GAAW,aAAA,GAAgB,CAAA;AAAA,EAC7B;AAEA,EAAA,OAAO,MAAA;AACT;;;;"}
@@ -9,13 +9,13 @@ require('just-kebab-case');
9
9
  var loggingUtils = require('../../helpers/loggingUtils.cjs.js');
10
10
  require('@backstage/catalog-model');
11
11
  var handlers = require('../../service/handlers/handlers.cjs.js');
12
- var orgUtils = require('./orgUtils.cjs.js');
13
12
  var utils = require('./utils.cjs.js');
14
13
 
15
14
  function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
16
15
 
17
16
  var gitUrlParse__default = /*#__PURE__*/_interopDefaultCompat(gitUrlParse);
18
17
 
18
+ const GITHUB_REST_API_MAX_PAGE_SIZE = 100;
19
19
  async function validateAndBuildRepoData(githubCredentialsProvider, integrations, config, input) {
20
20
  const ghConfig = integrations.github.byUrl(input.repoUrl)?.config;
21
21
  if (!ghConfig) {
@@ -54,51 +54,25 @@ async function searchRepos(octokit, ghSearchQuery, pageNumber = handlers.Default
54
54
  }) ?? []
55
55
  };
56
56
  }
57
- async function addGithubAppRepositories(deps, octokit, credential, ghConfig, repositories, errors, reqParams) {
58
- const search = reqParams?.search;
59
- const pageNumber = reqParams?.pageNumber ?? handlers.DefaultPageNumber;
60
- const pageSize = reqParams?.pageSize ?? handlers.DefaultPageSize;
57
+ async function addGithubAppRepositories(deps, octokit, credential, repositories, errors, reqParams) {
58
+ const lowercaseSearch = reqParams?.search?.toLocaleLowerCase();
61
59
  let totalCount;
62
60
  try {
63
- if (search) {
64
- const allOrgsMap = await orgUtils.getAllAppOrgs(
65
- deps.githubCredentialsProvider,
66
- ghConfig,
67
- credential.accountLogin
68
- );
69
- const orgSearch = [];
70
- for (const [_orgUrl, ghOrg] of allOrgsMap) {
71
- orgSearch.push(`org:${ghOrg.name}`);
72
- }
73
- const query = `${search} in:name ${orgSearch.join(" ")}`;
74
- const searchResp = await searchRepos(
75
- octokit,
76
- query,
77
- pageNumber,
78
- pageSize
79
- );
80
- totalCount = searchResp.totalCount;
81
- searchResp.repositories.forEach(
82
- (repo) => repositories.set(repo.full_name, repo)
83
- );
84
- } else {
85
- const resp = await octokit.apps.listReposAccessibleToInstallation({
86
- page: pageNumber,
87
- per_page: pageSize
88
- });
89
- const repos = resp?.data?.repositories ?? resp?.data;
90
- repos?.forEach((repo) => {
91
- repositories.set(repo.full_name, {
92
- name: repo.name,
93
- full_name: repo.full_name,
94
- url: repo.url,
95
- html_url: repo.html_url,
96
- default_branch: repo.default_branch,
97
- updated_at: repo.updated_at
98
- });
99
- });
100
- totalCount = resp?.data?.total_count;
101
- }
61
+ const { repositories: allRepositories } = await listAllRepositoriesAccessibleToInstallation(octokit);
62
+ const filteredRepositories = lowercaseSearch ? allRepositories.filter(
63
+ (repo) => repo.name.toLocaleLowerCase().includes(lowercaseSearch)
64
+ ) : allRepositories;
65
+ filteredRepositories.forEach(
66
+ (repo) => repositories.set(repo.full_name, {
67
+ name: repo.name,
68
+ full_name: repo.full_name,
69
+ url: repo.url,
70
+ html_url: repo.html_url,
71
+ default_branch: repo.default_branch,
72
+ updated_at: repo.updated_at
73
+ })
74
+ );
75
+ totalCount = filteredRepositories.length;
102
76
  } catch (err) {
103
77
  loggingUtils.logErrorIfNeeded(
104
78
  deps.logger,
@@ -113,64 +87,24 @@ async function addGithubAppRepositories(deps, octokit, credential, ghConfig, rep
113
87
  return { totalCount };
114
88
  }
115
89
  async function addGithubTokenRepositories(deps, octokit, credential, repositories, errors, reqParams) {
116
- const search = reqParams?.search;
117
- const pageNumber = reqParams?.pageNumber ?? handlers.DefaultPageNumber;
118
- const pageSize = reqParams?.pageSize ?? handlers.DefaultPageSize;
90
+ const lowercaseSearch = reqParams?.search?.toLocaleLowerCase();
119
91
  let totalCount;
120
92
  try {
121
- if (search) {
122
- const username = (await octokit.rest.users.getAuthenticated())?.data?.login;
123
- let query = `${search} in:name user:${username}`;
124
- const allOrgsResp = await octokit.paginate(
125
- octokit.rest.orgs.listForAuthenticatedUser,
126
- {
127
- sort: "full_name",
128
- direction: "asc"
129
- }
130
- );
131
- const orgSearch = [];
132
- allOrgsResp?.forEach((org) => orgSearch.push(`org:${org.login}`));
133
- if (orgSearch.length > 0) {
134
- query += ` ${orgSearch.join(" ")}`;
135
- }
136
- const searchResp = await searchRepos(
137
- octokit,
138
- query,
139
- pageNumber,
140
- pageSize
141
- );
142
- totalCount = searchResp.totalCount;
143
- searchResp.repositories.forEach(
144
- (repo) => repositories.set(repo.full_name, repo)
145
- );
146
- } else {
147
- const resp = await octokit.rest.repos.listForAuthenticatedUser({
148
- page: pageNumber,
149
- per_page: pageSize,
150
- sort: "full_name",
151
- direction: "asc"
152
- });
153
- resp?.data?.forEach((repo) => {
154
- repositories.set(repo.full_name, {
155
- name: repo.name,
156
- full_name: repo.full_name,
157
- url: repo.url,
158
- html_url: repo.html_url,
159
- default_branch: repo.default_branch,
160
- updated_at: repo.updated_at
161
- });
93
+ const allRepositories = await listAllRepositoriesForAuthenticatedUser(octokit);
94
+ const filteredRepositories = lowercaseSearch ? allRepositories.filter(
95
+ (repo) => repo.name.toLocaleLowerCase().includes(lowercaseSearch)
96
+ ) : allRepositories;
97
+ filteredRepositories.forEach((repo) => {
98
+ repositories.set(repo.full_name, {
99
+ name: repo.name,
100
+ full_name: repo.full_name,
101
+ url: repo.url,
102
+ html_url: repo.html_url,
103
+ default_branch: repo.default_branch,
104
+ updated_at: repo.updated_at
162
105
  });
163
- totalCount = await utils.computeTotalCountFromGitHubToken(
164
- deps,
165
- async (lastPageNumber) => octokit.repos.listForAuthenticatedUser({
166
- page: lastPageNumber,
167
- per_page: 100
168
- }).then((lastPageResp) => lastPageResp.data.length),
169
- "repos.listForAuthenticatedUser",
170
- resp?.data?.length,
171
- resp?.headers?.link
172
- );
173
- }
106
+ });
107
+ totalCount = filteredRepositories.length;
174
108
  } catch (err) {
175
109
  utils.handleError(
176
110
  deps,
@@ -261,6 +195,26 @@ async function fileExistsInDefaultBranch(logger, octo, owner, repo, fileName, de
261
195
  return void 0;
262
196
  }
263
197
  }
198
+ async function listAllRepositoriesForAuthenticatedUser(octokit) {
199
+ return await octokit.paginate(octokit.rest.repos.listForAuthenticatedUser, {
200
+ per_page: GITHUB_REST_API_MAX_PAGE_SIZE,
201
+ sort: "full_name",
202
+ direction: "asc"
203
+ });
204
+ }
205
+ async function listAllRepositoriesAccessibleToInstallation(octokit) {
206
+ const repositories = await octokit.paginate(
207
+ octokit.rest.apps.listReposAccessibleToInstallation,
208
+ {
209
+ per_page: GITHUB_REST_API_MAX_PAGE_SIZE
210
+ }
211
+ );
212
+ return {
213
+ repositories,
214
+ total_count: repositories.length,
215
+ repository_selection: repositories.repository_selection ?? "all"
216
+ };
217
+ }
264
218
 
265
219
  exports.addGithubAppRepositories = addGithubAppRepositories;
266
220
  exports.addGithubTokenOrgRepositories = addGithubTokenOrgRepositories;