@red-hat-developer-hub/backstage-plugin-bulk-import-backend 6.3.0 → 6.4.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.
- package/CHANGELOG.md +14 -0
- package/README.md +28 -0
- package/config.d.ts +9 -1
- package/dist/catalog/catalogHttpClient.cjs.js +2 -0
- package/dist/catalog/catalogHttpClient.cjs.js.map +1 -1
- package/dist/catalog/catalogInfoGenerator.cjs.js +1 -0
- package/dist/catalog/catalogInfoGenerator.cjs.js.map +1 -1
- package/dist/database/migration.cjs.js +20 -0
- package/dist/database/migration.cjs.js.map +1 -0
- package/dist/database/repositoryDao.cjs.js +117 -0
- package/dist/database/repositoryDao.cjs.js.map +1 -0
- package/dist/generated/openapidocument.cjs.js +321 -72
- package/dist/generated/openapidocument.cjs.js.map +1 -1
- package/dist/github/githubApiService.cjs.js +217 -91
- package/dist/github/githubApiService.cjs.js.map +1 -1
- package/dist/github/utils/orgUtils.cjs.js +1 -0
- package/dist/github/utils/orgUtils.cjs.js.map +1 -1
- package/dist/github/utils/prUtils.cjs.js +2 -0
- package/dist/github/utils/prUtils.cjs.js.map +1 -1
- package/dist/github/utils/repoUtils.cjs.js +1 -38
- package/dist/github/utils/repoUtils.cjs.js.map +1 -1
- package/dist/github/utils/utils.cjs.js +39 -1
- package/dist/github/utils/utils.cjs.js.map +1 -1
- package/dist/gitlab/gitlabApiService.cjs.js +102 -0
- package/dist/gitlab/gitlabApiService.cjs.js.map +1 -1
- package/dist/gitlab/utils/prUtils.cjs.js +1 -0
- package/dist/gitlab/utils/prUtils.cjs.js.map +1 -1
- package/dist/gitlab/utils/utils.cjs.js +1 -0
- package/dist/gitlab/utils/utils.cjs.js.map +1 -1
- package/dist/helpers/utils.cjs.js +21 -0
- package/dist/helpers/utils.cjs.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/plugin.cjs.js +6 -3
- package/dist/plugin.cjs.js.map +1 -1
- package/dist/service/handlers/import/bulkImports.cjs.js +155 -2
- package/dist/service/handlers/import/bulkImports.cjs.js.map +1 -1
- package/dist/service/handlers/import/execute-template.cjs.js +264 -0
- package/dist/service/handlers/import/execute-template.cjs.js.map +1 -0
- package/dist/service/handlers/import/importStatus.cjs.js +1 -1
- package/dist/service/handlers/import/importStatus.cjs.js.map +1 -1
- package/dist/service/handlers/repository/repositories.cjs.js +1 -0
- package/dist/service/handlers/repository/repositories.cjs.js.map +1 -1
- package/dist/service/router.cjs.js +179 -24
- package/dist/service/router.cjs.js.map +1 -1
- package/migrations/20250808122501_migrations.js +53 -0
- package/package.json +8 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repositories.cjs.js","sources":["../../../../src/service/handlers/repository/repositories.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 { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\n\nimport gitUrlParse from 'git-url-parse';\n\nimport { CatalogHttpClient } from '../../../catalog/catalogHttpClient';\nimport type { Components } from '../../../generated/openapi';\nimport type {\n GithubApiService,\n GithubRepositoryResponse,\n} from '../../../github';\nimport { GitlabApiService, GitlabRepositoryResponse } from '../../../gitlab';\nimport {\n DefaultPageNumber,\n DefaultPageSize,\n type HandlerResponse,\n} from '../handlers';\nimport { getImportStatusFromLocations } from '../import';\n\nexport async function findAllRepositories(\n deps: {\n logger: LoggerService;\n config: Config;\n gitApiService: GithubApiService | GitlabApiService;\n catalogHttpClient: CatalogHttpClient;\n },\n reqParams?: {\n approvalTool?: string;\n search?: string;\n checkStatus?: boolean;\n pageNumber?: number;\n pageSize?: number;\n },\n): Promise<HandlerResponse<Components.Schemas.RepositoryList>> {\n const search = reqParams?.search;\n const checkStatus = reqParams?.checkStatus ?? false;\n const pageNumber = reqParams?.pageNumber ?? DefaultPageNumber;\n const pageSize = reqParams?.pageSize ?? DefaultPageSize;\n deps.logger.debug(\n `Getting all repositories - (search,page,size)=('${\n search ?? ''\n }',${pageNumber},${pageSize})..`,\n );\n\n const repos = await deps.gitApiService\n .getRepositoriesFromIntegrations(search, pageNumber, pageSize)\n .then(response => formatResponse(deps, response, checkStatus));\n\n return repos;\n}\n\nexport async function findRepositoriesByOrganization(\n deps: {\n logger: LoggerService;\n config: Config;\n gitApiService: GithubApiService | GitlabApiService;\n catalogHttpClient: CatalogHttpClient;\n },\n orgName: string,\n search?: string,\n checkStatus: boolean = false,\n pageNumber: number = DefaultPageNumber,\n pageSize: number = DefaultPageSize,\n): Promise<HandlerResponse<Components.Schemas.RepositoryList>> {\n deps.logger.debug(\n `Getting all repositories for org \"${orgName}\" - (search,page,size)=(${search},${pageNumber},${pageSize})..`,\n );\n\n const glReposByOrg = await deps.gitApiService\n .getOrgRepositoriesFromIntegrations(orgName, search, pageNumber, pageSize)\n .then(response => formatResponse(deps, response, checkStatus));\n\n return glReposByOrg;\n}\n\nfunction sortRepos(repoList: Components.Schemas.Repository[]) {\n // sorting the output to make it deterministic and easy to navigate in the UI\n repoList.sort((a, b) => {\n if (a.name === undefined && b.name === undefined) {\n return 0;\n }\n if (a.name === undefined) {\n return -1;\n }\n if (b.name === undefined) {\n return 1;\n }\n return a.name.localeCompare(b.name);\n });\n}\n\ntype ImportStatus =\n | { status: Components.Schemas.ImportStatus; lastUpdate?: string }\n | null\n | undefined;\n\nasync function formatResponse(\n deps: {\n logger: LoggerService;\n config: Config;\n gitApiService: GithubApiService | GitlabApiService;\n catalogHttpClient: CatalogHttpClient;\n },\n allReposAccessible: GithubRepositoryResponse | GitlabRepositoryResponse,\n checkStatus: boolean,\n) {\n const errorList =\n allReposAccessible.errors\n ?.map(err => err.error?.message)\n ?.filter(msg => msg) ?? [];\n if (allReposAccessible.repositories?.length === 0 && errorList.length > 0) {\n return {\n statusCode: 500,\n responseBody: {\n errors: errorList,\n },\n };\n }\n\n let catalogLocations: Iterable<string> = [];\n if (checkStatus) {\n catalogLocations = (\n await deps.catalogHttpClient.listCatalogUrlLocations()\n ).uniqueCatalogUrlLocations.keys();\n }\n const repoList: Components.Schemas.Repository[] = [];\n for (const repo of allReposAccessible.repositories) {\n const gitUrl = gitUrlParse(repo.html_url);\n const errors: string[] = [];\n let importStatus: ImportStatus;\n if (checkStatus) {\n importStatus = await getImportStatusFromLocations(\n deps,\n repo.html_url,\n catalogLocations,\n repo.default_branch,\n ).catch((error: any) => {\n errors.push(error.message);\n return undefined;\n });\n }\n const repoUpdatedAt = repo.updated_at ?? undefined;\n repoList.push({\n id: `${gitUrl.organization}/${repo.name}`,\n name: repo.name,\n organization: gitUrl.organization,\n url: repo.html_url,\n defaultBranch: repo.default_branch,\n importStatus: importStatus?.status,\n lastUpdate: importStatus?.lastUpdate ?? repoUpdatedAt,\n errors: errors,\n });\n }\n\n sortRepos(repoList);\n\n return {\n statusCode: 200,\n responseBody: {\n errors: errorList,\n repositories: repoList,\n totalCount: allReposAccessible.totalCount,\n },\n };\n}\n"],"names":["DefaultPageNumber","DefaultPageSize","gitUrlParse","importStatus","getImportStatusFromLocations"],"mappings":"
|
|
1
|
+
{"version":3,"file":"repositories.cjs.js","sources":["../../../../src/service/handlers/repository/repositories.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 { LoggerService } from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\n\nimport gitUrlParse from 'git-url-parse';\n\nimport { CatalogHttpClient } from '../../../catalog/catalogHttpClient';\nimport type { Components } from '../../../generated/openapi';\nimport type {\n GithubApiService,\n GithubRepositoryResponse,\n} from '../../../github';\nimport { GitlabApiService, GitlabRepositoryResponse } from '../../../gitlab';\nimport {\n DefaultPageNumber,\n DefaultPageSize,\n type HandlerResponse,\n} from '../handlers';\nimport { getImportStatusFromLocations } from '../import';\n\nexport async function findAllRepositories(\n deps: {\n logger: LoggerService;\n config: Config;\n gitApiService: GithubApiService | GitlabApiService;\n catalogHttpClient: CatalogHttpClient;\n },\n reqParams?: {\n approvalTool?: string;\n search?: string;\n checkStatus?: boolean;\n pageNumber?: number;\n pageSize?: number;\n },\n): Promise<HandlerResponse<Components.Schemas.RepositoryList>> {\n const search = reqParams?.search;\n const checkStatus = reqParams?.checkStatus ?? false;\n const pageNumber = reqParams?.pageNumber ?? DefaultPageNumber;\n const pageSize = reqParams?.pageSize ?? DefaultPageSize;\n deps.logger.debug(\n `Getting all repositories - (search,page,size)=('${\n search ?? ''\n }',${pageNumber},${pageSize})..`,\n );\n\n const repos = await deps.gitApiService\n .getRepositoriesFromIntegrations(search, pageNumber, pageSize)\n .then(response => formatResponse(deps, response, checkStatus));\n\n return repos;\n}\n\nexport async function findRepositoriesByOrganization(\n deps: {\n logger: LoggerService;\n config: Config;\n gitApiService: GithubApiService | GitlabApiService;\n catalogHttpClient: CatalogHttpClient;\n },\n orgName: string,\n search?: string,\n checkStatus: boolean = false,\n pageNumber: number = DefaultPageNumber,\n pageSize: number = DefaultPageSize,\n): Promise<HandlerResponse<Components.Schemas.RepositoryList>> {\n deps.logger.debug(\n `Getting all repositories for org \"${orgName}\" - (search,page,size)=(${search},${pageNumber},${pageSize})..`,\n );\n\n const glReposByOrg = await deps.gitApiService\n .getOrgRepositoriesFromIntegrations(orgName, search, pageNumber, pageSize)\n .then(response => formatResponse(deps, response, checkStatus));\n\n return glReposByOrg;\n}\n\nfunction sortRepos(repoList: Components.Schemas.Repository[]) {\n // sorting the output to make it deterministic and easy to navigate in the UI\n repoList.sort((a, b) => {\n if (a.name === undefined && b.name === undefined) {\n return 0;\n }\n if (a.name === undefined) {\n return -1;\n }\n if (b.name === undefined) {\n return 1;\n }\n return a.name.localeCompare(b.name);\n });\n}\n\ntype ImportStatus =\n | { status: Components.Schemas.ImportStatus; lastUpdate?: string }\n | null\n | undefined;\n\nasync function formatResponse(\n deps: {\n logger: LoggerService;\n config: Config;\n gitApiService: GithubApiService | GitlabApiService;\n catalogHttpClient: CatalogHttpClient;\n },\n allReposAccessible: GithubRepositoryResponse | GitlabRepositoryResponse,\n checkStatus: boolean,\n) {\n const errorList =\n allReposAccessible.errors\n ?.map(err => err.error?.message)\n ?.filter(msg => msg) ?? [];\n if (allReposAccessible.repositories?.length === 0 && errorList.length > 0) {\n return {\n statusCode: 500,\n responseBody: {\n errors: errorList,\n },\n };\n }\n\n let catalogLocations: Iterable<string> = [];\n if (checkStatus) {\n catalogLocations = (\n await deps.catalogHttpClient.listCatalogUrlLocations()\n ).uniqueCatalogUrlLocations.keys();\n }\n const repoList: Components.Schemas.Repository[] = [];\n for (const repo of allReposAccessible.repositories) {\n const gitUrl = gitUrlParse(repo.html_url);\n const errors: string[] = [];\n let importStatus: ImportStatus;\n if (checkStatus) {\n importStatus = await getImportStatusFromLocations(\n deps,\n repo.html_url,\n catalogLocations,\n repo.default_branch,\n ).catch((error: any) => {\n errors.push(error.message);\n return undefined;\n });\n }\n const repoUpdatedAt = repo.updated_at ?? undefined;\n repoList.push({\n id: `${gitUrl.organization}/${repo.name}`,\n name: repo.name,\n organization: gitUrl.organization,\n url: repo.html_url,\n defaultBranch: repo.default_branch,\n importStatus: importStatus?.status,\n lastUpdate: importStatus?.lastUpdate ?? repoUpdatedAt,\n errors: errors,\n });\n }\n\n sortRepos(repoList);\n\n return {\n statusCode: 200,\n responseBody: {\n errors: errorList,\n repositories: repoList,\n totalCount: allReposAccessible.totalCount,\n },\n };\n}\n"],"names":["DefaultPageNumber","DefaultPageSize","gitUrlParse","importStatus","getImportStatusFromLocations"],"mappings":"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"}
|
|
@@ -8,6 +8,8 @@ var openapiBackend = require('openapi-backend');
|
|
|
8
8
|
var backstagePluginBulkImportCommon = require('@red-hat-developer-hub/backstage-plugin-bulk-import-common');
|
|
9
9
|
var catalogHttpClient = require('../catalog/catalogHttpClient.cjs.js');
|
|
10
10
|
var catalogInfoGenerator = require('../catalog/catalogInfoGenerator.cjs.js');
|
|
11
|
+
var migration = require('../database/migration.cjs.js');
|
|
12
|
+
var repositoryDao = require('../database/repositoryDao.cjs.js');
|
|
11
13
|
var openapidocument = require('../generated/openapidocument.cjs.js');
|
|
12
14
|
require('@octokit/auth-app');
|
|
13
15
|
require('@octokit/rest');
|
|
@@ -20,6 +22,7 @@ require('@backstage/errors');
|
|
|
20
22
|
var utils = require('../helpers/utils.cjs.js');
|
|
21
23
|
var auditorUtils = require('../helpers/auditorUtils.cjs.js');
|
|
22
24
|
var bulkImports = require('./handlers/import/bulkImports.cjs.js');
|
|
25
|
+
var executeTemplate = require('./handlers/import/execute-template.cjs.js');
|
|
23
26
|
var organizations = require('./handlers/organization/organizations.cjs.js');
|
|
24
27
|
var ping = require('./handlers/ping/ping.cjs.js');
|
|
25
28
|
var repositories = require('./handlers/repository/repositories.cjs.js');
|
|
@@ -35,9 +38,13 @@ var Operations;
|
|
|
35
38
|
Operations2.FIND_ALL_REPOSITORIES = "findAllRepositories";
|
|
36
39
|
Operations2.FIND_REPOSITORIES_BY_ORGANIZATION = "findRepositoriesByOrganization";
|
|
37
40
|
Operations2.FIND_ALL_IMPORTS = "findAllImports";
|
|
41
|
+
Operations2.FIND_ALL_TASK_IMPORTS = "findAllTaskImports";
|
|
38
42
|
Operations2.CREATE_IMPORT_JOBS = "createImportJobs";
|
|
43
|
+
Operations2.CREATE_TASK_IMPORT_JOBS = "createTaskImportJobs";
|
|
39
44
|
Operations2.FIND_IMPORT_STATUS_BY_REPO = "findImportStatusByRepo";
|
|
45
|
+
Operations2.FIND_TASK_IMPORT_STATUS_BY_REPO = "findTaskImportStatusByRepo";
|
|
40
46
|
Operations2.DELETE_IMPORT_BY_REPO = "deleteImportByRepo";
|
|
47
|
+
Operations2.DELETE_TASK_IMPORT_BY_REPO = "deleteTaskImportByRepo";
|
|
41
48
|
})(Operations || (Operations = {}));
|
|
42
49
|
async function createRouter(options) {
|
|
43
50
|
const {
|
|
@@ -49,8 +56,13 @@ async function createRouter(options) {
|
|
|
49
56
|
cache,
|
|
50
57
|
discovery,
|
|
51
58
|
catalogApi,
|
|
52
|
-
auditor
|
|
59
|
+
auditor,
|
|
60
|
+
database
|
|
53
61
|
} = options;
|
|
62
|
+
const knex = await migration.migrate(database);
|
|
63
|
+
const repositoryDao$1 = new repositoryDao.RepositoryDao(knex, logger);
|
|
64
|
+
const taskDao = new repositoryDao.ScaffolderTaskDao(knex);
|
|
65
|
+
const taskLocationsDao = new repositoryDao.TaskLocationsDao(knex);
|
|
54
66
|
const githubApiService$1 = new githubApiService.GithubApiService(logger, config, cache);
|
|
55
67
|
const gitlabApiService$1 = new gitlabApiService.GitlabApiService(logger, config, cache);
|
|
56
68
|
const catalogHttpClient$1 = new catalogHttpClient.CatalogHttpClient({
|
|
@@ -78,6 +90,11 @@ async function createRouter(options) {
|
|
|
78
90
|
notImplemented: async (_c, req, res) => res.status(500).json({ err: `'${req.method} ${req.path}' not implemented` })
|
|
79
91
|
}
|
|
80
92
|
});
|
|
93
|
+
const templateRef = config.getOptionalString("bulkImport.importTemplate");
|
|
94
|
+
let finalTemplateRef;
|
|
95
|
+
if (templateRef) {
|
|
96
|
+
finalTemplateRef = utils.getImportTemplateRef(templateRef);
|
|
97
|
+
}
|
|
81
98
|
await api.init();
|
|
82
99
|
api.register(
|
|
83
100
|
Operations.PING,
|
|
@@ -182,22 +199,14 @@ async function createRouter(options) {
|
|
|
182
199
|
api.register(
|
|
183
200
|
Operations.FIND_ALL_IMPORTS,
|
|
184
201
|
async (c, _req, res) => {
|
|
185
|
-
const
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
let size;
|
|
194
|
-
if (apiVersion === undefined || apiVersion === "v1") {
|
|
195
|
-
page = stringToNumber(q.page || q.pagePerIntegration);
|
|
196
|
-
size = stringToNumber(q.size || q.sizePerIntegration);
|
|
197
|
-
} else {
|
|
198
|
-
page = stringToNumber(q.page);
|
|
199
|
-
size = stringToNumber(q.size);
|
|
200
|
-
}
|
|
202
|
+
const {
|
|
203
|
+
pageNumber,
|
|
204
|
+
pageSize,
|
|
205
|
+
apiVersion,
|
|
206
|
+
search,
|
|
207
|
+
sortColumn,
|
|
208
|
+
sortOrder
|
|
209
|
+
} = getFindImportsParams(c);
|
|
201
210
|
const response = await bulkImports.findAllImports(
|
|
202
211
|
{
|
|
203
212
|
logger,
|
|
@@ -210,16 +219,57 @@ async function createRouter(options) {
|
|
|
210
219
|
apiVersion
|
|
211
220
|
},
|
|
212
221
|
{
|
|
213
|
-
search
|
|
214
|
-
pageNumber
|
|
215
|
-
pageSize
|
|
216
|
-
sortColumn
|
|
217
|
-
sortOrder
|
|
222
|
+
search,
|
|
223
|
+
pageNumber,
|
|
224
|
+
pageSize,
|
|
225
|
+
sortColumn,
|
|
226
|
+
sortOrder
|
|
218
227
|
}
|
|
219
228
|
);
|
|
220
229
|
return res.status(response.statusCode).json(response.responseBody);
|
|
221
230
|
}
|
|
222
231
|
);
|
|
232
|
+
api.register(
|
|
233
|
+
Operations.FIND_ALL_TASK_IMPORTS,
|
|
234
|
+
async (c, _req, res) => {
|
|
235
|
+
const { pageNumber, pageSize, search, sortColumn, sortOrder } = getFindImportsParams(c);
|
|
236
|
+
const imports = [];
|
|
237
|
+
const repositories = await repositoryDao$1.findRepositories(
|
|
238
|
+
pageNumber,
|
|
239
|
+
pageSize,
|
|
240
|
+
search
|
|
241
|
+
);
|
|
242
|
+
for (const repo of repositories.data) {
|
|
243
|
+
const response = await bulkImports.findTaskImportStatusByRepo(
|
|
244
|
+
{
|
|
245
|
+
logger,
|
|
246
|
+
config,
|
|
247
|
+
githubApiService: githubApiService$1,
|
|
248
|
+
gitlabApiService: gitlabApiService$1,
|
|
249
|
+
catalogHttpClient: catalogHttpClient$1,
|
|
250
|
+
repositoryDao: repositoryDao$1,
|
|
251
|
+
taskDao,
|
|
252
|
+
taskLocationsDao,
|
|
253
|
+
discovery,
|
|
254
|
+
auth: auth$1
|
|
255
|
+
},
|
|
256
|
+
repo.url,
|
|
257
|
+
true
|
|
258
|
+
);
|
|
259
|
+
if (response.responseBody) {
|
|
260
|
+
imports.push(response.responseBody);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
bulkImports.sortImports(imports, sortColumn, sortOrder);
|
|
264
|
+
const responseBody = {
|
|
265
|
+
imports,
|
|
266
|
+
totalCount: repositories.total,
|
|
267
|
+
page: pageNumber || 1,
|
|
268
|
+
size: pageSize || 5
|
|
269
|
+
};
|
|
270
|
+
return res.status(200).json(responseBody);
|
|
271
|
+
}
|
|
272
|
+
);
|
|
223
273
|
api.register(
|
|
224
274
|
Operations.CREATE_IMPORT_JOBS,
|
|
225
275
|
async (c, _req, res) => {
|
|
@@ -246,6 +296,56 @@ async function createRouter(options) {
|
|
|
246
296
|
return res.status(response.statusCode).json(response.responseBody);
|
|
247
297
|
}
|
|
248
298
|
);
|
|
299
|
+
api.register(
|
|
300
|
+
Operations.CREATE_TASK_IMPORT_JOBS,
|
|
301
|
+
async (c, _req, res) => {
|
|
302
|
+
if (!finalTemplateRef) {
|
|
303
|
+
throw new Error(
|
|
304
|
+
`Missing required config value: 'bulkImport.importTemplate'`
|
|
305
|
+
);
|
|
306
|
+
}
|
|
307
|
+
const response = await executeTemplate.createTaskImportJobs(
|
|
308
|
+
finalTemplateRef,
|
|
309
|
+
discovery,
|
|
310
|
+
logger,
|
|
311
|
+
auth$1,
|
|
312
|
+
config,
|
|
313
|
+
repositoryDao$1,
|
|
314
|
+
taskDao,
|
|
315
|
+
taskLocationsDao,
|
|
316
|
+
c.request.requestBody,
|
|
317
|
+
githubApiService$1
|
|
318
|
+
);
|
|
319
|
+
return res.status(response.statusCode).json(response.responseBody);
|
|
320
|
+
}
|
|
321
|
+
);
|
|
322
|
+
api.register(
|
|
323
|
+
Operations.FIND_TASK_IMPORT_STATUS_BY_REPO,
|
|
324
|
+
async (c, _req, res) => {
|
|
325
|
+
const q = {
|
|
326
|
+
...c.request.query
|
|
327
|
+
};
|
|
328
|
+
if (!q.repo?.trim()) {
|
|
329
|
+
throw new Error("missing or blank parameter");
|
|
330
|
+
}
|
|
331
|
+
const response = await bulkImports.findTaskImportStatusByRepo(
|
|
332
|
+
{
|
|
333
|
+
logger,
|
|
334
|
+
config,
|
|
335
|
+
githubApiService: githubApiService$1,
|
|
336
|
+
gitlabApiService: gitlabApiService$1,
|
|
337
|
+
catalogHttpClient: catalogHttpClient$1,
|
|
338
|
+
repositoryDao: repositoryDao$1,
|
|
339
|
+
taskDao,
|
|
340
|
+
taskLocationsDao,
|
|
341
|
+
discovery,
|
|
342
|
+
auth: auth$1
|
|
343
|
+
},
|
|
344
|
+
q.repo
|
|
345
|
+
);
|
|
346
|
+
return res.status(response.statusCode).json(response.responseBody);
|
|
347
|
+
}
|
|
348
|
+
);
|
|
249
349
|
api.register(
|
|
250
350
|
Operations.FIND_IMPORT_STATUS_BY_REPO,
|
|
251
351
|
async (c, _req, res) => {
|
|
@@ -270,6 +370,25 @@ async function createRouter(options) {
|
|
|
270
370
|
return res.status(response.statusCode).json(response.responseBody);
|
|
271
371
|
}
|
|
272
372
|
);
|
|
373
|
+
api.register(
|
|
374
|
+
Operations.DELETE_TASK_IMPORT_BY_REPO,
|
|
375
|
+
async (c, _req, res) => {
|
|
376
|
+
const q = {
|
|
377
|
+
...c.request.query
|
|
378
|
+
};
|
|
379
|
+
if (!q.repo?.trim()) {
|
|
380
|
+
throw new Error('missing or blank "repo" parameter');
|
|
381
|
+
}
|
|
382
|
+
const response = await bulkImports.deleteTaskImportByRepo(
|
|
383
|
+
{
|
|
384
|
+
logger,
|
|
385
|
+
dao: repositoryDao$1
|
|
386
|
+
},
|
|
387
|
+
q.repo
|
|
388
|
+
);
|
|
389
|
+
return res.status(response.statusCode).json(response.responseBody);
|
|
390
|
+
}
|
|
391
|
+
);
|
|
273
392
|
api.register(
|
|
274
393
|
Operations.DELETE_IMPORT_BY_REPO,
|
|
275
394
|
async (c, _req, res) => {
|
|
@@ -358,15 +477,16 @@ async function createAuditorEventByOperationId(operationId, req, auditor) {
|
|
|
358
477
|
break;
|
|
359
478
|
}
|
|
360
479
|
case Operations.FIND_ALL_IMPORTS:
|
|
480
|
+
case Operations.FIND_ALL_TASK_IMPORTS:
|
|
361
481
|
auditorEvent = await auditorUtils.auditCreateEvent(auditor, "import-read", req, {
|
|
362
482
|
queryType: req.query.search ? "by-query" : "all",
|
|
363
483
|
search: req.query.search
|
|
364
484
|
});
|
|
365
485
|
break;
|
|
366
486
|
case Operations.CREATE_IMPORT_JOBS:
|
|
487
|
+
case Operations.CREATE_TASK_IMPORT_JOBS:
|
|
367
488
|
auditorEvent = await auditorUtils.auditCreateEvent(auditor, "import-write", req, {
|
|
368
|
-
actionType: "create"
|
|
369
|
-
dryRun: req.query.dryRun
|
|
489
|
+
actionType: "create"
|
|
370
490
|
});
|
|
371
491
|
break;
|
|
372
492
|
case Operations.FIND_IMPORT_STATUS_BY_REPO:
|
|
@@ -377,7 +497,16 @@ async function createAuditorEventByOperationId(operationId, req, auditor) {
|
|
|
377
497
|
{ queryType: "by-query", repo: req.query.repo }
|
|
378
498
|
);
|
|
379
499
|
break;
|
|
500
|
+
case Operations.FIND_TASK_IMPORT_STATUS_BY_REPO:
|
|
501
|
+
auditorEvent = await auditorUtils.auditCreateEvent(
|
|
502
|
+
auditor,
|
|
503
|
+
"import-status-read",
|
|
504
|
+
req,
|
|
505
|
+
{ queryType: "by-query", repo: req.query.repo }
|
|
506
|
+
);
|
|
507
|
+
break;
|
|
380
508
|
case Operations.DELETE_IMPORT_BY_REPO:
|
|
509
|
+
case Operations.DELETE_TASK_IMPORT_BY_REPO:
|
|
381
510
|
auditorEvent = await auditorUtils.auditCreateEvent(auditor, "import-write", req, {
|
|
382
511
|
actionType: "delete",
|
|
383
512
|
repository: req.query.repo
|
|
@@ -398,6 +527,32 @@ function stringToBoolean(s) {
|
|
|
398
527
|
}
|
|
399
528
|
return s.toString() === "true";
|
|
400
529
|
}
|
|
530
|
+
function getFindImportsParams(c) {
|
|
531
|
+
const h = {
|
|
532
|
+
...c.request.headers
|
|
533
|
+
};
|
|
534
|
+
const apiVersion = h["api-version"];
|
|
535
|
+
const q = {
|
|
536
|
+
...c.request.query
|
|
537
|
+
};
|
|
538
|
+
let pageNumber;
|
|
539
|
+
let pageSize;
|
|
540
|
+
if (apiVersion === undefined || apiVersion === "v1") {
|
|
541
|
+
pageNumber = stringToNumber(q.page || q.pagePerIntegration);
|
|
542
|
+
pageSize = stringToNumber(q.size || q.sizePerIntegration);
|
|
543
|
+
} else {
|
|
544
|
+
pageNumber = stringToNumber(q.page);
|
|
545
|
+
pageSize = stringToNumber(q.size);
|
|
546
|
+
}
|
|
547
|
+
return {
|
|
548
|
+
pageNumber,
|
|
549
|
+
pageSize,
|
|
550
|
+
apiVersion,
|
|
551
|
+
search: q.search,
|
|
552
|
+
sortColumn: q.sortColumn,
|
|
553
|
+
sortOrder: q.sortOrder
|
|
554
|
+
};
|
|
555
|
+
}
|
|
401
556
|
|
|
402
557
|
exports.createRouter = createRouter;
|
|
403
558
|
//# sourceMappingURL=router.cjs.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.cjs.js","sources":["../../src/service/router.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 { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport type {\n AuditorService,\n AuditorServiceEvent,\n AuthService,\n CacheService,\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport type { CatalogApi } from '@backstage/catalog-client';\nimport type { Config } from '@backstage/config';\nimport type { PermissionEvaluator } from '@backstage/plugin-permission-common';\nimport { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';\n\nimport { fullFormats } from 'ajv-formats/dist/formats';\nimport express, { Router, type Request, type Response } from 'express';\nimport {\n OpenAPIBackend,\n type Context,\n type Request as OpenAPIRequest,\n} from 'openapi-backend';\n\nimport { bulkImportPermission } from '@red-hat-developer-hub/backstage-plugin-bulk-import-common';\n\nimport { CatalogHttpClient } from '../catalog/catalogHttpClient';\nimport { CatalogInfoGenerator } from '../catalog/catalogInfoGenerator';\nimport type { Components, Paths } from '../generated/openapi.d';\nimport { openApiDocument } from '../generated/openapidocument';\nimport { GithubApiService } from '../github';\nimport { GitlabApiService } from '../gitlab';\nimport { parseGitURLForApprovalTool, permissionCheck } from '../helpers';\nimport { auditCreateEvent } from '../helpers/auditorUtils';\nimport {\n createImportJobs,\n deleteImportByRepo,\n findAllImports,\n findImportStatusByRepo,\n} from './handlers/import';\nimport { findAllOrganizations } from './handlers/organization';\nimport { ping } from './handlers/ping';\nimport {\n findAllRepositories,\n findRepositoriesByOrganization,\n} from './handlers/repository';\n\n/**\n * Router Options\n * @public\n */\nexport interface RouterOptions {\n logger: LoggerService;\n permissions: PermissionEvaluator;\n config: Config;\n cache: CacheService;\n discovery: DiscoveryService;\n httpAuth: HttpAuthService;\n auth: AuthService;\n catalogApi: CatalogApi;\n auditor: AuditorService;\n}\n\nnamespace Operations {\n export const PING = 'ping';\n export const FIND_ALL_ORGANIZATIONS = 'findAllOrganizations';\n export const FIND_ALL_REPOSITORIES = 'findAllRepositories';\n export const FIND_REPOSITORIES_BY_ORGANIZATION =\n 'findRepositoriesByOrganization';\n export const FIND_ALL_IMPORTS = 'findAllImports';\n export const CREATE_IMPORT_JOBS = 'createImportJobs';\n export const FIND_IMPORT_STATUS_BY_REPO = 'findImportStatusByRepo';\n export const DELETE_IMPORT_BY_REPO = 'deleteImportByRepo';\n}\n\n/**\n * Router\n * @public\n */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const {\n logger,\n httpAuth,\n auth,\n permissions,\n config,\n cache,\n discovery,\n catalogApi,\n auditor: auditor,\n } = options;\n // This should probably be sometype of object that holds all the scm API service objects\n const githubApiService = new GithubApiService(logger, config, cache);\n const gitlabApiService = new GitlabApiService(logger, config, cache);\n const catalogHttpClient = new CatalogHttpClient({\n logger,\n config,\n discovery,\n auth,\n catalogApi,\n });\n const catalogInfoGenerator = new CatalogInfoGenerator(\n logger,\n catalogHttpClient,\n );\n\n // create openapi requests handler\n const api = new OpenAPIBackend({\n ajvOpts: {\n verbose: true,\n formats: fullFormats, // open issue: https://github.com/openapistack/openapi-backend/issues/280\n },\n validate: true,\n definition: openApiDocument,\n handlers: {\n validationFail: async (c, _req: Request, res: Response) =>\n res.status(400).json({ err: c.validation.errors }),\n notFound: async (_c, req: Request, res: Response) =>\n res.status(404).json({ err: `'${req.method} ${req.path}' not found` }),\n notImplemented: async (_c, req: Request, res: Response) =>\n res\n .status(500)\n .json({ err: `'${req.method} ${req.path}' not implemented` }),\n },\n });\n\n await api.init();\n\n api.register(\n Operations.PING,\n async (_c: Context, _req: Request, res: Response) => {\n const result = await ping(logger);\n return res.status(result.statusCode).json(result.responseBody);\n },\n );\n\n api.register(\n Operations.FIND_ALL_ORGANIZATIONS,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindAllOrganizations.QueryParameters = {\n ...c.request.query,\n };\n // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571\n q.pagePerIntegration = stringToNumber(q.pagePerIntegration);\n q.sizePerIntegration = stringToNumber(q.sizePerIntegration);\n const response = await findAllOrganizations(\n logger,\n q.approvalTool === 'GITLAB' ? gitlabApiService : githubApiService,\n q.search,\n q.pagePerIntegration,\n q.sizePerIntegration,\n );\n return res.status(response.statusCode).json({\n errors: response.responseBody?.errors,\n organizations: response.responseBody?.organizations,\n totalCount: response.responseBody?.totalCount,\n pagePerIntegration: response.responseBody?.pagePerIntegration,\n sizePerIntegration: response.responseBody?.sizePerIntegration,\n approvalTool: q.approvalTool,\n } as Components.Schemas.OrganizationList);\n },\n );\n\n api.register(\n Operations.FIND_ALL_REPOSITORIES,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindAllRepositories.QueryParameters = {\n ...c.request.query,\n };\n // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571\n q.pagePerIntegration = stringToNumber(q.pagePerIntegration);\n q.sizePerIntegration = stringToNumber(q.sizePerIntegration);\n q.checkImportStatus = stringToBoolean(q.checkImportStatus);\n const response = await findAllRepositories(\n {\n logger,\n config,\n gitApiService:\n q.approvalTool === 'GITLAB' ? gitlabApiService : githubApiService,\n catalogHttpClient,\n },\n {\n search: q.search,\n checkStatus: q.checkImportStatus,\n pageNumber: q.pagePerIntegration,\n pageSize: q.sizePerIntegration,\n approvalTool: q.approvalTool,\n },\n );\n const repos = response.responseBody?.repositories;\n return res.status(response.statusCode).json({\n errors: response.responseBody?.errors,\n repositories: repos,\n totalCount: response.responseBody?.totalCount,\n pagePerIntegration: q.pagePerIntegration,\n sizePerIntegration: q.sizePerIntegration,\n approvalTool: q.approvalTool,\n } as Components.Schemas.RepositoryList);\n },\n );\n\n api.register(\n Operations.FIND_REPOSITORIES_BY_ORGANIZATION,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindRepositoriesByOrganization.QueryParameters = {\n ...c.request.query,\n };\n // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571\n q.pagePerIntegration = stringToNumber(q.pagePerIntegration);\n q.sizePerIntegration = stringToNumber(q.sizePerIntegration);\n q.checkImportStatus = stringToBoolean(q.checkImportStatus);\n const response = await findRepositoriesByOrganization(\n {\n logger,\n config,\n gitApiService:\n q.approvalTool === 'GITLAB' ? gitlabApiService : githubApiService,\n catalogHttpClient,\n },\n c.request.params.organizationName?.toString(),\n q.search,\n q.checkImportStatus,\n q.pagePerIntegration,\n q.sizePerIntegration,\n );\n const repos = response.responseBody?.repositories;\n return res.status(response.statusCode).json({\n errors: response.responseBody?.errors,\n repositories: repos,\n totalCount: response.responseBody?.totalCount,\n pagePerIntegration: q.pagePerIntegration,\n sizePerIntegration: q.sizePerIntegration,\n approvalTool: q.approvalTool,\n } as Components.Schemas.RepositoryList);\n },\n );\n\n api.register(\n Operations.FIND_ALL_IMPORTS,\n async (c: Context, _req: Request, res: Response) => {\n const h: Paths.FindAllImports.HeaderParameters = {\n ...c.request.headers,\n };\n const apiVersion = h['api-version'];\n const q: Paths.FindAllImports.QueryParameters = {\n ...c.request.query,\n };\n // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571\n let page: number | undefined;\n let size: number | undefined;\n if (apiVersion === undefined || apiVersion === 'v1') {\n // pagePerIntegration and sizePerIntegration deprecated in v1. 'page' and 'size' take precedence.\n page = stringToNumber(q.page || q.pagePerIntegration);\n size = stringToNumber(q.size || q.sizePerIntegration);\n } else {\n // pagePerIntegration and sizePerIntegration removed in v2+ and replaced by 'page' and 'size'.\n page = stringToNumber(q.page);\n size = stringToNumber(q.size);\n }\n const response = await findAllImports(\n {\n logger,\n config,\n githubApiService,\n gitlabApiService,\n catalogHttpClient,\n },\n {\n apiVersion,\n },\n {\n search: q.search,\n pageNumber: page,\n pageSize: size,\n sortColumn: q.sortColumn,\n sortOrder: q.sortOrder,\n },\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.CREATE_IMPORT_JOBS,\n async (\n c: Context<Paths.CreateImportJobs.RequestBody>,\n _req: Request,\n res: Response,\n ) => {\n const q: Paths.CreateImportJobs.QueryParameters = {\n ...c.request.query,\n };\n q.dryRun = stringToBoolean(q.dryRun);\n const response = await createImportJobs(\n {\n logger,\n config,\n auth,\n catalogApi,\n gitlabApiService,\n githubApiService,\n catalogInfoGenerator,\n catalogHttpClient,\n },\n {\n importRequests: c.request.requestBody,\n dryRun: q.dryRun,\n },\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.FIND_IMPORT_STATUS_BY_REPO,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindImportStatusByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank parameter');\n }\n const response = await findImportStatusByRepo(\n {\n logger,\n config,\n gitApiService:\n q.approvalTool === 'GITLAB' ? gitlabApiService : githubApiService,\n catalogHttpClient,\n approvalTool: q.approvalTool,\n },\n q.repo,\n q.defaultBranch,\n true,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.DELETE_IMPORT_BY_REPO,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.DeleteImportByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank \"repo\" parameter');\n }\n const response = await deleteImportByRepo(\n {\n logger,\n config,\n gitApiService:\n parseGitURLForApprovalTool(q.repo) === 'GITLAB'\n ? gitlabApiService\n : githubApiService,\n catalogHttpClient,\n },\n q.repo,\n q.defaultBranch,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n const router = Router();\n router.use(express.json());\n\n const permissionIntegrationRouter = createPermissionIntegrationRouter({\n permissions: [bulkImportPermission],\n });\n router.use(permissionIntegrationRouter);\n\n router.use(async (req, _res, next) => {\n if (req.path !== '/ping') {\n await permissionCheck(\n auditor,\n api.matchOperation(req as OpenAPIRequest)?.operationId,\n permissions,\n httpAuth,\n req,\n ).catch(next);\n }\n next();\n });\n\n router.use(async (req, res, next) => {\n const reqCast = req as OpenAPIRequest;\n const operationId = api.matchOperation(reqCast)?.operationId;\n\n const auditorEvent = await createAuditorEventByOperationId(\n operationId,\n req,\n auditor,\n );\n try {\n const response = (await api.handleRequest(reqCast, req, res)) as Response;\n auditorEvent?.success({ meta: { responseStatus: response.statusCode } });\n next();\n } catch (err: any) {\n auditorEvent?.fail({ error: err, meta: { responseStatus: 500 } });\n next(err);\n }\n });\n\n const middleware = MiddlewareFactory.create({ logger, config });\n router.use(middleware.error());\n\n return router;\n}\n\nasync function createAuditorEventByOperationId(\n operationId: string | undefined,\n req: Request,\n auditor: AuditorService,\n): Promise<AuditorServiceEvent | undefined> {\n let auditorEvent;\n switch (operationId) {\n case Operations.PING:\n auditorEvent = await auditCreateEvent(auditor, 'ping', req);\n break;\n case Operations.FIND_ALL_ORGANIZATIONS:\n auditorEvent = await auditCreateEvent(auditor, 'org-read', req, {\n queryType: req.query.search ? 'by-query' : 'all',\n search: req.query?.search,\n });\n break;\n case Operations.FIND_ALL_REPOSITORIES:\n auditorEvent = await auditCreateEvent(auditor, 'repo-read', req, {\n queryType: req.query.search ? 'by-query' : 'all',\n search: req.query.search,\n });\n break;\n case Operations.FIND_REPOSITORIES_BY_ORGANIZATION: {\n const organizationName = req.params.organizationName?.toString();\n auditorEvent = await auditCreateEvent(auditor, 'repo-read', req, {\n queryType: 'by-org',\n organizationName,\n });\n break;\n }\n case Operations.FIND_ALL_IMPORTS:\n auditorEvent = await auditCreateEvent(auditor, 'import-read', req, {\n queryType: req.query.search ? 'by-query' : 'all',\n search: req.query.search,\n });\n break;\n case Operations.CREATE_IMPORT_JOBS:\n auditorEvent = await auditCreateEvent(auditor, 'import-write', req, {\n actionType: 'create',\n dryRun: req.query.dryRun,\n });\n break;\n case Operations.FIND_IMPORT_STATUS_BY_REPO:\n auditorEvent = await auditCreateEvent(\n auditor,\n 'import-status-read',\n req,\n { queryType: 'by-query', repo: req.query.repo },\n );\n break;\n case Operations.DELETE_IMPORT_BY_REPO:\n auditorEvent = await auditCreateEvent(auditor, 'import-write', req, {\n actionType: 'delete',\n repository: req.query.repo,\n });\n break;\n case undefined:\n auditorEvent = await auditCreateEvent(auditor, operationId, req);\n break;\n default:\n // do nothing\n break;\n }\n return auditorEvent;\n}\n\nfunction stringToNumber(s: number | undefined): number | undefined {\n return s ? Number.parseInt(s.toString(), 10) : undefined;\n}\n\nfunction stringToBoolean(s: boolean | undefined): boolean | undefined {\n if (!s) {\n return undefined;\n }\n return s.toString() === 'true';\n}\n"],"names":["Operations","auth","githubApiService","GithubApiService","gitlabApiService","GitlabApiService","catalogHttpClient","CatalogHttpClient","catalogInfoGenerator","CatalogInfoGenerator","OpenAPIBackend","fullFormats","openApiDocument","ping","findAllOrganizations","findAllRepositories","findRepositoriesByOrganization","findAllImports","createImportJobs","findImportStatusByRepo","deleteImportByRepo","parseGitURLForApprovalTool","Router","express","createPermissionIntegrationRouter","bulkImportPermission","permissionCheck","MiddlewareFactory","auditCreateEvent"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"router.cjs.js","sources":["../../src/service/router.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 { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport type {\n AuditorService,\n AuditorServiceEvent,\n AuthService,\n CacheService,\n DatabaseService,\n DiscoveryService,\n HttpAuthService,\n LoggerService,\n} from '@backstage/backend-plugin-api';\nimport type { CatalogApi } from '@backstage/catalog-client';\nimport type { Config } from '@backstage/config';\nimport type { PermissionEvaluator } from '@backstage/plugin-permission-common';\nimport { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';\n\nimport { fullFormats } from 'ajv-formats/dist/formats';\nimport express, { Router, type Request, type Response } from 'express';\nimport {\n Document,\n OpenAPIBackend,\n type Context,\n type Request as OpenAPIRequest,\n} from 'openapi-backend';\n\nimport { bulkImportPermission } from '@red-hat-developer-hub/backstage-plugin-bulk-import-common';\n\nimport { CatalogHttpClient } from '../catalog/catalogHttpClient';\nimport { CatalogInfoGenerator } from '../catalog/catalogInfoGenerator';\nimport { migrate } from '../database/migration';\nimport {\n RepositoryDao,\n ScaffolderTaskDao,\n TaskLocationsDao,\n} from '../database/repositoryDao';\nimport type { Components, Paths, SourceImport } from '../generated/openapi.d';\nimport { openApiDocument } from '../generated/openapidocument';\nimport { GithubApiService } from '../github';\nimport { GitlabApiService } from '../gitlab';\nimport {\n getImportTemplateRef,\n parseGitURLForApprovalTool,\n permissionCheck,\n} from '../helpers';\nimport { auditCreateEvent } from '../helpers/auditorUtils';\nimport {\n createImportJobs,\n deleteImportByRepo,\n deleteTaskImportByRepo,\n findAllImports,\n findImportStatusByRepo,\n findTaskImportStatusByRepo,\n sortImports,\n} from './handlers/import';\nimport { createTaskImportJobs } from './handlers/import/execute-template';\nimport { findAllOrganizations } from './handlers/organization';\nimport { ping } from './handlers/ping';\nimport {\n findAllRepositories,\n findRepositoriesByOrganization,\n} from './handlers/repository';\n\n/**\n * Router Options\n * @public\n */\nexport interface RouterOptions {\n logger: LoggerService;\n permissions: PermissionEvaluator;\n config: Config;\n cache: CacheService;\n discovery: DiscoveryService;\n httpAuth: HttpAuthService;\n auth: AuthService;\n catalogApi: CatalogApi;\n auditor: AuditorService;\n database: DatabaseService;\n}\n\nnamespace Operations {\n export const PING = 'ping';\n export const FIND_ALL_ORGANIZATIONS = 'findAllOrganizations';\n export const FIND_ALL_REPOSITORIES = 'findAllRepositories';\n\n export const FIND_REPOSITORIES_BY_ORGANIZATION =\n 'findRepositoriesByOrganization';\n\n export const FIND_ALL_IMPORTS = 'findAllImports';\n export const FIND_ALL_TASK_IMPORTS = 'findAllTaskImports';\n\n export const CREATE_IMPORT_JOBS = 'createImportJobs';\n export const CREATE_TASK_IMPORT_JOBS = 'createTaskImportJobs';\n\n export const FIND_IMPORT_STATUS_BY_REPO = 'findImportStatusByRepo';\n export const FIND_TASK_IMPORT_STATUS_BY_REPO = 'findTaskImportStatusByRepo';\n\n export const DELETE_IMPORT_BY_REPO = 'deleteImportByRepo';\n export const DELETE_TASK_IMPORT_BY_REPO = 'deleteTaskImportByRepo';\n}\n\n/**\n * Router\n * @public\n */\nexport async function createRouter(\n options: RouterOptions,\n): Promise<express.Router> {\n const {\n logger,\n httpAuth,\n auth,\n permissions,\n config,\n cache,\n discovery,\n catalogApi,\n auditor: auditor,\n database,\n } = options;\n\n const knex = await migrate(database);\n const repositoryDao = new RepositoryDao(knex, logger);\n const taskDao = new ScaffolderTaskDao(knex);\n const taskLocationsDao = new TaskLocationsDao(knex);\n // This should probably be sometype of object that holds all the scm API service objects\n const githubApiService = new GithubApiService(logger, config, cache);\n const gitlabApiService = new GitlabApiService(logger, config, cache);\n const catalogHttpClient = new CatalogHttpClient({\n logger,\n config,\n discovery,\n auth,\n catalogApi,\n });\n const catalogInfoGenerator = new CatalogInfoGenerator(\n logger,\n catalogHttpClient,\n );\n\n // create openapi requests handler\n const api = new OpenAPIBackend({\n ajvOpts: {\n verbose: true,\n formats: fullFormats, // open issue: https://github.com/openapistack/openapi-backend/issues/280\n },\n validate: true,\n definition: openApiDocument,\n handlers: {\n validationFail: async (c, _req: Request, res: Response) =>\n res.status(400).json({ err: c.validation.errors }),\n notFound: async (_c, req: Request, res: Response) =>\n res.status(404).json({ err: `'${req.method} ${req.path}' not found` }),\n notImplemented: async (_c, req: Request, res: Response) =>\n res\n .status(500)\n .json({ err: `'${req.method} ${req.path}' not implemented` }),\n },\n });\n\n const templateRef = config.getOptionalString('bulkImport.importTemplate');\n let finalTemplateRef: string | undefined;\n if (templateRef) {\n finalTemplateRef = getImportTemplateRef(templateRef);\n }\n\n await api.init();\n\n api.register(\n Operations.PING,\n async (_c: Context, _req: Request, res: Response) => {\n const result = await ping(logger);\n return res.status(result.statusCode).json(result.responseBody);\n },\n );\n\n api.register(\n Operations.FIND_ALL_ORGANIZATIONS,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindAllOrganizations.QueryParameters = {\n ...c.request.query,\n };\n // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571\n q.pagePerIntegration = stringToNumber(q.pagePerIntegration);\n q.sizePerIntegration = stringToNumber(q.sizePerIntegration);\n const response = await findAllOrganizations(\n logger,\n q.approvalTool === 'GITLAB' ? gitlabApiService : githubApiService,\n q.search,\n q.pagePerIntegration,\n q.sizePerIntegration,\n );\n return res.status(response.statusCode).json({\n errors: response.responseBody?.errors,\n organizations: response.responseBody?.organizations,\n totalCount: response.responseBody?.totalCount,\n pagePerIntegration: response.responseBody?.pagePerIntegration,\n sizePerIntegration: response.responseBody?.sizePerIntegration,\n approvalTool: q.approvalTool,\n } as Components.Schemas.OrganizationList);\n },\n );\n\n api.register(\n Operations.FIND_ALL_REPOSITORIES,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindAllRepositories.QueryParameters = {\n ...c.request.query,\n };\n // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571\n q.pagePerIntegration = stringToNumber(q.pagePerIntegration);\n q.sizePerIntegration = stringToNumber(q.sizePerIntegration);\n q.checkImportStatus = stringToBoolean(q.checkImportStatus);\n const response = await findAllRepositories(\n {\n logger,\n config,\n gitApiService:\n q.approvalTool === 'GITLAB' ? gitlabApiService : githubApiService,\n catalogHttpClient,\n },\n {\n search: q.search,\n checkStatus: q.checkImportStatus,\n pageNumber: q.pagePerIntegration,\n pageSize: q.sizePerIntegration,\n approvalTool: q.approvalTool,\n },\n );\n const repos = response.responseBody?.repositories;\n return res.status(response.statusCode).json({\n errors: response.responseBody?.errors,\n repositories: repos,\n totalCount: response.responseBody?.totalCount,\n pagePerIntegration: q.pagePerIntegration,\n sizePerIntegration: q.sizePerIntegration,\n approvalTool: q.approvalTool,\n } as Components.Schemas.RepositoryList);\n },\n );\n\n api.register(\n Operations.FIND_REPOSITORIES_BY_ORGANIZATION,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindRepositoriesByOrganization.QueryParameters = {\n ...c.request.query,\n };\n // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571\n q.pagePerIntegration = stringToNumber(q.pagePerIntegration);\n q.sizePerIntegration = stringToNumber(q.sizePerIntegration);\n q.checkImportStatus = stringToBoolean(q.checkImportStatus);\n const response = await findRepositoriesByOrganization(\n {\n logger,\n config,\n gitApiService:\n q.approvalTool === 'GITLAB' ? gitlabApiService : githubApiService,\n catalogHttpClient,\n },\n c.request.params.organizationName?.toString(),\n q.search,\n q.checkImportStatus,\n q.pagePerIntegration,\n q.sizePerIntegration,\n );\n const repos = response.responseBody?.repositories;\n return res.status(response.statusCode).json({\n errors: response.responseBody?.errors,\n repositories: repos,\n totalCount: response.responseBody?.totalCount,\n pagePerIntegration: q.pagePerIntegration,\n sizePerIntegration: q.sizePerIntegration,\n approvalTool: q.approvalTool,\n } as Components.Schemas.RepositoryList);\n },\n );\n\n api.register(\n Operations.FIND_ALL_IMPORTS,\n async (c: Context, _req: Request, res: Response) => {\n const {\n pageNumber,\n pageSize,\n apiVersion,\n search,\n sortColumn,\n sortOrder,\n } = getFindImportsParams(c);\n const response = await findAllImports(\n {\n logger,\n config,\n githubApiService,\n gitlabApiService,\n catalogHttpClient,\n },\n {\n apiVersion,\n },\n {\n search,\n pageNumber,\n pageSize,\n sortColumn,\n sortOrder,\n },\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n api.register(\n Operations.FIND_ALL_TASK_IMPORTS,\n async (c: Context, _req: Request, res: Response) => {\n const { pageNumber, pageSize, search, sortColumn, sortOrder } =\n getFindImportsParams(c);\n const imports: SourceImport[] = [];\n const repositories = await repositoryDao.findRepositories(\n pageNumber,\n pageSize,\n search,\n );\n\n for (const repo of repositories.data) {\n const response = await findTaskImportStatusByRepo(\n {\n logger,\n config,\n githubApiService,\n gitlabApiService,\n catalogHttpClient,\n repositoryDao,\n taskDao,\n taskLocationsDao,\n discovery,\n auth,\n },\n repo.url,\n true,\n );\n if (response.responseBody) {\n imports.push(response.responseBody);\n }\n }\n\n sortImports(imports, sortColumn, sortOrder);\n\n const responseBody: Components.Schemas.ImportJobListV2 = {\n imports,\n totalCount: repositories.total,\n page: pageNumber || 1,\n size: pageSize || 5,\n };\n\n return res.status(200).json(responseBody);\n },\n );\n\n api.register(\n Operations.CREATE_IMPORT_JOBS,\n async (\n c: Context<Paths.CreateImportJobs.RequestBody>,\n _req: Request,\n res: Response,\n ) => {\n const q: Paths.CreateImportJobs.QueryParameters = {\n ...c.request.query,\n };\n q.dryRun = stringToBoolean(q.dryRun);\n const response = await createImportJobs(\n {\n logger,\n config,\n auth,\n catalogApi,\n gitlabApiService,\n githubApiService,\n catalogInfoGenerator,\n catalogHttpClient,\n },\n {\n importRequests: c.request.requestBody,\n dryRun: q.dryRun,\n },\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.CREATE_TASK_IMPORT_JOBS,\n async (\n c: Context<Paths.CreateImportJobs.RequestBody>,\n _req: Request,\n res: Response,\n ) => {\n if (!finalTemplateRef) {\n throw new Error(\n `Missing required config value: 'bulkImport.importTemplate'`,\n );\n }\n const response = await createTaskImportJobs(\n finalTemplateRef,\n discovery,\n logger,\n auth,\n config,\n repositoryDao,\n taskDao,\n taskLocationsDao,\n c.request.requestBody,\n githubApiService,\n );\n\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.FIND_TASK_IMPORT_STATUS_BY_REPO,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindImportStatusByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank parameter');\n }\n const response = await findTaskImportStatusByRepo(\n {\n logger,\n config,\n githubApiService,\n gitlabApiService,\n catalogHttpClient,\n repositoryDao,\n taskDao,\n taskLocationsDao,\n discovery,\n auth,\n },\n q.repo,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.FIND_IMPORT_STATUS_BY_REPO,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.FindImportStatusByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank parameter');\n }\n const response = await findImportStatusByRepo(\n {\n logger,\n config,\n gitApiService:\n q.approvalTool === 'GITLAB' ? gitlabApiService : githubApiService,\n catalogHttpClient,\n approvalTool: q.approvalTool,\n },\n q.repo,\n q.defaultBranch,\n true,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.DELETE_TASK_IMPORT_BY_REPO,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.DeleteImportByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank \"repo\" parameter');\n }\n const response = await deleteTaskImportByRepo(\n {\n logger,\n dao: repositoryDao,\n },\n q.repo,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n api.register(\n Operations.DELETE_IMPORT_BY_REPO,\n async (c: Context, _req: Request, res: Response) => {\n const q: Paths.DeleteImportByRepo.QueryParameters = {\n ...c.request.query,\n };\n if (!q.repo?.trim()) {\n throw new Error('missing or blank \"repo\" parameter');\n }\n const response = await deleteImportByRepo(\n {\n logger,\n config,\n gitApiService:\n parseGitURLForApprovalTool(q.repo) === 'GITLAB'\n ? gitlabApiService\n : githubApiService,\n catalogHttpClient,\n },\n q.repo,\n q.defaultBranch,\n );\n return res.status(response.statusCode).json(response.responseBody);\n },\n );\n\n const router = Router();\n router.use(express.json());\n\n const permissionIntegrationRouter = createPermissionIntegrationRouter({\n permissions: [bulkImportPermission],\n });\n router.use(permissionIntegrationRouter);\n\n router.use(async (req, _res, next) => {\n if (req.path !== '/ping') {\n await permissionCheck(\n auditor,\n api.matchOperation(req as OpenAPIRequest)?.operationId,\n permissions,\n httpAuth,\n req,\n ).catch(next);\n }\n next();\n });\n\n router.use(async (req, res, next) => {\n const reqCast = req as OpenAPIRequest;\n const operationId = api.matchOperation(reqCast)?.operationId;\n\n const auditorEvent = await createAuditorEventByOperationId(\n operationId,\n req,\n auditor,\n );\n try {\n const response = (await api.handleRequest(reqCast, req, res)) as Response;\n auditorEvent?.success({ meta: { responseStatus: response.statusCode } });\n next();\n } catch (err: any) {\n auditorEvent?.fail({ error: err, meta: { responseStatus: 500 } });\n next(err);\n }\n });\n\n const middleware = MiddlewareFactory.create({ logger, config });\n router.use(middleware.error());\n\n return router;\n}\n\nasync function createAuditorEventByOperationId(\n operationId: string | undefined,\n req: Request,\n auditor: AuditorService,\n): Promise<AuditorServiceEvent | undefined> {\n let auditorEvent;\n switch (operationId) {\n case Operations.PING:\n auditorEvent = await auditCreateEvent(auditor, 'ping', req);\n break;\n case Operations.FIND_ALL_ORGANIZATIONS:\n auditorEvent = await auditCreateEvent(auditor, 'org-read', req, {\n queryType: req.query.search ? 'by-query' : 'all',\n search: req.query?.search,\n });\n break;\n case Operations.FIND_ALL_REPOSITORIES:\n auditorEvent = await auditCreateEvent(auditor, 'repo-read', req, {\n queryType: req.query.search ? 'by-query' : 'all',\n search: req.query.search,\n });\n break;\n case Operations.FIND_REPOSITORIES_BY_ORGANIZATION: {\n const organizationName = req.params.organizationName?.toString();\n auditorEvent = await auditCreateEvent(auditor, 'repo-read', req, {\n queryType: 'by-org',\n organizationName,\n });\n break;\n }\n case Operations.FIND_ALL_IMPORTS:\n case Operations.FIND_ALL_TASK_IMPORTS:\n auditorEvent = await auditCreateEvent(auditor, 'import-read', req, {\n queryType: req.query.search ? 'by-query' : 'all',\n search: req.query.search,\n });\n break;\n case Operations.CREATE_IMPORT_JOBS:\n case Operations.CREATE_TASK_IMPORT_JOBS:\n auditorEvent = await auditCreateEvent(auditor, 'import-write', req, {\n actionType: 'create',\n });\n break;\n case Operations.FIND_IMPORT_STATUS_BY_REPO:\n auditorEvent = await auditCreateEvent(\n auditor,\n 'import-status-read',\n req,\n { queryType: 'by-query', repo: req.query.repo },\n );\n break;\n case Operations.FIND_TASK_IMPORT_STATUS_BY_REPO:\n auditorEvent = await auditCreateEvent(\n auditor,\n 'import-status-read',\n req,\n { queryType: 'by-query', repo: req.query.repo },\n );\n break;\n case Operations.DELETE_IMPORT_BY_REPO:\n case Operations.DELETE_TASK_IMPORT_BY_REPO:\n auditorEvent = await auditCreateEvent(auditor, 'import-write', req, {\n actionType: 'delete',\n repository: req.query.repo,\n });\n break;\n case undefined:\n auditorEvent = await auditCreateEvent(auditor, operationId, req);\n break;\n default:\n // do nothing\n break;\n }\n return auditorEvent;\n}\n\nfunction stringToNumber(s: number | undefined): number | undefined {\n return s ? Number.parseInt(s.toString(), 10) : undefined;\n}\n\nfunction stringToBoolean(s: boolean | undefined): boolean | undefined {\n if (!s) {\n return undefined;\n }\n return s.toString() === 'true';\n}\nfunction getFindImportsParams(c: Context<any, any, any, any, any, Document>): {\n pageNumber?: number;\n pageSize?: number;\n apiVersion?: Paths.FindAllImports.Parameters.ApiVersion;\n search?: string;\n sortColumn?: Components.Parameters.SortColumnQueryParam;\n sortOrder?: Components.Parameters.SortOrderQueryParam;\n} {\n const h: Paths.FindAllImports.HeaderParameters = {\n ...c.request.headers,\n };\n const apiVersion = h['api-version'];\n const q: Paths.FindAllImports.QueryParameters = {\n ...c.request.query,\n };\n // we need to convert strings to real types due to open PR https://github.com/openapistack/openapi-backend/pull/571\n let pageNumber: number | undefined;\n let pageSize: number | undefined;\n if (apiVersion === undefined || apiVersion === 'v1') {\n // pagePerIntegration and sizePerIntegration deprecated in v1. 'page' and 'size' take precedence.\n pageNumber = stringToNumber(q.page || q.pagePerIntegration);\n pageSize = stringToNumber(q.size || q.sizePerIntegration);\n } else {\n // pagePerIntegration and sizePerIntegration removed in v2+ and replaced by 'page' and 'size'.\n pageNumber = stringToNumber(q.page);\n pageSize = stringToNumber(q.size);\n }\n return {\n pageNumber,\n pageSize,\n apiVersion: apiVersion,\n search: q.search,\n sortColumn: q.sortColumn,\n sortOrder: q.sortOrder,\n };\n}\n"],"names":["Operations","auth","migrate","repositoryDao","RepositoryDao","ScaffolderTaskDao","TaskLocationsDao","githubApiService","GithubApiService","gitlabApiService","GitlabApiService","catalogHttpClient","CatalogHttpClient","catalogInfoGenerator","CatalogInfoGenerator","OpenAPIBackend","fullFormats","openApiDocument","getImportTemplateRef","ping","findAllOrganizations","findAllRepositories","findRepositoriesByOrganization","findAllImports","findTaskImportStatusByRepo","sortImports","createImportJobs","createTaskImportJobs","findImportStatusByRepo","deleteTaskImportByRepo","deleteImportByRepo","parseGitURLForApprovalTool","Router","express","createPermissionIntegrationRouter","bulkImportPermission","permissionCheck","MiddlewareFactory","auditCreateEvent"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+FA,IAAU,UAAA;AAAA,CAAV,CAAUA,WAAV,KAAA;AACS,EAAMA,YAAA,IAAO,GAAA,MAAA;AACb,EAAMA,YAAA,sBAAyB,GAAA,sBAAA;AAC/B,EAAMA,YAAA,qBAAwB,GAAA,qBAAA;AAE9B,EAAMA,YAAA,iCACX,GAAA,gCAAA;AAEK,EAAMA,YAAA,gBAAmB,GAAA,gBAAA;AACzB,EAAMA,YAAA,qBAAwB,GAAA,oBAAA;AAE9B,EAAMA,YAAA,kBAAqB,GAAA,kBAAA;AAC3B,EAAMA,YAAA,uBAA0B,GAAA,sBAAA;AAEhC,EAAMA,YAAA,0BAA6B,GAAA,wBAAA;AACnC,EAAMA,YAAA,+BAAkC,GAAA,4BAAA;AAExC,EAAMA,YAAA,qBAAwB,GAAA,oBAAA;AAC9B,EAAMA,YAAA,0BAA6B,GAAA,wBAAA;AAAA,CAlBlC,EAAA,UAAA,KAAA,UAAA,GAAA,EAAA,CAAA,CAAA;AAyBV,eAAsB,aACpB,OACyB,EAAA;AACzB,EAAM,MAAA;AAAA,IACJ,MAAA;AAAA,IACA,QAAA;AAAA,UACAC,MAAA;AAAA,IACA,WAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACE,GAAA,OAAA;AAEJ,EAAM,MAAA,IAAA,GAAO,MAAMC,iBAAA,CAAQ,QAAQ,CAAA;AACnC,EAAA,MAAMC,eAAgB,GAAA,IAAIC,2BAAc,CAAA,IAAA,EAAM,MAAM,CAAA;AACpD,EAAM,MAAA,OAAA,GAAU,IAAIC,+BAAA,CAAkB,IAAI,CAAA;AAC1C,EAAM,MAAA,gBAAA,GAAmB,IAAIC,8BAAA,CAAiB,IAAI,CAAA;AAElD,EAAA,MAAMC,kBAAmB,GAAA,IAAIC,iCAAiB,CAAA,MAAA,EAAQ,QAAQ,KAAK,CAAA;AACnE,EAAA,MAAMC,kBAAmB,GAAA,IAAIC,iCAAiB,CAAA,MAAA,EAAQ,QAAQ,KAAK,CAAA;AACnE,EAAM,MAAAC,mBAAA,GAAoB,IAAIC,mCAAkB,CAAA;AAAA,IAC9C,MAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,UACAX,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AACD,EAAA,MAAMY,yBAAuB,IAAIC,yCAAA;AAAA,IAC/B,MAAA;AAAA,IACAH;AAAA,GACF;AAGA,EAAM,MAAA,GAAA,GAAM,IAAII,6BAAe,CAAA;AAAA,IAC7B,OAAS,EAAA;AAAA,MACP,OAAS,EAAA,IAAA;AAAA,MACT,OAAS,EAAAC;AAAA;AAAA,KACX;AAAA,IACA,QAAU,EAAA,IAAA;AAAA,IACV,UAAY,EAAAC,+BAAA;AAAA,IACZ,QAAU,EAAA;AAAA,MACR,cAAgB,EAAA,OAAO,CAAG,EAAA,IAAA,EAAe,QACvC,GAAI,CAAA,MAAA,CAAO,GAAG,CAAA,CAAE,KAAK,EAAE,GAAA,EAAK,CAAE,CAAA,UAAA,CAAW,QAAQ,CAAA;AAAA,MACnD,UAAU,OAAO,EAAA,EAAI,KAAc,GACjC,KAAA,GAAA,CAAI,OAAO,GAAG,CAAA,CAAE,KAAK,EAAE,GAAA,EAAK,IAAI,GAAI,CAAA,MAAM,IAAI,GAAI,CAAA,IAAI,eAAe,CAAA;AAAA,MACvE,gBAAgB,OAAO,EAAA,EAAI,KAAc,GACvC,KAAA,GAAA,CACG,OAAO,GAAG,CAAA,CACV,KAAK,EAAE,GAAA,EAAK,IAAI,GAAI,CAAA,MAAM,IAAI,GAAI,CAAA,IAAI,qBAAqB;AAAA;AAClE,GACD,CAAA;AAED,EAAM,MAAA,WAAA,GAAc,MAAO,CAAA,iBAAA,CAAkB,2BAA2B,CAAA;AACxE,EAAI,IAAA,gBAAA;AACJ,EAAA,IAAI,WAAa,EAAA;AACf,IAAA,gBAAA,GAAmBC,2BAAqB,WAAW,CAAA;AAAA;AAGrD,EAAA,MAAM,IAAI,IAAK,EAAA;AAEf,EAAI,GAAA,CAAA,QAAA;AAAA,IACF,UAAW,CAAA,IAAA;AAAA,IACX,OAAO,EAAa,EAAA,IAAA,EAAe,GAAkB,KAAA;AACnD,MAAM,MAAA,MAAA,GAAS,MAAMC,SAAA,CAAK,MAAM,CAAA;AAChC,MAAA,OAAO,IAAI,MAAO,CAAA,MAAA,CAAO,UAAU,CAAE,CAAA,IAAA,CAAK,OAAO,YAAY,CAAA;AAAA;AAC/D,GACF;AAEA,EAAI,GAAA,CAAA,QAAA;AAAA,IACF,UAAW,CAAA,sBAAA;AAAA,IACX,OAAO,CAAY,EAAA,IAAA,EAAe,GAAkB,KAAA;AAClD,MAAA,MAAM,CAAgD,GAAA;AAAA,QACpD,GAAG,EAAE,OAAQ,CAAA;AAAA,OACf;AAEA,MAAE,CAAA,CAAA,kBAAA,GAAqB,cAAe,CAAA,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAE,CAAA,CAAA,kBAAA,GAAqB,cAAe,CAAA,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAA,MAAM,WAAW,MAAMC,kCAAA;AAAA,QACrB,MAAA;AAAA,QACA,CAAA,CAAE,YAAiB,KAAA,QAAA,GAAWX,kBAAmB,GAAAF,kBAAA;AAAA,QACjD,CAAE,CAAA,MAAA;AAAA,QACF,CAAE,CAAA,kBAAA;AAAA,QACF,CAAE,CAAA;AAAA,OACJ;AACA,MAAA,OAAO,GAAI,CAAA,MAAA,CAAO,QAAS,CAAA,UAAU,EAAE,IAAK,CAAA;AAAA,QAC1C,MAAA,EAAQ,SAAS,YAAc,EAAA,MAAA;AAAA,QAC/B,aAAA,EAAe,SAAS,YAAc,EAAA,aAAA;AAAA,QACtC,UAAA,EAAY,SAAS,YAAc,EAAA,UAAA;AAAA,QACnC,kBAAA,EAAoB,SAAS,YAAc,EAAA,kBAAA;AAAA,QAC3C,kBAAA,EAAoB,SAAS,YAAc,EAAA,kBAAA;AAAA,QAC3C,cAAc,CAAE,CAAA;AAAA,OACsB,CAAA;AAAA;AAC1C,GACF;AAEA,EAAI,GAAA,CAAA,QAAA;AAAA,IACF,UAAW,CAAA,qBAAA;AAAA,IACX,OAAO,CAAY,EAAA,IAAA,EAAe,GAAkB,KAAA;AAClD,MAAA,MAAM,CAA+C,GAAA;AAAA,QACnD,GAAG,EAAE,OAAQ,CAAA;AAAA,OACf;AAEA,MAAE,CAAA,CAAA,kBAAA,GAAqB,cAAe,CAAA,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAE,CAAA,CAAA,kBAAA,GAAqB,cAAe,CAAA,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAE,CAAA,CAAA,iBAAA,GAAoB,eAAgB,CAAA,CAAA,CAAE,iBAAiB,CAAA;AACzD,MAAA,MAAM,WAAW,MAAMc,gCAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,UACA,aACE,EAAA,CAAA,CAAE,YAAiB,KAAA,QAAA,GAAWZ,kBAAmB,GAAAF,kBAAA;AAAA,6BACnDI;AAAA,SACF;AAAA,QACA;AAAA,UACE,QAAQ,CAAE,CAAA,MAAA;AAAA,UACV,aAAa,CAAE,CAAA,iBAAA;AAAA,UACf,YAAY,CAAE,CAAA,kBAAA;AAAA,UACd,UAAU,CAAE,CAAA,kBAAA;AAAA,UACZ,cAAc,CAAE,CAAA;AAAA;AAClB,OACF;AACA,MAAM,MAAA,KAAA,GAAQ,SAAS,YAAc,EAAA,YAAA;AACrC,MAAA,OAAO,GAAI,CAAA,MAAA,CAAO,QAAS,CAAA,UAAU,EAAE,IAAK,CAAA;AAAA,QAC1C,MAAA,EAAQ,SAAS,YAAc,EAAA,MAAA;AAAA,QAC/B,YAAc,EAAA,KAAA;AAAA,QACd,UAAA,EAAY,SAAS,YAAc,EAAA,UAAA;AAAA,QACnC,oBAAoB,CAAE,CAAA,kBAAA;AAAA,QACtB,oBAAoB,CAAE,CAAA,kBAAA;AAAA,QACtB,cAAc,CAAE,CAAA;AAAA,OACoB,CAAA;AAAA;AACxC,GACF;AAEA,EAAI,GAAA,CAAA,QAAA;AAAA,IACF,UAAW,CAAA,iCAAA;AAAA,IACX,OAAO,CAAY,EAAA,IAAA,EAAe,GAAkB,KAAA;AAClD,MAAA,MAAM,CAA0D,GAAA;AAAA,QAC9D,GAAG,EAAE,OAAQ,CAAA;AAAA,OACf;AAEA,MAAE,CAAA,CAAA,kBAAA,GAAqB,cAAe,CAAA,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAE,CAAA,CAAA,kBAAA,GAAqB,cAAe,CAAA,CAAA,CAAE,kBAAkB,CAAA;AAC1D,MAAE,CAAA,CAAA,iBAAA,GAAoB,eAAgB,CAAA,CAAA,CAAE,iBAAiB,CAAA;AACzD,MAAA,MAAM,WAAW,MAAMW,2CAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,UACA,aACE,EAAA,CAAA,CAAE,YAAiB,KAAA,QAAA,GAAWb,kBAAmB,GAAAF,kBAAA;AAAA,6BACnDI;AAAA,SACF;AAAA,QACA,CAAE,CAAA,OAAA,CAAQ,MAAO,CAAA,gBAAA,EAAkB,QAAS,EAAA;AAAA,QAC5C,CAAE,CAAA,MAAA;AAAA,QACF,CAAE,CAAA,iBAAA;AAAA,QACF,CAAE,CAAA,kBAAA;AAAA,QACF,CAAE,CAAA;AAAA,OACJ;AACA,MAAM,MAAA,KAAA,GAAQ,SAAS,YAAc,EAAA,YAAA;AACrC,MAAA,OAAO,GAAI,CAAA,MAAA,CAAO,QAAS,CAAA,UAAU,EAAE,IAAK,CAAA;AAAA,QAC1C,MAAA,EAAQ,SAAS,YAAc,EAAA,MAAA;AAAA,QAC/B,YAAc,EAAA,KAAA;AAAA,QACd,UAAA,EAAY,SAAS,YAAc,EAAA,UAAA;AAAA,QACnC,oBAAoB,CAAE,CAAA,kBAAA;AAAA,QACtB,oBAAoB,CAAE,CAAA,kBAAA;AAAA,QACtB,cAAc,CAAE,CAAA;AAAA,OACoB,CAAA;AAAA;AACxC,GACF;AAEA,EAAI,GAAA,CAAA,QAAA;AAAA,IACF,UAAW,CAAA,gBAAA;AAAA,IACX,OAAO,CAAY,EAAA,IAAA,EAAe,GAAkB,KAAA;AAClD,MAAM,MAAA;AAAA,QACJ,UAAA;AAAA,QACA,QAAA;AAAA,QACA,UAAA;AAAA,QACA,MAAA;AAAA,QACA,UAAA;AAAA,QACA;AAAA,OACF,GAAI,qBAAqB,CAAC,CAAA;AAC1B,MAAA,MAAM,WAAW,MAAMY,0BAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,4BACAhB,kBAAA;AAAA,4BACAE,kBAAA;AAAA,6BACAE;AAAA,SACF;AAAA,QACA;AAAA,UACE;AAAA,SACF;AAAA,QACA;AAAA,UACE,MAAA;AAAA,UACA,UAAA;AAAA,UACA,QAAA;AAAA,UACA,UAAA;AAAA,UACA;AAAA;AACF,OACF;AACA,MAAA,OAAO,IAAI,MAAO,CAAA,QAAA,CAAS,UAAU,CAAE,CAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA;AACnE,GACF;AACA,EAAI,GAAA,CAAA,QAAA;AAAA,IACF,UAAW,CAAA,qBAAA;AAAA,IACX,OAAO,CAAY,EAAA,IAAA,EAAe,GAAkB,KAAA;AAClD,MAAM,MAAA,EAAE,YAAY,QAAU,EAAA,MAAA,EAAQ,YAAY,SAAU,EAAA,GAC1D,qBAAqB,CAAC,CAAA;AACxB,MAAA,MAAM,UAA0B,EAAC;AACjC,MAAM,MAAA,YAAA,GAAe,MAAMR,eAAc,CAAA,gBAAA;AAAA,QACvC,UAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF;AAEA,MAAW,KAAA,MAAA,IAAA,IAAQ,aAAa,IAAM,EAAA;AACpC,QAAA,MAAM,WAAW,MAAMqB,sCAAA;AAAA,UACrB;AAAA,YACE,MAAA;AAAA,YACA,MAAA;AAAA,8BACAjB,kBAAA;AAAA,8BACAE,kBAAA;AAAA,+BACAE,mBAAA;AAAA,2BACAR,eAAA;AAAA,YACA,OAAA;AAAA,YACA,gBAAA;AAAA,YACA,SAAA;AAAA,kBACAF;AAAA,WACF;AAAA,UACA,IAAK,CAAA,GAAA;AAAA,UACL;AAAA,SACF;AACA,QAAA,IAAI,SAAS,YAAc,EAAA;AACzB,UAAQ,OAAA,CAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA;AACpC;AAGF,MAAYwB,uBAAA,CAAA,OAAA,EAAS,YAAY,SAAS,CAAA;AAE1C,MAAA,MAAM,YAAmD,GAAA;AAAA,QACvD,OAAA;AAAA,QACA,YAAY,YAAa,CAAA,KAAA;AAAA,QACzB,MAAM,UAAc,IAAA,CAAA;AAAA,QACpB,MAAM,QAAY,IAAA;AAAA,OACpB;AAEA,MAAA,OAAO,GAAI,CAAA,MAAA,CAAO,GAAG,CAAA,CAAE,KAAK,YAAY,CAAA;AAAA;AAC1C,GACF;AAEA,EAAI,GAAA,CAAA,QAAA;AAAA,IACF,UAAW,CAAA,kBAAA;AAAA,IACX,OACE,CACA,EAAA,IAAA,EACA,GACG,KAAA;AACH,MAAA,MAAM,CAA4C,GAAA;AAAA,QAChD,GAAG,EAAE,OAAQ,CAAA;AAAA,OACf;AACA,MAAE,CAAA,CAAA,MAAA,GAAS,eAAgB,CAAA,CAAA,CAAE,MAAM,CAAA;AACnC,MAAA,MAAM,WAAW,MAAMC,4BAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,gBACAzB,MAAA;AAAA,UACA,UAAA;AAAA,4BACAQ,kBAAA;AAAA,4BACAF,kBAAA;AAAA,gCACAM,sBAAA;AAAA,6BACAF;AAAA,SACF;AAAA,QACA;AAAA,UACE,cAAA,EAAgB,EAAE,OAAQ,CAAA,WAAA;AAAA,UAC1B,QAAQ,CAAE,CAAA;AAAA;AACZ,OACF;AACA,MAAA,OAAO,IAAI,MAAO,CAAA,QAAA,CAAS,UAAU,CAAE,CAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA;AACnE,GACF;AAEA,EAAI,GAAA,CAAA,QAAA;AAAA,IACF,UAAW,CAAA,uBAAA;AAAA,IACX,OACE,CACA,EAAA,IAAA,EACA,GACG,KAAA;AACH,MAAA,IAAI,CAAC,gBAAkB,EAAA;AACrB,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,0DAAA;AAAA,SACF;AAAA;AAEF,MAAA,MAAM,WAAW,MAAMgB,oCAAA;AAAA,QACrB,gBAAA;AAAA,QACA,SAAA;AAAA,QACA,MAAA;AAAA,QACA1B,MAAA;AAAA,QACA,MAAA;AAAA,QACAE,eAAA;AAAA,QACA,OAAA;AAAA,QACA,gBAAA;AAAA,QACA,EAAE,OAAQ,CAAA,WAAA;AAAA,QACVI;AAAA,OACF;AAEA,MAAA,OAAO,IAAI,MAAO,CAAA,QAAA,CAAS,UAAU,CAAE,CAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA;AACnE,GACF;AAEA,EAAI,GAAA,CAAA,QAAA;AAAA,IACF,UAAW,CAAA,+BAAA;AAAA,IACX,OAAO,CAAY,EAAA,IAAA,EAAe,GAAkB,KAAA;AAClD,MAAA,MAAM,CAAkD,GAAA;AAAA,QACtD,GAAG,EAAE,OAAQ,CAAA;AAAA,OACf;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,IAAM,EAAA,IAAA,EAAQ,EAAA;AACnB,QAAM,MAAA,IAAI,MAAM,4BAA4B,CAAA;AAAA;AAE9C,MAAA,MAAM,WAAW,MAAMiB,sCAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,4BACAjB,kBAAA;AAAA,4BACAE,kBAAA;AAAA,6BACAE,mBAAA;AAAA,yBACAR,eAAA;AAAA,UACA,OAAA;AAAA,UACA,gBAAA;AAAA,UACA,SAAA;AAAA,gBACAF;AAAA,SACF;AAAA,QACA,CAAE,CAAA;AAAA,OACJ;AACA,MAAA,OAAO,IAAI,MAAO,CAAA,QAAA,CAAS,UAAU,CAAE,CAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA;AACnE,GACF;AAEA,EAAI,GAAA,CAAA,QAAA;AAAA,IACF,UAAW,CAAA,0BAAA;AAAA,IACX,OAAO,CAAY,EAAA,IAAA,EAAe,GAAkB,KAAA;AAClD,MAAA,MAAM,CAAkD,GAAA;AAAA,QACtD,GAAG,EAAE,OAAQ,CAAA;AAAA,OACf;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,IAAM,EAAA,IAAA,EAAQ,EAAA;AACnB,QAAM,MAAA,IAAI,MAAM,4BAA4B,CAAA;AAAA;AAE9C,MAAA,MAAM,WAAW,MAAM2B,kCAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,UACA,aACE,EAAA,CAAA,CAAE,YAAiB,KAAA,QAAA,GAAWnB,kBAAmB,GAAAF,kBAAA;AAAA,6BACnDI,mBAAA;AAAA,UACA,cAAc,CAAE,CAAA;AAAA,SAClB;AAAA,QACA,CAAE,CAAA,IAAA;AAAA,QACF,CAAE,CAAA,aAAA;AAAA,QACF;AAAA,OACF;AACA,MAAA,OAAO,IAAI,MAAO,CAAA,QAAA,CAAS,UAAU,CAAE,CAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA;AACnE,GACF;AAEA,EAAI,GAAA,CAAA,QAAA;AAAA,IACF,UAAW,CAAA,0BAAA;AAAA,IACX,OAAO,CAAY,EAAA,IAAA,EAAe,GAAkB,KAAA;AAClD,MAAA,MAAM,CAA8C,GAAA;AAAA,QAClD,GAAG,EAAE,OAAQ,CAAA;AAAA,OACf;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,IAAM,EAAA,IAAA,EAAQ,EAAA;AACnB,QAAM,MAAA,IAAI,MAAM,mCAAmC,CAAA;AAAA;AAErD,MAAA,MAAM,WAAW,MAAMkB,kCAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,GAAK,EAAA1B;AAAA,SACP;AAAA,QACA,CAAE,CAAA;AAAA,OACJ;AACA,MAAA,OAAO,IAAI,MAAO,CAAA,QAAA,CAAS,UAAU,CAAE,CAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA;AACnE,GACF;AAEA,EAAI,GAAA,CAAA,QAAA;AAAA,IACF,UAAW,CAAA,qBAAA;AAAA,IACX,OAAO,CAAY,EAAA,IAAA,EAAe,GAAkB,KAAA;AAClD,MAAA,MAAM,CAA8C,GAAA;AAAA,QAClD,GAAG,EAAE,OAAQ,CAAA;AAAA,OACf;AACA,MAAA,IAAI,CAAC,CAAA,CAAE,IAAM,EAAA,IAAA,EAAQ,EAAA;AACnB,QAAM,MAAA,IAAI,MAAM,mCAAmC,CAAA;AAAA;AAErD,MAAA,MAAM,WAAW,MAAM2B,8BAAA;AAAA,QACrB;AAAA,UACE,MAAA;AAAA,UACA,MAAA;AAAA,UACA,eACEC,gCAA2B,CAAA,CAAA,CAAE,IAAI,CAAA,KAAM,WACnCtB,kBACA,GAAAF,kBAAA;AAAA,6BACNI;AAAA,SACF;AAAA,QACA,CAAE,CAAA,IAAA;AAAA,QACF,CAAE,CAAA;AAAA,OACJ;AACA,MAAA,OAAO,IAAI,MAAO,CAAA,QAAA,CAAS,UAAU,CAAE,CAAA,IAAA,CAAK,SAAS,YAAY,CAAA;AAAA;AACnE,GACF;AAEA,EAAA,MAAM,SAASqB,cAAO,EAAA;AACtB,EAAO,MAAA,CAAA,GAAA,CAAIC,wBAAQ,CAAA,IAAA,EAAM,CAAA;AAEzB,EAAA,MAAM,8BAA8BC,sDAAkC,CAAA;AAAA,IACpE,WAAA,EAAa,CAACC,oDAAoB;AAAA,GACnC,CAAA;AACD,EAAA,MAAA,CAAO,IAAI,2BAA2B,CAAA;AAEtC,EAAA,MAAA,CAAO,GAAI,CAAA,OAAO,GAAK,EAAA,IAAA,EAAM,IAAS,KAAA;AACpC,IAAI,IAAA,GAAA,CAAI,SAAS,OAAS,EAAA;AACxB,MAAM,MAAAC,oBAAA;AAAA,QACJ,OAAA;AAAA,QACA,GAAA,CAAI,cAAe,CAAA,GAAqB,CAAG,EAAA,WAAA;AAAA,QAC3C,WAAA;AAAA,QACA,QAAA;AAAA,QACA;AAAA,OACF,CAAE,MAAM,IAAI,CAAA;AAAA;AAEd,IAAK,IAAA,EAAA;AAAA,GACN,CAAA;AAED,EAAA,MAAA,CAAO,GAAI,CAAA,OAAO,GAAK,EAAA,GAAA,EAAK,IAAS,KAAA;AACnC,IAAA,MAAM,OAAU,GAAA,GAAA;AAChB,IAAA,MAAM,WAAc,GAAA,GAAA,CAAI,cAAe,CAAA,OAAO,CAAG,EAAA,WAAA;AAEjD,IAAA,MAAM,eAAe,MAAM,+BAAA;AAAA,MACzB,WAAA;AAAA,MACA,GAAA;AAAA,MACA;AAAA,KACF;AACA,IAAI,IAAA;AACF,MAAA,MAAM,WAAY,MAAM,GAAA,CAAI,aAAc,CAAA,OAAA,EAAS,KAAK,GAAG,CAAA;AAC3D,MAAc,YAAA,EAAA,OAAA,CAAQ,EAAE,IAAM,EAAA,EAAE,gBAAgB,QAAS,CAAA,UAAA,IAAc,CAAA;AACvE,MAAK,IAAA,EAAA;AAAA,aACE,GAAU,EAAA;AACjB,MAAc,YAAA,EAAA,IAAA,CAAK,EAAE,KAAO,EAAA,GAAA,EAAK,MAAM,EAAE,cAAA,EAAgB,GAAI,EAAA,EAAG,CAAA;AAChE,MAAA,IAAA,CAAK,GAAG,CAAA;AAAA;AACV,GACD,CAAA;AAED,EAAA,MAAM,aAAaC,gCAAkB,CAAA,MAAA,CAAO,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAC9D,EAAO,MAAA,CAAA,GAAA,CAAI,UAAW,CAAA,KAAA,EAAO,CAAA;AAE7B,EAAO,OAAA,MAAA;AACT;AAEA,eAAe,+BAAA,CACb,WACA,EAAA,GAAA,EACA,OAC0C,EAAA;AAC1C,EAAI,IAAA,YAAA;AACJ,EAAA,QAAQ,WAAa;AAAA,IACnB,KAAK,UAAW,CAAA,IAAA;AACd,MAAA,YAAA,GAAe,MAAMC,6BAAA,CAAiB,OAAS,EAAA,MAAA,EAAQ,GAAG,CAAA;AAC1D,MAAA;AAAA,IACF,KAAK,UAAW,CAAA,sBAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAS,EAAA,UAAA,EAAY,GAAK,EAAA;AAAA,QAC9D,SAAW,EAAA,GAAA,CAAI,KAAM,CAAA,MAAA,GAAS,UAAa,GAAA,KAAA;AAAA,QAC3C,MAAA,EAAQ,IAAI,KAAO,EAAA;AAAA,OACpB,CAAA;AACD,MAAA;AAAA,IACF,KAAK,UAAW,CAAA,qBAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAS,EAAA,WAAA,EAAa,GAAK,EAAA;AAAA,QAC/D,SAAW,EAAA,GAAA,CAAI,KAAM,CAAA,MAAA,GAAS,UAAa,GAAA,KAAA;AAAA,QAC3C,MAAA,EAAQ,IAAI,KAAM,CAAA;AAAA,OACnB,CAAA;AACD,MAAA;AAAA,IACF,KAAK,WAAW,iCAAmC,EAAA;AACjD,MAAA,MAAM,gBAAmB,GAAA,GAAA,CAAI,MAAO,CAAA,gBAAA,EAAkB,QAAS,EAAA;AAC/D,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAS,EAAA,WAAA,EAAa,GAAK,EAAA;AAAA,QAC/D,SAAW,EAAA,QAAA;AAAA,QACX;AAAA,OACD,CAAA;AACD,MAAA;AAAA;AACF,IACA,KAAK,UAAW,CAAA,gBAAA;AAAA,IAChB,KAAK,UAAW,CAAA,qBAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAS,EAAA,aAAA,EAAe,GAAK,EAAA;AAAA,QACjE,SAAW,EAAA,GAAA,CAAI,KAAM,CAAA,MAAA,GAAS,UAAa,GAAA,KAAA;AAAA,QAC3C,MAAA,EAAQ,IAAI,KAAM,CAAA;AAAA,OACnB,CAAA;AACD,MAAA;AAAA,IACF,KAAK,UAAW,CAAA,kBAAA;AAAA,IAChB,KAAK,UAAW,CAAA,uBAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAS,EAAA,cAAA,EAAgB,GAAK,EAAA;AAAA,QAClE,UAAY,EAAA;AAAA,OACb,CAAA;AACD,MAAA;AAAA,IACF,KAAK,UAAW,CAAA,0BAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA;AAAA,QACnB,OAAA;AAAA,QACA,oBAAA;AAAA,QACA,GAAA;AAAA,QACA,EAAE,SAAW,EAAA,UAAA,EAAY,IAAM,EAAA,GAAA,CAAI,MAAM,IAAK;AAAA,OAChD;AACA,MAAA;AAAA,IACF,KAAK,UAAW,CAAA,+BAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA;AAAA,QACnB,OAAA;AAAA,QACA,oBAAA;AAAA,QACA,GAAA;AAAA,QACA,EAAE,SAAW,EAAA,UAAA,EAAY,IAAM,EAAA,GAAA,CAAI,MAAM,IAAK;AAAA,OAChD;AACA,MAAA;AAAA,IACF,KAAK,UAAW,CAAA,qBAAA;AAAA,IAChB,KAAK,UAAW,CAAA,0BAAA;AACd,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAS,EAAA,cAAA,EAAgB,GAAK,EAAA;AAAA,QAClE,UAAY,EAAA,QAAA;AAAA,QACZ,UAAA,EAAY,IAAI,KAAM,CAAA;AAAA,OACvB,CAAA;AACD,MAAA;AAAA,IACF,KAAK,SAAA;AACH,MAAA,YAAA,GAAe,MAAMA,6BAAA,CAAiB,OAAS,EAAA,WAAA,EAAa,GAAG,CAAA;AAC/D,MAAA;AAGA;AAEJ,EAAO,OAAA,YAAA;AACT;AAEA,SAAS,eAAe,CAA2C,EAAA;AACjE,EAAA,OAAO,IAAI,MAAO,CAAA,QAAA,CAAS,EAAE,QAAS,EAAA,EAAG,EAAE,CAAI,GAAA,SAAA;AACjD;AAEA,SAAS,gBAAgB,CAA6C,EAAA;AACpE,EAAA,IAAI,CAAC,CAAG,EAAA;AACN,IAAO,OAAA,SAAA;AAAA;AAET,EAAO,OAAA,CAAA,CAAE,UAAe,KAAA,MAAA;AAC1B;AACA,SAAS,qBAAqB,CAO5B,EAAA;AACA,EAAA,MAAM,CAA2C,GAAA;AAAA,IAC/C,GAAG,EAAE,OAAQ,CAAA;AAAA,GACf;AACA,EAAM,MAAA,UAAA,GAAa,EAAE,aAAa,CAAA;AAClC,EAAA,MAAM,CAA0C,GAAA;AAAA,IAC9C,GAAG,EAAE,OAAQ,CAAA;AAAA,GACf;AAEA,EAAI,IAAA,UAAA;AACJ,EAAI,IAAA,QAAA;AACJ,EAAI,IAAA,UAAA,KAAe,SAAa,IAAA,UAAA,KAAe,IAAM,EAAA;AAEnD,IAAA,UAAA,GAAa,cAAe,CAAA,CAAA,CAAE,IAAQ,IAAA,CAAA,CAAE,kBAAkB,CAAA;AAC1D,IAAA,QAAA,GAAW,cAAe,CAAA,CAAA,CAAE,IAAQ,IAAA,CAAA,CAAE,kBAAkB,CAAA;AAAA,GACnD,MAAA;AAEL,IAAa,UAAA,GAAA,cAAA,CAAe,EAAE,IAAI,CAAA;AAClC,IAAW,QAAA,GAAA,cAAA,CAAe,EAAE,IAAI,CAAA;AAAA;AAElC,EAAO,OAAA;AAAA,IACL,UAAA;AAAA,IACA,QAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAQ,CAAE,CAAA,MAAA;AAAA,IACV,YAAY,CAAE,CAAA,UAAA;AAAA,IACd,WAAW,CAAE,CAAA;AAAA,GACf;AACF;;;;"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright Red Hat, Inc.
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
5
|
+
* you may not use this file except in compliance with the License.
|
|
6
|
+
* You may obtain a copy of the License at
|
|
7
|
+
*
|
|
8
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
9
|
+
*
|
|
10
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
11
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
12
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
13
|
+
* See the License for the specific language governing permissions and
|
|
14
|
+
* limitations under the License.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
exports.up = function up(knex) {
|
|
18
|
+
return knex.schema
|
|
19
|
+
.createTable('repositories', function repositories(table) {
|
|
20
|
+
table.increments('id').primary();
|
|
21
|
+
table.string('url').notNullable().unique();
|
|
22
|
+
table.string('approvalTool').notNullable();
|
|
23
|
+
})
|
|
24
|
+
.createTable('scaffolder_tasks', function scaffolder_tasks(table) {
|
|
25
|
+
table.string('taskId').primary();
|
|
26
|
+
table.json('scaffolderOptions');
|
|
27
|
+
table.integer('repositoryId').notNullable();
|
|
28
|
+
table
|
|
29
|
+
.foreign('repositoryId')
|
|
30
|
+
.references('id')
|
|
31
|
+
.inTable('repositories')
|
|
32
|
+
.onDelete('CASCADE');
|
|
33
|
+
table.timestamp('executedAt', { useTz: true });
|
|
34
|
+
})
|
|
35
|
+
.createTable('task_locations', function task_locations(table) {
|
|
36
|
+
table.increments('id').primary();
|
|
37
|
+
table.string('taskId').notNullable();
|
|
38
|
+
table
|
|
39
|
+
.foreign('taskId')
|
|
40
|
+
.references('taskId')
|
|
41
|
+
.inTable('scaffolder_tasks')
|
|
42
|
+
.onDelete('CASCADE');
|
|
43
|
+
table.string('location').notNullable();
|
|
44
|
+
table.string('type').notNullable().defaultTo('component');
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
exports.down = function down(knex) {
|
|
49
|
+
return knex.schema
|
|
50
|
+
.dropTableIfExists('task_locations')
|
|
51
|
+
.dropTableIfExists('scaffolder_tasks')
|
|
52
|
+
.dropTableIfExists('repositories');
|
|
53
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@red-hat-developer-hub/backstage-plugin-bulk-import-backend",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.4.0",
|
|
4
4
|
"main": "./dist/index.cjs.js",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -53,20 +53,24 @@
|
|
|
53
53
|
"dependencies": {
|
|
54
54
|
"@backstage/backend-defaults": "^0.12.0",
|
|
55
55
|
"@backstage/backend-plugin-api": "^1.4.2",
|
|
56
|
+
"@backstage/catalog-model": "^1.7.5",
|
|
57
|
+
"@backstage/config": "^1.3.3",
|
|
56
58
|
"@backstage/errors": "^1.2.7",
|
|
57
59
|
"@backstage/integration": "^1.17.1",
|
|
58
60
|
"@backstage/plugin-catalog-node": "^1.18.0",
|
|
59
61
|
"@backstage/plugin-permission-common": "^0.9.1",
|
|
60
62
|
"@backstage/plugin-permission-node": "^0.10.3",
|
|
61
63
|
"@gitbeaker/rest": "^43.4.0",
|
|
64
|
+
"@microsoft/fetch-event-source": "^2.0.1",
|
|
62
65
|
"@octokit/auth-app": "^6.0.3",
|
|
63
66
|
"@octokit/rest": "^20.0.2",
|
|
64
|
-
"@red-hat-developer-hub/backstage-plugin-bulk-import-common": "^1.
|
|
67
|
+
"@red-hat-developer-hub/backstage-plugin-bulk-import-common": "^1.10.0",
|
|
65
68
|
"ajv-formats": "^3.0.1",
|
|
66
69
|
"express": "^4.17.1",
|
|
67
70
|
"git-url-parse": "^14.0.0",
|
|
68
71
|
"js-yaml": "^4.1.0",
|
|
69
72
|
"just-kebab-case": "4.2.0",
|
|
73
|
+
"knex": "^3.0.0",
|
|
70
74
|
"luxon": "^3.4.4",
|
|
71
75
|
"node-fetch": "^2.6.7",
|
|
72
76
|
"openapi-backend": "^5.10.6"
|
|
@@ -74,7 +78,6 @@
|
|
|
74
78
|
"devDependencies": {
|
|
75
79
|
"@backstage/backend-test-utils": "^1.8.0",
|
|
76
80
|
"@backstage/catalog-client": "^1.11.0",
|
|
77
|
-
"@backstage/catalog-model": "^1.7.5",
|
|
78
81
|
"@backstage/cli": "^0.34.1",
|
|
79
82
|
"@backstage/config": "^1.3.3",
|
|
80
83
|
"@backstage/plugin-catalog-backend": "^3.0.1",
|
|
@@ -83,6 +86,7 @@
|
|
|
83
86
|
"@spotify/prettier-config": "^15.0.0",
|
|
84
87
|
"@types/express": "4.17.23",
|
|
85
88
|
"@types/git-url-parse": "^9.0.0",
|
|
89
|
+
"@types/knex": "^0.16.1",
|
|
86
90
|
"@types/node-fetch": "^2.5.12",
|
|
87
91
|
"@types/supertest": "2.0.16",
|
|
88
92
|
"js-yaml-cli": "0.6.0",
|
|
@@ -96,6 +100,7 @@
|
|
|
96
100
|
},
|
|
97
101
|
"files": [
|
|
98
102
|
"dist",
|
|
103
|
+
"migrations",
|
|
99
104
|
"config.d.ts",
|
|
100
105
|
"dist-dynamic/*.*",
|
|
101
106
|
"dist-dynamic/dist/**",
|