@red-hat-developer-hub/backstage-plugin-orchestrator-backend 5.0.1 → 5.1.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 CHANGED
@@ -1,5 +1,18 @@
1
1
  ### Dependencies
2
2
 
3
+ ## 5.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 5ab913b: Access can now be managed on a per-workflow basis.
8
+
9
+ ### Patch Changes
10
+
11
+ - 5b90f96: resolve dependency issues
12
+ - Updated dependencies [5b90f96]
13
+ - Updated dependencies [5ab913b]
14
+ - @red-hat-developer-hub/backstage-plugin-orchestrator-common@1.25.0
15
+
3
16
  ## 5.0.1
4
17
 
5
18
  ### Patch Changes
@@ -7,6 +7,9 @@ class OrchestratorService {
7
7
  this.workflowCacheService = workflowCacheService;
8
8
  }
9
9
  // Data Index Service Wrapper
10
+ getWorkflowIds() {
11
+ return this.workflowCacheService.definitionIds;
12
+ }
10
13
  async abortWorkflowInstance(args) {
11
14
  const { instanceId, cacheHandler } = args;
12
15
  const definitionId = await this.dataIndexService.fetchDefinitionIdByInstanceId(instanceId);
@@ -25,15 +28,15 @@ class OrchestratorService {
25
28
  return isWorkflowAvailable ? await this.dataIndexService.fetchWorkflowInfo(definitionId) : void 0;
26
29
  }
27
30
  async fetchInstances(args) {
28
- const definitionIds = args.workflowId ? [args.workflowId] : this.workflowCacheService.definitionIds;
31
+ const definitionIds = args.workflowIds ? args.workflowIds : this.workflowCacheService.definitionIds;
29
32
  return await this.dataIndexService.fetchInstances({
30
33
  definitionIds,
31
34
  pagination: args.pagination,
32
35
  filter: args.filter
33
36
  });
34
37
  }
35
- async fetchInstancesTotalCount(workflowId, filter) {
36
- const definitionIds = workflowId ? [workflowId] : this.workflowCacheService.definitionIds;
38
+ async fetchInstancesTotalCount(workflowIds, filter) {
39
+ const definitionIds = workflowIds ? workflowIds : this.workflowCacheService.definitionIds;
37
40
  return await this.dataIndexService.fetchInstancesTotalCount(
38
41
  definitionIds,
39
42
  filter
@@ -1 +1 @@
1
- {"version":3,"file":"OrchestratorService.cjs.js","sources":["../../src/service/OrchestratorService.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\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 */\nimport {\n Filter,\n ProcessInstance,\n ProcessInstanceVariables,\n WorkflowDefinition,\n WorkflowExecutionResponse,\n WorkflowInfo,\n WorkflowOverview,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { Pagination } from '../types/pagination';\nimport { DataIndexService } from './DataIndexService';\nimport { SonataFlowService } from './SonataFlowService';\nimport { CacheHandler, WorkflowCacheService } from './WorkflowCacheService';\n\nexport class OrchestratorService {\n constructor(\n private readonly sonataFlowService: SonataFlowService,\n private readonly dataIndexService: DataIndexService,\n private readonly workflowCacheService: WorkflowCacheService,\n ) {}\n\n // Data Index Service Wrapper\n\n public async abortWorkflowInstance(args: {\n instanceId: string;\n cacheHandler?: CacheHandler;\n }): Promise<void> {\n const { instanceId, cacheHandler } = args;\n const definitionId =\n await this.dataIndexService.fetchDefinitionIdByInstanceId(instanceId);\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.dataIndexService.abortWorkflowInstance(instanceId)\n : undefined;\n }\n\n public async fetchWorkflowInfo(args: {\n definitionId: string;\n cacheHandler?: CacheHandler;\n }): Promise<WorkflowInfo | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.dataIndexService.fetchWorkflowInfo(definitionId)\n : undefined;\n }\n\n public async fetchInstances(args: {\n pagination?: Pagination;\n filter?: Filter;\n workflowId?: string;\n }): Promise<ProcessInstance[]> {\n const definitionIds = args.workflowId\n ? [args.workflowId]\n : this.workflowCacheService.definitionIds;\n return await this.dataIndexService.fetchInstances({\n definitionIds: definitionIds,\n pagination: args.pagination,\n filter: args.filter,\n });\n }\n\n public async fetchInstancesTotalCount(\n workflowId?: string,\n filter?: Filter,\n ): Promise<number> {\n const definitionIds = workflowId\n ? [workflowId]\n : this.workflowCacheService.definitionIds;\n return await this.dataIndexService.fetchInstancesTotalCount(\n definitionIds,\n filter,\n );\n }\n\n public async fetchWorkflowSource(args: {\n definitionId: string;\n cacheHandler?: CacheHandler;\n }): Promise<string | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.dataIndexService.fetchWorkflowSource(definitionId)\n : undefined;\n }\n\n public async fetchInstanceVariables(args: {\n instanceId: string;\n cacheHandler?: CacheHandler;\n }): Promise<object | undefined> {\n const { instanceId, cacheHandler } = args;\n const definitionId =\n await this.dataIndexService.fetchDefinitionIdByInstanceId(instanceId);\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.dataIndexService.fetchInstanceVariables(instanceId)\n : undefined;\n }\n\n public async fetchInstance(args: {\n instanceId: string;\n cacheHandler?: CacheHandler;\n }): Promise<ProcessInstance | undefined> {\n const { instanceId, cacheHandler } = args;\n const instance = await this.dataIndexService.fetchInstance(instanceId);\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n instance?.processId,\n cacheHandler,\n );\n return isWorkflowAvailable ? instance : undefined;\n }\n\n // SonataFlow Service Wrapper\n\n public async fetchWorkflowInfoOnService(args: {\n definitionId: string;\n serviceUrl: string;\n cacheHandler?: CacheHandler;\n }): Promise<WorkflowInfo | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.sonataFlowService.fetchWorkflowInfoOnService(args)\n : undefined;\n }\n\n public async fetchWorkflowDefinition(args: {\n definitionId: string;\n cacheHandler?: CacheHandler;\n }): Promise<WorkflowDefinition | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.sonataFlowService.fetchWorkflowDefinition(definitionId)\n : undefined;\n }\n\n public async fetchWorkflowOverviews(args: {\n pagination?: Pagination;\n filter?: Filter;\n }): Promise<WorkflowOverview[] | undefined> {\n return await this.sonataFlowService.fetchWorkflowOverviews({\n definitionIds: this.workflowCacheService.definitionIds,\n pagination: args.pagination,\n filter: args.filter,\n });\n }\n\n public async executeWorkflow(args: {\n definitionId: string;\n serviceUrl: string;\n inputData?: ProcessInstanceVariables;\n businessKey?: string;\n cacheHandler?: CacheHandler;\n }): Promise<WorkflowExecutionResponse | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.sonataFlowService.executeWorkflow(args)\n : undefined;\n }\n\n public async retriggerWorkflow(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n cacheHandler?: CacheHandler;\n }): Promise<boolean | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.sonataFlowService.retriggerInstance(args)\n : undefined;\n }\n\n public async fetchWorkflowOverview(args: {\n definitionId: string;\n cacheHandler?: CacheHandler;\n }): Promise<WorkflowOverview | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.sonataFlowService.fetchWorkflowOverview(definitionId)\n : undefined;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"OrchestratorService.cjs.js","sources":["../../src/service/OrchestratorService.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\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 */\nimport {\n Filter,\n ProcessInstance,\n ProcessInstanceVariables,\n WorkflowDefinition,\n WorkflowExecutionResponse,\n WorkflowInfo,\n WorkflowOverview,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { Pagination } from '../types/pagination';\nimport { DataIndexService } from './DataIndexService';\nimport { SonataFlowService } from './SonataFlowService';\nimport { CacheHandler, WorkflowCacheService } from './WorkflowCacheService';\n\nexport class OrchestratorService {\n constructor(\n private readonly sonataFlowService: SonataFlowService,\n private readonly dataIndexService: DataIndexService,\n private readonly workflowCacheService: WorkflowCacheService,\n ) {}\n\n // Data Index Service Wrapper\n public getWorkflowIds(): string[] {\n return this.workflowCacheService.definitionIds;\n }\n\n public async abortWorkflowInstance(args: {\n instanceId: string;\n cacheHandler?: CacheHandler;\n }): Promise<void> {\n const { instanceId, cacheHandler } = args;\n const definitionId =\n await this.dataIndexService.fetchDefinitionIdByInstanceId(instanceId);\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.dataIndexService.abortWorkflowInstance(instanceId)\n : undefined;\n }\n\n public async fetchWorkflowInfo(args: {\n definitionId: string;\n cacheHandler?: CacheHandler;\n }): Promise<WorkflowInfo | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.dataIndexService.fetchWorkflowInfo(definitionId)\n : undefined;\n }\n\n public async fetchInstances(args: {\n pagination?: Pagination;\n filter?: Filter;\n workflowIds?: string[];\n }): Promise<ProcessInstance[]> {\n const definitionIds = args.workflowIds\n ? args.workflowIds\n : this.workflowCacheService.definitionIds;\n return await this.dataIndexService.fetchInstances({\n definitionIds: definitionIds,\n pagination: args.pagination,\n filter: args.filter,\n });\n }\n\n public async fetchInstancesTotalCount(\n workflowIds?: string[],\n filter?: Filter,\n ): Promise<number> {\n const definitionIds = workflowIds\n ? workflowIds\n : this.workflowCacheService.definitionIds;\n return await this.dataIndexService.fetchInstancesTotalCount(\n definitionIds,\n filter,\n );\n }\n\n public async fetchWorkflowSource(args: {\n definitionId: string;\n cacheHandler?: CacheHandler;\n }): Promise<string | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.dataIndexService.fetchWorkflowSource(definitionId)\n : undefined;\n }\n\n public async fetchInstanceVariables(args: {\n instanceId: string;\n cacheHandler?: CacheHandler;\n }): Promise<object | undefined> {\n const { instanceId, cacheHandler } = args;\n const definitionId =\n await this.dataIndexService.fetchDefinitionIdByInstanceId(instanceId);\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.dataIndexService.fetchInstanceVariables(instanceId)\n : undefined;\n }\n\n public async fetchInstance(args: {\n instanceId: string;\n cacheHandler?: CacheHandler;\n }): Promise<ProcessInstance | undefined> {\n const { instanceId, cacheHandler } = args;\n const instance = await this.dataIndexService.fetchInstance(instanceId);\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n instance?.processId,\n cacheHandler,\n );\n return isWorkflowAvailable ? instance : undefined;\n }\n\n // SonataFlow Service Wrapper\n\n public async fetchWorkflowInfoOnService(args: {\n definitionId: string;\n serviceUrl: string;\n cacheHandler?: CacheHandler;\n }): Promise<WorkflowInfo | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.sonataFlowService.fetchWorkflowInfoOnService(args)\n : undefined;\n }\n\n public async fetchWorkflowDefinition(args: {\n definitionId: string;\n cacheHandler?: CacheHandler;\n }): Promise<WorkflowDefinition | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.sonataFlowService.fetchWorkflowDefinition(definitionId)\n : undefined;\n }\n\n public async fetchWorkflowOverviews(args: {\n pagination?: Pagination;\n filter?: Filter;\n }): Promise<WorkflowOverview[] | undefined> {\n return await this.sonataFlowService.fetchWorkflowOverviews({\n definitionIds: this.workflowCacheService.definitionIds,\n pagination: args.pagination,\n filter: args.filter,\n });\n }\n\n public async executeWorkflow(args: {\n definitionId: string;\n serviceUrl: string;\n inputData?: ProcessInstanceVariables;\n businessKey?: string;\n cacheHandler?: CacheHandler;\n }): Promise<WorkflowExecutionResponse | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.sonataFlowService.executeWorkflow(args)\n : undefined;\n }\n\n public async retriggerWorkflow(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n cacheHandler?: CacheHandler;\n }): Promise<boolean | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.sonataFlowService.retriggerInstance(args)\n : undefined;\n }\n\n public async fetchWorkflowOverview(args: {\n definitionId: string;\n cacheHandler?: CacheHandler;\n }): Promise<WorkflowOverview | undefined> {\n const { definitionId, cacheHandler } = args;\n const isWorkflowAvailable = this.workflowCacheService.isAvailable(\n definitionId,\n cacheHandler,\n );\n return isWorkflowAvailable\n ? await this.sonataFlowService.fetchWorkflowOverview(definitionId)\n : undefined;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -129,16 +129,6 @@ class SonataFlowService {
129
129
  const response = await fetch(urlToFetch);
130
130
  return response.ok;
131
131
  }
132
- async updateInstanceInputData(args) {
133
- const { definitionId, serviceUrl, instanceId, inputData } = args;
134
- const urlToFetch = `${serviceUrl}/${definitionId}/${instanceId}`;
135
- const response = await fetch(urlToFetch, {
136
- method: "PATCH",
137
- body: JSON.stringify(inputData),
138
- headers: { "content-type": "application/json" }
139
- });
140
- return response.ok;
141
- }
142
132
  async createPrefixFetchErrorMessage(urlToFetch, response, httpMethod = "GET") {
143
133
  const res = await response.json();
144
134
  const errorInfo = [];
@@ -1 +1 @@
1
- {"version":3,"file":"SonataFlowService.cjs.js","sources":["../../src/service/SonataFlowService.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\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 */\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nimport {\n extractWorkflowFormat,\n Filter,\n fromWorkflowSource,\n getWorkflowCategory,\n ProcessInstanceStateValues,\n ProcessInstanceVariables,\n WorkflowDefinition,\n WorkflowExecutionResponse,\n WorkflowInfo,\n WorkflowOverview,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { Pagination } from '../types/pagination';\nimport { DataIndexService } from './DataIndexService';\n\nexport class SonataFlowService {\n constructor(\n private readonly dataIndexService: DataIndexService,\n private readonly logger: LoggerService,\n ) {}\n\n public async fetchWorkflowInfoOnService(args: {\n definitionId: string;\n serviceUrl: string;\n }): Promise<WorkflowInfo | undefined> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}`;\n const response = await fetch(urlToFetch);\n\n if (response.ok) {\n const json = await response.json();\n this.logger.debug(`Fetch workflow info result: ${JSON.stringify(json)}`);\n return json;\n }\n throw new Error(\n await this.createPrefixFetchErrorMessage(urlToFetch, response),\n );\n }\n\n public async fetchWorkflowDefinition(\n definitionId: string,\n ): Promise<WorkflowDefinition | undefined> {\n const source =\n await this.dataIndexService.fetchWorkflowSource(definitionId);\n if (source) {\n return fromWorkflowSource(source);\n }\n return undefined;\n }\n\n public async fetchWorkflowOverviews(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n }): Promise<WorkflowOverview[] | undefined> {\n const { definitionIds, pagination, filter } = args;\n const workflowInfos = await this.dataIndexService.fetchWorkflowInfos({\n definitionIds,\n pagination,\n filter,\n });\n if (!workflowInfos?.length) {\n return [];\n }\n const items = await Promise.all(\n workflowInfos\n .filter(info => info.source)\n .map(info => this.fetchWorkflowOverviewBySource(info.source!)),\n );\n return items.filter((item): item is WorkflowOverview => !!item);\n }\n\n public async executeWorkflow(args: {\n definitionId: string;\n serviceUrl: string;\n inputData?: ProcessInstanceVariables;\n businessKey?: string;\n }): Promise<WorkflowExecutionResponse | undefined> {\n const urlToFetch = args.businessKey\n ? `${args.serviceUrl}/${args.definitionId}?businessKey=${args.businessKey}`\n : `${args.serviceUrl}/${args.definitionId}`;\n\n const response = await fetch(urlToFetch, {\n method: 'POST',\n body: JSON.stringify(args.inputData || {}),\n headers: { 'content-type': 'application/json' },\n });\n\n const json = await response.json();\n if (json.id) {\n this.logger.debug(\n `Execute workflow successful. Response: ${JSON.stringify(json)}`,\n );\n return json;\n } else if (!response.ok) {\n const errorMessage = await this.createPrefixFetchErrorMessage(\n urlToFetch,\n response,\n 'POST',\n );\n this.logger.error(\n `Execute workflow failed. Response: ${JSON.stringify(json)}`,\n );\n throw new Error(errorMessage);\n } else {\n this.logger.error(\n `Execute workflow did not return a workflow instance ID. Response: ${JSON.stringify(\n json,\n )}`,\n );\n throw new Error('Execute workflow did not return a workflow instance ID');\n }\n }\n\n public async retriggerInstance(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n }): Promise<boolean> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}/instances/${args.instanceId}/retrigger`;\n\n const response = await fetch(urlToFetch, {\n method: 'POST',\n });\n\n if (!response.ok) {\n throw new Error(\n `${await this.createPrefixFetchErrorMessage(\n urlToFetch,\n response,\n 'POST',\n )}`,\n );\n }\n\n return true;\n }\n\n public async fetchWorkflowOverview(\n definitionId: string,\n ): Promise<WorkflowOverview | undefined> {\n const source =\n await this.dataIndexService.fetchWorkflowSource(definitionId);\n if (!source) {\n this.logger.debug(`Workflow source not found: ${definitionId}`);\n return undefined;\n }\n return await this.fetchWorkflowOverviewBySource(source);\n }\n\n private async fetchWorkflowOverviewBySource(\n source: string,\n ): Promise<WorkflowOverview | undefined> {\n let lastTriggered: Date = new Date(0);\n let lastRunStatus: ProcessInstanceStateValues | undefined;\n let lastRunId: string | undefined;\n const definition = fromWorkflowSource(source);\n\n const processInstances =\n await this.dataIndexService.fetchInstancesByDefinitionId({\n definitionId: definition.id,\n limit: 1,\n offset: 0,\n });\n\n const pInstance = processInstances[0];\n\n if (pInstance?.start) {\n lastRunId = pInstance.id;\n lastTriggered = new Date(pInstance.start);\n lastRunStatus = pInstance.state;\n }\n\n return {\n workflowId: definition.id,\n name: definition.name,\n format: extractWorkflowFormat(source),\n lastRunId,\n lastTriggeredMs: lastTriggered.getTime(),\n lastRunStatus,\n category: getWorkflowCategory(definition),\n description: definition.description,\n };\n }\n\n public async pingWorkflowService(args: {\n definitionId: string;\n serviceUrl: string;\n }): Promise<boolean> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}`;\n const response = await fetch(urlToFetch);\n return response.ok;\n }\n\n public async updateInstanceInputData(args: {\n definitionId: string;\n serviceUrl: string;\n instanceId: string;\n inputData: ProcessInstanceVariables;\n }): Promise<boolean> {\n const { definitionId, serviceUrl, instanceId, inputData } = args;\n const urlToFetch = `${serviceUrl}/${definitionId}/${instanceId}`;\n const response = await fetch(urlToFetch, {\n method: 'PATCH',\n body: JSON.stringify(inputData),\n headers: { 'content-type': 'application/json' },\n });\n return response.ok;\n }\n\n public async createPrefixFetchErrorMessage(\n urlToFetch: string,\n response: Response,\n httpMethod = 'GET',\n ): Promise<string> {\n const res = await response.json();\n const errorInfo = [];\n let errorMsg = `Request ${httpMethod} ${urlToFetch} failed with: StatusCode: ${response.status}`;\n\n if (response.statusText) {\n errorInfo.push(`StatusText: ${response.statusText}`);\n }\n if (res?.details) {\n errorInfo.push(`Details: ${res?.details}`);\n }\n if (res?.stack) {\n errorInfo.push(`Stack: ${res?.stack}`);\n }\n if (errorInfo.length > 0) {\n errorMsg += ` ${errorInfo.join(', ')}`;\n } else {\n errorMsg += ' Unexpected error';\n }\n\n return errorMsg;\n }\n}\n"],"names":["fromWorkflowSource","extractWorkflowFormat","getWorkflowCategory"],"mappings":"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"}
1
+ {"version":3,"file":"SonataFlowService.cjs.js","sources":["../../src/service/SonataFlowService.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\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 */\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nimport {\n extractWorkflowFormat,\n Filter,\n fromWorkflowSource,\n getWorkflowCategory,\n ProcessInstanceStateValues,\n ProcessInstanceVariables,\n WorkflowDefinition,\n WorkflowExecutionResponse,\n WorkflowInfo,\n WorkflowOverview,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { Pagination } from '../types/pagination';\nimport { DataIndexService } from './DataIndexService';\n\nexport class SonataFlowService {\n constructor(\n private readonly dataIndexService: DataIndexService,\n private readonly logger: LoggerService,\n ) {}\n\n public async fetchWorkflowInfoOnService(args: {\n definitionId: string;\n serviceUrl: string;\n }): Promise<WorkflowInfo | undefined> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}`;\n const response = await fetch(urlToFetch);\n\n if (response.ok) {\n const json = await response.json();\n this.logger.debug(`Fetch workflow info result: ${JSON.stringify(json)}`);\n return json;\n }\n throw new Error(\n await this.createPrefixFetchErrorMessage(urlToFetch, response),\n );\n }\n\n public async fetchWorkflowDefinition(\n definitionId: string,\n ): Promise<WorkflowDefinition | undefined> {\n const source =\n await this.dataIndexService.fetchWorkflowSource(definitionId);\n if (source) {\n return fromWorkflowSource(source);\n }\n return undefined;\n }\n\n public async fetchWorkflowOverviews(args: {\n definitionIds?: string[];\n pagination?: Pagination;\n filter?: Filter;\n }): Promise<WorkflowOverview[] | undefined> {\n const { definitionIds, pagination, filter } = args;\n const workflowInfos = await this.dataIndexService.fetchWorkflowInfos({\n definitionIds,\n pagination,\n filter,\n });\n if (!workflowInfos?.length) {\n return [];\n }\n const items = await Promise.all(\n workflowInfos\n .filter(info => info.source)\n .map(info => this.fetchWorkflowOverviewBySource(info.source!)),\n );\n return items.filter((item): item is WorkflowOverview => !!item);\n }\n\n public async executeWorkflow(args: {\n definitionId: string;\n serviceUrl: string;\n inputData?: ProcessInstanceVariables;\n businessKey?: string;\n }): Promise<WorkflowExecutionResponse | undefined> {\n const urlToFetch = args.businessKey\n ? `${args.serviceUrl}/${args.definitionId}?businessKey=${args.businessKey}`\n : `${args.serviceUrl}/${args.definitionId}`;\n\n const response = await fetch(urlToFetch, {\n method: 'POST',\n body: JSON.stringify(args.inputData || {}),\n headers: { 'content-type': 'application/json' },\n });\n\n const json = await response.json();\n if (json.id) {\n this.logger.debug(\n `Execute workflow successful. Response: ${JSON.stringify(json)}`,\n );\n return json;\n } else if (!response.ok) {\n const errorMessage = await this.createPrefixFetchErrorMessage(\n urlToFetch,\n response,\n 'POST',\n );\n this.logger.error(\n `Execute workflow failed. Response: ${JSON.stringify(json)}`,\n );\n throw new Error(errorMessage);\n } else {\n this.logger.error(\n `Execute workflow did not return a workflow instance ID. Response: ${JSON.stringify(\n json,\n )}`,\n );\n throw new Error('Execute workflow did not return a workflow instance ID');\n }\n }\n\n public async retriggerInstance(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n }): Promise<boolean> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}/instances/${args.instanceId}/retrigger`;\n\n const response = await fetch(urlToFetch, {\n method: 'POST',\n });\n\n if (!response.ok) {\n throw new Error(\n `${await this.createPrefixFetchErrorMessage(\n urlToFetch,\n response,\n 'POST',\n )}`,\n );\n }\n\n return true;\n }\n\n public async fetchWorkflowOverview(\n definitionId: string,\n ): Promise<WorkflowOverview | undefined> {\n const source =\n await this.dataIndexService.fetchWorkflowSource(definitionId);\n if (!source) {\n this.logger.debug(`Workflow source not found: ${definitionId}`);\n return undefined;\n }\n return await this.fetchWorkflowOverviewBySource(source);\n }\n\n private async fetchWorkflowOverviewBySource(\n source: string,\n ): Promise<WorkflowOverview | undefined> {\n let lastTriggered: Date = new Date(0);\n let lastRunStatus: ProcessInstanceStateValues | undefined;\n let lastRunId: string | undefined;\n const definition = fromWorkflowSource(source);\n\n const processInstances =\n await this.dataIndexService.fetchInstancesByDefinitionId({\n definitionId: definition.id,\n limit: 1,\n offset: 0,\n });\n\n const pInstance = processInstances[0];\n\n if (pInstance?.start) {\n lastRunId = pInstance.id;\n lastTriggered = new Date(pInstance.start);\n lastRunStatus = pInstance.state;\n }\n\n return {\n workflowId: definition.id,\n name: definition.name,\n format: extractWorkflowFormat(source),\n lastRunId,\n lastTriggeredMs: lastTriggered.getTime(),\n lastRunStatus,\n category: getWorkflowCategory(definition),\n description: definition.description,\n };\n }\n\n public async pingWorkflowService(args: {\n definitionId: string;\n serviceUrl: string;\n }): Promise<boolean> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}`;\n const response = await fetch(urlToFetch);\n return response.ok;\n }\n\n public async createPrefixFetchErrorMessage(\n urlToFetch: string,\n response: Response,\n httpMethod = 'GET',\n ): Promise<string> {\n const res = await response.json();\n const errorInfo = [];\n let errorMsg = `Request ${httpMethod} ${urlToFetch} failed with: StatusCode: ${response.status}`;\n\n if (response.statusText) {\n errorInfo.push(`StatusText: ${response.statusText}`);\n }\n if (res?.details) {\n errorInfo.push(`Details: ${res?.details}`);\n }\n if (res?.stack) {\n errorInfo.push(`Stack: ${res?.stack}`);\n }\n if (errorInfo.length > 0) {\n errorMsg += ` ${errorInfo.join(', ')}`;\n } else {\n errorMsg += ' Unexpected error';\n }\n\n return errorMsg;\n }\n}\n"],"names":["fromWorkflowSource","extractWorkflowFormat","getWorkflowCategory"],"mappings":"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"}
@@ -28,6 +28,9 @@ class V2 {
28
28
  };
29
29
  return result;
30
30
  }
31
+ getWorkflowIds() {
32
+ return this.orchestratorService.getWorkflowIds();
33
+ }
31
34
  async getWorkflowOverviewById(workflowId) {
32
35
  const overview = await this.orchestratorService.fetchWorkflowOverview({
33
36
  definitionId: workflowId,
@@ -52,14 +55,14 @@ class V2 {
52
55
  }
53
56
  return source;
54
57
  }
55
- async getInstances(pagination, filter, workflowId) {
58
+ async getInstances(pagination, filter, workflowIds) {
56
59
  const instances = await this.orchestratorService.fetchInstances({
57
60
  pagination,
58
61
  filter,
59
- workflowId
62
+ workflowIds
60
63
  });
61
64
  const totalCount = await this.orchestratorService.fetchInstancesTotalCount(
62
- workflowId,
65
+ workflowIds,
63
66
  filter
64
67
  );
65
68
  const result = {
@@ -1 +1 @@
1
- {"version":3,"file":"v2.cjs.js","sources":["../../../src/service/api/v2.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\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 */\nimport { ParsedRequest } from 'openapi-backend';\n\nimport {\n AssessedProcessInstanceDTO,\n ExecuteWorkflowRequestDTO,\n ExecuteWorkflowResponseDTO,\n Filter,\n ProcessInstance,\n ProcessInstanceListResultDTO,\n ProcessInstanceState,\n ProcessInstanceVariables,\n WorkflowDTO,\n WorkflowInfo,\n WorkflowOverviewDTO,\n WorkflowOverviewListResultDTO,\n WorkflowRunStatusDTO,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { Pagination } from '../../types/pagination';\nimport { retryAsyncFunction } from '../Helper';\nimport { OrchestratorService } from '../OrchestratorService';\nimport {\n mapToExecuteWorkflowResponseDTO,\n mapToProcessInstanceDTO,\n mapToWorkflowDTO,\n mapToWorkflowOverviewDTO,\n mapToWorkflowRunStatusDTO,\n} from './mapping/V2Mappings';\n\nconst FETCH_INSTANCE_MAX_ATTEMPTS = 10;\nconst FETCH_INSTANCE_RETRY_DELAY_MS = 1000;\n\nexport class V2 {\n constructor(private readonly orchestratorService: OrchestratorService) {}\n\n public async getWorkflowsOverview(\n pagination: Pagination,\n filter?: Filter,\n ): Promise<WorkflowOverviewListResultDTO> {\n const overviews = await this.orchestratorService.fetchWorkflowOverviews({\n pagination,\n filter,\n });\n if (!overviews) {\n throw new Error(\"Couldn't fetch workflow overviews\");\n }\n const result: WorkflowOverviewListResultDTO = {\n overviews: overviews.map(item => mapToWorkflowOverviewDTO(item)),\n paginationInfo: {\n pageSize: pagination.limit,\n offset: pagination.offset,\n totalCount: overviews.length,\n },\n };\n return result;\n }\n\n public async getWorkflowOverviewById(\n workflowId: string,\n ): Promise<WorkflowOverviewDTO> {\n const overview = await this.orchestratorService.fetchWorkflowOverview({\n definitionId: workflowId,\n cacheHandler: 'throw',\n });\n\n if (!overview) {\n throw new Error(`Couldn't fetch workflow overview for ${workflowId}`);\n }\n return mapToWorkflowOverviewDTO(overview);\n }\n\n public async getWorkflowById(workflowId: string): Promise<WorkflowDTO> {\n const resultV1 = await this.getWorkflowSourceById(workflowId);\n return mapToWorkflowDTO(resultV1);\n }\n\n public async getWorkflowSourceById(workflowId: string): Promise<string> {\n const source = await this.orchestratorService.fetchWorkflowSource({\n definitionId: workflowId,\n cacheHandler: 'throw',\n });\n\n if (!source) {\n throw new Error(`Couldn't fetch workflow source for ${workflowId}`);\n }\n\n return source;\n }\n\n public async getInstances(\n pagination?: Pagination,\n filter?: Filter,\n workflowId?: string,\n ): Promise<ProcessInstanceListResultDTO> {\n const instances = await this.orchestratorService.fetchInstances({\n pagination,\n filter,\n workflowId,\n });\n const totalCount = await this.orchestratorService.fetchInstancesTotalCount(\n workflowId,\n filter,\n );\n\n const result: ProcessInstanceListResultDTO = {\n items: instances?.map(mapToProcessInstanceDTO),\n paginationInfo: {\n pageSize: pagination?.limit,\n offset: pagination?.offset,\n totalCount: totalCount,\n },\n };\n return result;\n }\n\n public async getInstanceById(\n instanceId: string,\n includeAssessment: boolean = false,\n ): Promise<AssessedProcessInstanceDTO> {\n const instance = await this.orchestratorService.fetchInstance({\n instanceId,\n cacheHandler: 'throw',\n });\n\n if (!instance) {\n throw new Error(`Couldn't fetch process instance ${instanceId}`);\n }\n\n let assessedByInstance: ProcessInstance | undefined;\n\n if (includeAssessment && instance.businessKey) {\n assessedByInstance = await this.orchestratorService.fetchInstance({\n instanceId: instance.businessKey,\n cacheHandler: 'throw',\n });\n }\n\n return {\n instance: mapToProcessInstanceDTO(instance),\n assessedBy: assessedByInstance\n ? mapToProcessInstanceDTO(assessedByInstance)\n : undefined,\n };\n }\n\n public async executeWorkflow(\n executeWorkflowRequestDTO: ExecuteWorkflowRequestDTO,\n workflowId: string,\n businessKey: string | undefined,\n ): Promise<ExecuteWorkflowResponseDTO> {\n const definition = await this.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n cacheHandler: 'throw',\n });\n if (!definition) {\n throw new Error(`Couldn't fetch workflow definition for ${workflowId}`);\n }\n if (!definition.serviceUrl) {\n throw new Error(`ServiceURL is not defined for workflow ${workflowId}`);\n }\n const executionResponse = await this.orchestratorService.executeWorkflow({\n definitionId: workflowId,\n inputData:\n executeWorkflowRequestDTO.inputData as ProcessInstanceVariables,\n serviceUrl: definition.serviceUrl,\n businessKey,\n cacheHandler: 'throw',\n });\n\n if (!executionResponse) {\n throw new Error(`Couldn't execute workflow ${workflowId}`);\n }\n\n // Making sure the instance data is available before returning\n await retryAsyncFunction({\n asyncFn: () =>\n this.orchestratorService.fetchInstance({\n instanceId: executionResponse.id,\n cacheHandler: 'throw',\n }),\n maxAttempts: FETCH_INSTANCE_MAX_ATTEMPTS,\n delayMs: FETCH_INSTANCE_RETRY_DELAY_MS,\n });\n\n if (!executionResponse) {\n throw new Error('Error executing workflow with id ${workflowId}');\n }\n\n return mapToExecuteWorkflowResponseDTO(workflowId, executionResponse);\n }\n\n public async retriggerInstance(\n workflowId: string,\n instanceId: string,\n ): Promise<void> {\n const definition = await this.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n cacheHandler: 'throw',\n });\n if (!definition) {\n throw new Error(`Couldn't fetch workflow definition for ${workflowId}`);\n }\n if (!definition.serviceUrl) {\n throw new Error(`ServiceURL is not defined for workflow ${workflowId}`);\n }\n const response = await this.orchestratorService.retriggerWorkflow({\n definitionId: workflowId,\n instanceId: instanceId,\n serviceUrl: definition.serviceUrl,\n cacheHandler: 'throw',\n });\n\n if (!response) {\n throw new Error(\n `Couldn't retrigger instance ${instanceId} of workflow ${workflowId}`,\n );\n }\n }\n\n public async abortWorkflow(instanceId: string): Promise<string> {\n await this.orchestratorService.abortWorkflowInstance({\n instanceId,\n cacheHandler: 'throw',\n });\n return `Workflow instance ${instanceId} successfully aborted`;\n }\n\n public async getWorkflowStatuses(): Promise<WorkflowRunStatusDTO[]> {\n return [\n ProcessInstanceState.Active,\n ProcessInstanceState.Error,\n ProcessInstanceState.Completed,\n ProcessInstanceState.Aborted,\n ProcessInstanceState.Suspended,\n ProcessInstanceState.Pending,\n ].map(status => mapToWorkflowRunStatusDTO(status));\n }\n\n public async getWorkflowInputSchemaById(\n workflowId: string,\n serviceUrl: string,\n ): Promise<WorkflowInfo | undefined> {\n return this.orchestratorService.fetchWorkflowInfoOnService({\n definitionId: workflowId,\n serviceUrl: serviceUrl,\n cacheHandler: 'throw',\n });\n }\n\n public extractQueryParam(\n req: ParsedRequest,\n key: string,\n ): string | undefined {\n return req.query[key] as string | undefined;\n }\n}\n"],"names":["mapToWorkflowOverviewDTO","mapToWorkflowDTO","mapToProcessInstanceDTO","retryAsyncFunction","mapToExecuteWorkflowResponseDTO","ProcessInstanceState","mapToWorkflowRunStatusDTO"],"mappings":"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"}
1
+ {"version":3,"file":"v2.cjs.js","sources":["../../../src/service/api/v2.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\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 */\nimport { ParsedRequest } from 'openapi-backend';\n\nimport {\n AssessedProcessInstanceDTO,\n ExecuteWorkflowRequestDTO,\n ExecuteWorkflowResponseDTO,\n Filter,\n ProcessInstance,\n ProcessInstanceListResultDTO,\n ProcessInstanceState,\n ProcessInstanceVariables,\n WorkflowDTO,\n WorkflowInfo,\n WorkflowOverviewDTO,\n WorkflowOverviewListResultDTO,\n WorkflowRunStatusDTO,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport { Pagination } from '../../types/pagination';\nimport { retryAsyncFunction } from '../Helper';\nimport { OrchestratorService } from '../OrchestratorService';\nimport {\n mapToExecuteWorkflowResponseDTO,\n mapToProcessInstanceDTO,\n mapToWorkflowDTO,\n mapToWorkflowOverviewDTO,\n mapToWorkflowRunStatusDTO,\n} from './mapping/V2Mappings';\n\nconst FETCH_INSTANCE_MAX_ATTEMPTS = 10;\nconst FETCH_INSTANCE_RETRY_DELAY_MS = 1000;\n\nexport class V2 {\n constructor(private readonly orchestratorService: OrchestratorService) {}\n\n public async getWorkflowsOverview(\n pagination: Pagination,\n filter?: Filter,\n ): Promise<WorkflowOverviewListResultDTO> {\n const overviews = await this.orchestratorService.fetchWorkflowOverviews({\n pagination,\n filter,\n });\n if (!overviews) {\n throw new Error(\"Couldn't fetch workflow overviews\");\n }\n const result: WorkflowOverviewListResultDTO = {\n overviews: overviews.map(item => mapToWorkflowOverviewDTO(item)),\n paginationInfo: {\n pageSize: pagination.limit,\n offset: pagination.offset,\n totalCount: overviews.length,\n },\n };\n return result;\n }\n\n public getWorkflowIds(): string[] {\n return this.orchestratorService.getWorkflowIds();\n }\n\n public async getWorkflowOverviewById(\n workflowId: string,\n ): Promise<WorkflowOverviewDTO> {\n const overview = await this.orchestratorService.fetchWorkflowOverview({\n definitionId: workflowId,\n cacheHandler: 'throw',\n });\n\n if (!overview) {\n throw new Error(`Couldn't fetch workflow overview for ${workflowId}`);\n }\n return mapToWorkflowOverviewDTO(overview);\n }\n\n public async getWorkflowById(workflowId: string): Promise<WorkflowDTO> {\n const resultV1 = await this.getWorkflowSourceById(workflowId);\n return mapToWorkflowDTO(resultV1);\n }\n\n public async getWorkflowSourceById(workflowId: string): Promise<string> {\n const source = await this.orchestratorService.fetchWorkflowSource({\n definitionId: workflowId,\n cacheHandler: 'throw',\n });\n\n if (!source) {\n throw new Error(`Couldn't fetch workflow source for ${workflowId}`);\n }\n\n return source;\n }\n\n public async getInstances(\n pagination?: Pagination,\n filter?: Filter,\n workflowIds?: string[],\n ): Promise<ProcessInstanceListResultDTO> {\n const instances = await this.orchestratorService.fetchInstances({\n pagination,\n filter,\n workflowIds,\n });\n const totalCount = await this.orchestratorService.fetchInstancesTotalCount(\n workflowIds,\n filter,\n );\n\n const result: ProcessInstanceListResultDTO = {\n items: instances?.map(mapToProcessInstanceDTO),\n paginationInfo: {\n pageSize: pagination?.limit,\n offset: pagination?.offset,\n totalCount: totalCount,\n },\n };\n return result;\n }\n\n public async getInstanceById(\n instanceId: string,\n includeAssessment: boolean = false,\n ): Promise<AssessedProcessInstanceDTO> {\n const instance = await this.orchestratorService.fetchInstance({\n instanceId,\n cacheHandler: 'throw',\n });\n\n if (!instance) {\n throw new Error(`Couldn't fetch process instance ${instanceId}`);\n }\n\n let assessedByInstance: ProcessInstance | undefined;\n\n if (includeAssessment && instance.businessKey) {\n assessedByInstance = await this.orchestratorService.fetchInstance({\n instanceId: instance.businessKey,\n cacheHandler: 'throw',\n });\n }\n\n return {\n instance: mapToProcessInstanceDTO(instance),\n assessedBy: assessedByInstance\n ? mapToProcessInstanceDTO(assessedByInstance)\n : undefined,\n };\n }\n\n public async executeWorkflow(\n executeWorkflowRequestDTO: ExecuteWorkflowRequestDTO,\n workflowId: string,\n businessKey: string | undefined,\n ): Promise<ExecuteWorkflowResponseDTO> {\n const definition = await this.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n cacheHandler: 'throw',\n });\n if (!definition) {\n throw new Error(`Couldn't fetch workflow definition for ${workflowId}`);\n }\n if (!definition.serviceUrl) {\n throw new Error(`ServiceURL is not defined for workflow ${workflowId}`);\n }\n const executionResponse = await this.orchestratorService.executeWorkflow({\n definitionId: workflowId,\n inputData:\n executeWorkflowRequestDTO.inputData as ProcessInstanceVariables,\n serviceUrl: definition.serviceUrl,\n businessKey,\n cacheHandler: 'throw',\n });\n\n if (!executionResponse) {\n throw new Error(`Couldn't execute workflow ${workflowId}`);\n }\n\n // Making sure the instance data is available before returning\n await retryAsyncFunction({\n asyncFn: () =>\n this.orchestratorService.fetchInstance({\n instanceId: executionResponse.id,\n cacheHandler: 'throw',\n }),\n maxAttempts: FETCH_INSTANCE_MAX_ATTEMPTS,\n delayMs: FETCH_INSTANCE_RETRY_DELAY_MS,\n });\n\n if (!executionResponse) {\n throw new Error('Error executing workflow with id ${workflowId}');\n }\n\n return mapToExecuteWorkflowResponseDTO(workflowId, executionResponse);\n }\n\n public async retriggerInstance(\n workflowId: string,\n instanceId: string,\n ): Promise<void> {\n const definition = await this.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n cacheHandler: 'throw',\n });\n if (!definition) {\n throw new Error(`Couldn't fetch workflow definition for ${workflowId}`);\n }\n if (!definition.serviceUrl) {\n throw new Error(`ServiceURL is not defined for workflow ${workflowId}`);\n }\n const response = await this.orchestratorService.retriggerWorkflow({\n definitionId: workflowId,\n instanceId: instanceId,\n serviceUrl: definition.serviceUrl,\n cacheHandler: 'throw',\n });\n\n if (!response) {\n throw new Error(\n `Couldn't retrigger instance ${instanceId} of workflow ${workflowId}`,\n );\n }\n }\n\n public async abortWorkflow(instanceId: string): Promise<string> {\n await this.orchestratorService.abortWorkflowInstance({\n instanceId,\n cacheHandler: 'throw',\n });\n return `Workflow instance ${instanceId} successfully aborted`;\n }\n\n public async getWorkflowStatuses(): Promise<WorkflowRunStatusDTO[]> {\n return [\n ProcessInstanceState.Active,\n ProcessInstanceState.Error,\n ProcessInstanceState.Completed,\n ProcessInstanceState.Aborted,\n ProcessInstanceState.Suspended,\n ProcessInstanceState.Pending,\n ].map(status => mapToWorkflowRunStatusDTO(status));\n }\n\n public async getWorkflowInputSchemaById(\n workflowId: string,\n serviceUrl: string,\n ): Promise<WorkflowInfo | undefined> {\n return this.orchestratorService.fetchWorkflowInfoOnService({\n definitionId: workflowId,\n serviceUrl: serviceUrl,\n cacheHandler: 'throw',\n });\n }\n\n public extractQueryParam(\n req: ParsedRequest,\n key: string,\n ): string | undefined {\n return req.query[key] as string | undefined;\n }\n}\n"],"names":["mapToWorkflowOverviewDTO","mapToWorkflowDTO","mapToProcessInstanceDTO","retryAsyncFunction","mapToExecuteWorkflowResponseDTO","ProcessInstanceState","mapToWorkflowRunStatusDTO"],"mappings":"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"}
@@ -25,11 +25,61 @@ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'defau
25
25
 
26
26
  var express__default = /*#__PURE__*/_interopDefaultCompat(express);
27
27
 
28
- const authorize = async (request, permission, permissionsSvc, httpAuth) => {
29
- const decision = (await permissionsSvc.authorize([{ permission }], {
30
- credentials: await httpAuth.credentials(request)
31
- }))[0];
32
- return decision;
28
+ const authorize = async (request, anyOfPermissions, permissionsSvc, httpAuth) => {
29
+ const credentials = await httpAuth.credentials(request);
30
+ const decisionResponses = await Promise.all(
31
+ anyOfPermissions.map(
32
+ (permission) => permissionsSvc.authorize([{ permission }], {
33
+ credentials
34
+ })
35
+ )
36
+ );
37
+ const decisions = decisionResponses.map(
38
+ (d) => d[0]
39
+ );
40
+ const allow = decisions.find((d) => d.result === pluginPermissionCommon.AuthorizeResult.ALLOW);
41
+ return allow || {
42
+ result: pluginPermissionCommon.AuthorizeResult.DENY
43
+ };
44
+ };
45
+ const filterAuthorizedWorkflowIds = async (request, permissionsSvc, httpAuth, workflowIds) => {
46
+ const credentials = await httpAuth.credentials(request);
47
+ const genericWorkflowPermissionDecision = await permissionsSvc.authorize(
48
+ [{ permission: backstagePluginOrchestratorCommon.orchestratorWorkflowPermission }],
49
+ {
50
+ credentials
51
+ }
52
+ );
53
+ if (genericWorkflowPermissionDecision[0].result === pluginPermissionCommon.AuthorizeResult.ALLOW) {
54
+ return workflowIds;
55
+ }
56
+ const specificWorkflowRequests = workflowIds.map((workflowId) => ({
57
+ permission: backstagePluginOrchestratorCommon.orchestratorWorkflowSpecificPermission(workflowId)
58
+ }));
59
+ const decisions = await permissionsSvc.authorize(specificWorkflowRequests, {
60
+ credentials
61
+ });
62
+ return workflowIds.filter(
63
+ (_, idx) => decisions[idx].result === pluginPermissionCommon.AuthorizeResult.ALLOW
64
+ );
65
+ };
66
+ const filterAuthorizedWorkflows = async (request, permissionsSvc, httpAuth, workflows) => {
67
+ if (!workflows.overviews) {
68
+ return workflows;
69
+ }
70
+ const authorizedWorkflowIds = await filterAuthorizedWorkflowIds(
71
+ request,
72
+ permissionsSvc,
73
+ httpAuth,
74
+ workflows.overviews.map((w) => w.workflowId)
75
+ );
76
+ const filtered = {
77
+ ...workflows,
78
+ overviews: workflows.overviews.filter(
79
+ (w) => authorizedWorkflowIds.includes(w.workflowId)
80
+ )
81
+ };
82
+ return filtered;
33
83
  };
34
84
  async function createBackendRouter(options) {
35
85
  const {
@@ -80,12 +130,18 @@ async function createBackendRouter(options) {
80
130
  if (!next) {
81
131
  throw new Error("next is undefined");
82
132
  }
83
- return routerApi.openApiBackend.handleRequest(
84
- req,
85
- req,
86
- res,
87
- next
88
- );
133
+ return routerApi.openApiBackend.handleRequest(req, req, res, next).catch((error) => {
134
+ auditLogger.auditLog({
135
+ eventName: "genericErrorHandler",
136
+ stage: "completion",
137
+ status: "failed",
138
+ level: "error",
139
+ request: req,
140
+ message: `Exception thrown during processing request ${req.path} , ${error.message || error.name || error}`,
141
+ errors: [error]
142
+ });
143
+ next(error);
144
+ });
89
145
  });
90
146
  const middleware = rootHttpRouter.MiddlewareFactory.create({ logger, config });
91
147
  router.use(middleware.error());
@@ -199,19 +255,22 @@ function setupInternalRoutes(services, routerApi, permissions, httpAuth, auditLo
199
255
  request: req,
200
256
  message: `Received request to '${endpoint}' endpoint`
201
257
  });
202
- const decision = await authorize(
203
- req,
204
- backstagePluginOrchestratorCommon.orchestratorWorkflowInstancesReadPermission,
205
- permissions,
206
- httpAuth
207
- );
208
- if (decision.result === pluginPermissionCommon.AuthorizeResult.DENY) {
209
- manageDenyAuthorization(endpointName, endpoint, req);
210
- }
211
- return routerApi.v2.getWorkflowsOverview(pagination.buildPagination(req), getRequestFilters(req)).then((result) => res.json(result)).catch((error) => {
258
+ try {
259
+ const result = await routerApi.v2.getWorkflowsOverview(
260
+ pagination.buildPagination(req),
261
+ getRequestFilters(req)
262
+ );
263
+ const workflows = await filterAuthorizedWorkflows(
264
+ req,
265
+ permissions,
266
+ httpAuth,
267
+ result
268
+ );
269
+ res.json(workflows);
270
+ } catch (error) {
212
271
  auditLogRequestError(error, endpointName, endpoint, req);
213
272
  next(error);
214
- });
273
+ }
215
274
  }
216
275
  );
217
276
  routerApi.openApiBackend.register(
@@ -230,7 +289,10 @@ function setupInternalRoutes(services, routerApi, permissions, httpAuth, auditLo
230
289
  });
231
290
  const decision = await authorize(
232
291
  _req,
233
- backstagePluginOrchestratorCommon.orchestratorWorkflowReadPermission,
292
+ [
293
+ backstagePluginOrchestratorCommon.orchestratorWorkflowPermission,
294
+ backstagePluginOrchestratorCommon.orchestratorWorkflowSpecificPermission(workflowId)
295
+ ],
234
296
  permissions,
235
297
  httpAuth
236
298
  );
@@ -262,7 +324,10 @@ function setupInternalRoutes(services, routerApi, permissions, httpAuth, auditLo
262
324
  });
263
325
  const decision = await authorize(
264
326
  req,
265
- backstagePluginOrchestratorCommon.orchestratorWorkflowExecutePermission,
327
+ [
328
+ backstagePluginOrchestratorCommon.orchestratorWorkflowUsePermission,
329
+ backstagePluginOrchestratorCommon.orchestratorWorkflowUseSpecificPermission(workflowId)
330
+ ],
266
331
  permissions,
267
332
  httpAuth
268
333
  );
@@ -297,7 +362,10 @@ function setupInternalRoutes(services, routerApi, permissions, httpAuth, auditLo
297
362
  });
298
363
  const decision = await authorize(
299
364
  req,
300
- backstagePluginOrchestratorCommon.orchestratorWorkflowExecutePermission,
365
+ [
366
+ backstagePluginOrchestratorCommon.orchestratorWorkflowUsePermission,
367
+ backstagePluginOrchestratorCommon.orchestratorWorkflowUseSpecificPermission(workflowId)
368
+ ],
301
369
  permissions,
302
370
  httpAuth
303
371
  );
@@ -326,7 +394,10 @@ function setupInternalRoutes(services, routerApi, permissions, httpAuth, auditLo
326
394
  });
327
395
  const decision = await authorize(
328
396
  _req,
329
- backstagePluginOrchestratorCommon.orchestratorWorkflowReadPermission,
397
+ [
398
+ backstagePluginOrchestratorCommon.orchestratorWorkflowPermission,
399
+ backstagePluginOrchestratorCommon.orchestratorWorkflowSpecificPermission(workflowId)
400
+ ],
330
401
  permissions,
331
402
  httpAuth
332
403
  );
@@ -352,15 +423,6 @@ function setupInternalRoutes(services, routerApi, permissions, httpAuth, auditLo
352
423
  request: _req,
353
424
  message: `Received request to '${endpoint}' endpoint`
354
425
  });
355
- const decision = await authorize(
356
- _req,
357
- backstagePluginOrchestratorCommon.orchestratorWorkflowInstanceReadPermission,
358
- permissions,
359
- httpAuth
360
- );
361
- if (decision.result === pluginPermissionCommon.AuthorizeResult.DENY) {
362
- manageDenyAuthorization(endpointName, endpoint, _req);
363
- }
364
426
  return routerApi.v2.getWorkflowStatuses().then((result) => res.status(200).json(result)).catch((error) => {
365
427
  auditLogRequestError(error, endpointName, endpoint, _req);
366
428
  next(error);
@@ -385,7 +447,10 @@ function setupInternalRoutes(services, routerApi, permissions, httpAuth, auditLo
385
447
  });
386
448
  const decision = await authorize(
387
449
  req,
388
- backstagePluginOrchestratorCommon.orchestratorWorkflowInstanceReadPermission,
450
+ [
451
+ backstagePluginOrchestratorCommon.orchestratorWorkflowPermission,
452
+ backstagePluginOrchestratorCommon.orchestratorWorkflowSpecificPermission(workflowId)
453
+ ],
389
454
  permissions,
390
455
  httpAuth
391
456
  );
@@ -474,14 +539,19 @@ function setupInternalRoutes(services, routerApi, permissions, httpAuth, auditLo
474
539
  });
475
540
  const decision = await authorize(
476
541
  req,
477
- backstagePluginOrchestratorCommon.orchestratorWorkflowInstancesReadPermission,
542
+ [
543
+ backstagePluginOrchestratorCommon.orchestratorWorkflowPermission,
544
+ backstagePluginOrchestratorCommon.orchestratorWorkflowSpecificPermission(workflowId)
545
+ ],
478
546
  permissions,
479
547
  httpAuth
480
548
  );
481
549
  if (decision.result === pluginPermissionCommon.AuthorizeResult.DENY) {
482
550
  manageDenyAuthorization(endpointName, endpoint, req);
483
551
  }
484
- return routerApi.v2.getInstances(pagination.buildPagination(req), getRequestFilters(req), workflowId).then((result) => res.json(result)).catch((error) => {
552
+ return routerApi.v2.getInstances(pagination.buildPagination(req), getRequestFilters(req), [
553
+ workflowId
554
+ ]).then((result) => res.json(result)).catch((error) => {
485
555
  auditLogRequestError(error, endpointName, endpoint, req);
486
556
  next(error);
487
557
  });
@@ -500,19 +570,24 @@ function setupInternalRoutes(services, routerApi, permissions, httpAuth, auditLo
500
570
  request: req,
501
571
  message: `Received request to '${endpoint}' endpoint`
502
572
  });
503
- const decision = await authorize(
504
- req,
505
- backstagePluginOrchestratorCommon.orchestratorWorkflowInstancesReadPermission,
506
- permissions,
507
- httpAuth
508
- );
509
- if (decision.result === pluginPermissionCommon.AuthorizeResult.DENY) {
510
- manageDenyAuthorization(endpointName, endpoint, req);
511
- }
512
- return routerApi.v2.getInstances(pagination.buildPagination(req), getRequestFilters(req)).then((result) => res.json(result)).catch((error) => {
573
+ try {
574
+ const allWorkflowIds = routerApi.v2.getWorkflowIds();
575
+ const authorizedWorkflowIds = await filterAuthorizedWorkflowIds(
576
+ req,
577
+ permissions,
578
+ httpAuth,
579
+ allWorkflowIds
580
+ );
581
+ const result = await routerApi.v2.getInstances(
582
+ pagination.buildPagination(req),
583
+ getRequestFilters(req),
584
+ authorizedWorkflowIds
585
+ );
586
+ res.json(result);
587
+ } catch (error) {
513
588
  auditLogRequestError(error, endpointName, endpoint, req);
514
589
  next(error);
515
- });
590
+ }
516
591
  }
517
592
  );
518
593
  routerApi.openApiBackend.register(
@@ -529,23 +604,33 @@ function setupInternalRoutes(services, routerApi, permissions, httpAuth, auditLo
529
604
  request: _req,
530
605
  message: `Received request to '${endpoint}' endpoint`
531
606
  });
532
- const decision = await authorize(
533
- _req,
534
- backstagePluginOrchestratorCommon.orchestratorWorkflowInstanceReadPermission,
535
- permissions,
536
- httpAuth
537
- );
538
- if (decision.result === pluginPermissionCommon.AuthorizeResult.DENY) {
539
- manageDenyAuthorization(endpointName, endpoint, _req);
540
- }
541
607
  const includeAssessment = routerApi.v2.extractQueryParam(
542
608
  c.request,
543
609
  backstagePluginOrchestratorCommon.QUERY_PARAM_INCLUDE_ASSESSMENT
544
610
  );
545
- return routerApi.v2.getInstanceById(instanceId, !!includeAssessment).then((result) => res.status(200).json(result)).catch((error) => {
611
+ try {
612
+ const assessedInstance = await routerApi.v2.getInstanceById(
613
+ instanceId,
614
+ !!includeAssessment
615
+ );
616
+ const workflowId = assessedInstance.instance.processId;
617
+ const decision = await authorize(
618
+ _req,
619
+ [
620
+ backstagePluginOrchestratorCommon.orchestratorWorkflowPermission,
621
+ backstagePluginOrchestratorCommon.orchestratorWorkflowSpecificPermission(workflowId)
622
+ ],
623
+ permissions,
624
+ httpAuth
625
+ );
626
+ if (decision.result === pluginPermissionCommon.AuthorizeResult.DENY) {
627
+ manageDenyAuthorization(endpointName, endpoint, _req);
628
+ }
629
+ res.status(200).json(assessedInstance);
630
+ } catch (error) {
546
631
  auditLogRequestError(error, endpointName, endpoint, _req);
547
632
  next(error);
548
- });
633
+ }
549
634
  }
550
635
  );
551
636
  routerApi.openApiBackend.register(
@@ -562,19 +647,27 @@ function setupInternalRoutes(services, routerApi, permissions, httpAuth, auditLo
562
647
  request: _req,
563
648
  message: `Received request to '${endpoint}' endpoint`
564
649
  });
565
- const decision = await authorize(
566
- _req,
567
- backstagePluginOrchestratorCommon.orchestratorWorkflowInstanceAbortPermission,
568
- permissions,
569
- httpAuth
570
- );
571
- if (decision.result === pluginPermissionCommon.AuthorizeResult.DENY) {
572
- manageDenyAuthorization(endpointName, endpoint, _req);
573
- }
574
- return routerApi.v2.abortWorkflow(instanceId).then((result) => res.json(result)).catch((error) => {
650
+ try {
651
+ const assessedInstance = await routerApi.v2.getInstanceById(instanceId);
652
+ const workflowId = assessedInstance.instance.processId;
653
+ const decision = await authorize(
654
+ _req,
655
+ [
656
+ backstagePluginOrchestratorCommon.orchestratorWorkflowUsePermission,
657
+ backstagePluginOrchestratorCommon.orchestratorWorkflowUseSpecificPermission(workflowId)
658
+ ],
659
+ permissions,
660
+ httpAuth
661
+ );
662
+ if (decision.result === pluginPermissionCommon.AuthorizeResult.DENY) {
663
+ manageDenyAuthorization(endpointName, endpoint, _req);
664
+ }
665
+ const result = await routerApi.v2.abortWorkflow(instanceId);
666
+ res.status(200).json(result);
667
+ } catch (error) {
575
668
  auditLogRequestError(error, endpointName, endpoint, _req);
576
669
  next(error);
577
- });
670
+ }
578
671
  }
579
672
  );
580
673
  }
@@ -1 +1 @@
1
- {"version":3,"file":"router.cjs.js","sources":["../../src/service/router.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\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 */\nimport { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport {\n HttpAuthService,\n LoggerService,\n PermissionsService,\n resolvePackagePath,\n SchedulerService,\n} from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport type { DiscoveryApi } from '@backstage/core-plugin-api';\nimport {\n AuthorizeResult,\n BasicPermission,\n} from '@backstage/plugin-permission-common';\nimport { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';\nimport type { JsonObject, JsonValue } from '@backstage/types';\n\nimport { UnauthorizedError } from '@backstage-community/plugin-rbac-common';\nimport {\n AuditLogger,\n DefaultAuditLogger,\n} from '@janus-idp/backstage-plugin-audit-log-node';\nimport { fullFormats } from 'ajv-formats/dist/formats';\nimport express, { Router } from 'express';\nimport { Request as HttpRequest } from 'express-serve-static-core';\nimport { OpenAPIBackend, Request } from 'openapi-backend';\n\nimport {\n Filter,\n openApiDocument,\n orchestratorPermissions,\n orchestratorWorkflowExecutePermission,\n orchestratorWorkflowInstanceAbortPermission,\n orchestratorWorkflowInstanceReadPermission,\n orchestratorWorkflowInstancesReadPermission,\n orchestratorWorkflowReadPermission,\n QUERY_PARAM_BUSINESS_KEY,\n QUERY_PARAM_INCLUDE_ASSESSMENT,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport * as pkg from '../../package.json';\nimport { RouterOptions } from '../routerWrapper';\nimport { buildPagination } from '../types/pagination';\nimport { V2 } from './api/v2';\nimport { INTERNAL_SERVER_ERROR_MESSAGE } from './constants';\nimport { DataIndexService } from './DataIndexService';\nimport { DataInputSchemaService } from './DataInputSchemaService';\nimport { OrchestratorService } from './OrchestratorService';\nimport { ScaffolderService } from './ScaffolderService';\nimport { SonataFlowService } from './SonataFlowService';\nimport { WorkflowCacheService } from './WorkflowCacheService';\n\ninterface PublicServices {\n dataInputSchemaService: DataInputSchemaService;\n orchestratorService: OrchestratorService;\n}\n\ninterface RouterApi {\n openApiBackend: OpenAPIBackend;\n v2: V2;\n}\n\nconst authorize = async (\n request: HttpRequest,\n permission: BasicPermission,\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n) => {\n const decision = (\n await permissionsSvc.authorize([{ permission: permission }], {\n credentials: await httpAuth.credentials(request),\n })\n )[0];\n\n return decision;\n};\n\nexport async function createBackendRouter(\n options: RouterOptions,\n): Promise<Router> {\n const {\n config,\n logger,\n discovery,\n catalogApi,\n urlReader,\n scheduler,\n permissions,\n auth,\n httpAuth,\n } = options;\n const publicServices = initPublicServices(logger, config, scheduler);\n\n const routerApi = await initRouterApi(publicServices.orchestratorService);\n\n const auditLogger = new DefaultAuditLogger({\n logger: logger,\n authService: auth,\n httpAuthService: httpAuth,\n });\n\n const router = Router();\n const permissionsIntegrationRouter = createPermissionIntegrationRouter({\n permissions: orchestratorPermissions,\n });\n router.use(express.json());\n router.use(permissionsIntegrationRouter);\n router.use('/workflows', express.text());\n router.use('/static', express.static(resolvePackagePath(pkg.name, 'static')));\n router.get('/health', (_, response) => {\n logger.info('PONG!');\n response.json({ status: 'ok' });\n });\n\n const scaffolderService: ScaffolderService = new ScaffolderService(\n logger,\n config,\n catalogApi,\n urlReader,\n );\n\n setupInternalRoutes(\n publicServices,\n routerApi,\n permissions,\n httpAuth,\n auditLogger,\n );\n setupExternalRoutes(router, discovery, scaffolderService, auditLogger);\n\n router.use((req, res, next) => {\n if (!next) {\n throw new Error('next is undefined');\n }\n\n return routerApi.openApiBackend.handleRequest(\n req as Request,\n req,\n res,\n next,\n );\n });\n\n const middleware = MiddlewareFactory.create({ logger, config });\n\n router.use(middleware.error());\n\n return router;\n}\n\nfunction initPublicServices(\n logger: LoggerService,\n config: Config,\n scheduler: SchedulerService,\n): PublicServices {\n const dataIndexUrl = config.getString('orchestrator.dataIndexService.url');\n const dataIndexService = new DataIndexService(dataIndexUrl, logger);\n const sonataFlowService = new SonataFlowService(dataIndexService, logger);\n\n const workflowCacheService = new WorkflowCacheService(\n logger,\n dataIndexService,\n sonataFlowService,\n );\n workflowCacheService.schedule({ scheduler: scheduler });\n\n const orchestratorService = new OrchestratorService(\n sonataFlowService,\n dataIndexService,\n workflowCacheService,\n );\n\n const dataInputSchemaService = new DataInputSchemaService();\n\n return {\n orchestratorService,\n dataInputSchemaService,\n };\n}\n\nasync function initRouterApi(\n orchestratorService: OrchestratorService,\n): Promise<RouterApi> {\n const openApiBackend = new OpenAPIBackend({\n definition: openApiDocument,\n strict: false,\n ajvOpts: {\n strict: false,\n strictSchema: false,\n verbose: true,\n addUsedSchema: false,\n formats: fullFormats, // open issue: https://github.com/openapistack/openapi-backend/issues/280\n },\n handlers: {\n validationFail: async (\n c,\n _req: express.Request,\n res: express.Response,\n ) => {\n console.log('validationFail', c.operation);\n res.status(400).json({ err: c.validation.errors });\n },\n notFound: async (_c, req: express.Request, res: express.Response) => {\n res.status(404).json({ err: `${req.path} path not found` });\n },\n notImplemented: async (_c, req: express.Request, res: express.Response) =>\n res.status(500).json({ err: `${req.path} not implemented` }),\n },\n });\n await openApiBackend.init();\n const v2 = new V2(orchestratorService);\n return { v2, openApiBackend };\n}\n\n// ======================================================\n// Internal Backstage API calls to delegate to SonataFlow\n// ======================================================\nfunction setupInternalRoutes(\n services: PublicServices,\n routerApi: RouterApi,\n permissions: PermissionsService,\n httpAuth: HttpAuthService,\n auditLogger: AuditLogger,\n) {\n function manageDenyAuthorization(\n endpointName: string,\n endpoint: string,\n req: HttpRequest,\n ) {\n const error = new UnauthorizedError();\n auditLogger.auditLog({\n eventName: `${endpointName}EndpointHit`,\n stage: 'authorization',\n status: 'failed',\n level: 'error',\n request: req,\n response: {\n status: 403,\n body: {\n errors: [\n {\n name: error.name,\n message: error.message,\n },\n ],\n },\n },\n errors: [error],\n message: `Not authorize to request the ${endpoint} endpoint`,\n });\n throw error;\n }\n\n function auditLogRequestError(\n error: any,\n endpointName: string,\n endpoint: string,\n req: HttpRequest,\n ) {\n auditLogger.auditLog({\n eventName: `${endpointName}EndpointHit`,\n stage: 'completion',\n status: 'failed',\n level: 'error',\n request: req,\n response: {\n status: 500,\n body: {\n errors: [\n {\n name: error.name,\n message: error.message || INTERNAL_SERVER_ERROR_MESSAGE,\n },\n ],\n },\n },\n errors: [error],\n message: `Error occured while requesting the '${endpoint}' endpoint`,\n });\n }\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowsOverview',\n async (_c, req, res: express.Response, next) => {\n const endpointName = 'getWorkflowsOverview';\n const endpoint = '/v2/workflows/overview';\n\n auditLogger.auditLog({\n eventName: 'getWorkflowsOverview',\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n const decision = await authorize(\n req,\n orchestratorWorkflowInstancesReadPermission,\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, req);\n }\n return routerApi.v2\n .getWorkflowsOverview(buildPagination(req), getRequestFilters(req))\n .then(result => res.json(result))\n .catch(error => {\n auditLogRequestError(error, endpointName, endpoint, req);\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowSourceById',\n async (c, _req, res, next) => {\n const workflowId = c.request.params.workflowId as string;\n const endpointName = 'getWorkflowSourceById';\n const endpoint = `/v2/workflows/${workflowId}/source`;\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: _req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n\n const decision = await authorize(\n _req,\n orchestratorWorkflowReadPermission,\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, _req);\n }\n\n try {\n const result = await routerApi.v2.getWorkflowSourceById(workflowId);\n res.status(200).contentType('text/plain').send(result);\n } catch (error) {\n auditLogRequestError(error, endpointName, endpoint, _req);\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'executeWorkflow',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const endpointName = 'executeWorkflow';\n const endpoint = `/v2/workflows/${workflowId}/execute`;\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n\n const decision = await authorize(\n req,\n orchestratorWorkflowExecutePermission,\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, req);\n }\n\n const businessKey = routerApi.v2.extractQueryParam(\n c.request,\n QUERY_PARAM_BUSINESS_KEY,\n );\n\n const executeWorkflowRequestDTO = req.body;\n\n return routerApi.v2\n .executeWorkflow(executeWorkflowRequestDTO, workflowId, businessKey)\n .then(result => res.status(200).json(result))\n .catch(error => {\n auditLogRequestError(error, endpointName, endpoint, req);\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'retriggerInstance',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const instanceId = c.request.params.instanceId as string;\n const endpointName = 'retriggerInstance';\n const endpoint = `/v2/workflows/${workflowId}/${instanceId}/retrigger`;\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n\n const decision = await authorize(\n req,\n orchestratorWorkflowExecutePermission,\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, req);\n }\n\n await routerApi.v2\n .retriggerInstance(workflowId, instanceId)\n .then(result => res.status(200).json(result))\n .catch(error => {\n auditLogRequestError(error, endpointName, endpoint, req);\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowOverviewById',\n async (c, _req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const endpointName = 'getWorkflowOverviewById';\n const endpoint = `/v2/workflows/${workflowId}/overview`;\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: _req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n\n const decision = await authorize(\n _req,\n orchestratorWorkflowReadPermission,\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, _req);\n }\n return routerApi.v2\n .getWorkflowOverviewById(workflowId)\n .then(result => res.json(result))\n .catch(error => {\n auditLogRequestError(error, endpointName, endpoint, _req);\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowStatuses',\n async (_c, _req: express.Request, res: express.Response, next) => {\n const endpointName = 'getWorkflowStatuses';\n const endpoint = '/v2/workflows/instances/statuses';\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: _req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n const decision = await authorize(\n _req,\n orchestratorWorkflowInstanceReadPermission,\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, _req);\n }\n return routerApi.v2\n .getWorkflowStatuses()\n .then(result => res.status(200).json(result))\n .catch(error => {\n auditLogRequestError(error, endpointName, endpoint, _req);\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowInputSchemaById',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const instanceId = c.request.query.instanceId as string;\n const endpointName = 'getWorkflowInputSchemaById';\n const endpoint = `/v2/workflows/${workflowId}/inputSchema`;\n try {\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n const decision = await authorize(\n req,\n orchestratorWorkflowInstanceReadPermission,\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, req);\n }\n\n const workflowDefinition =\n await services.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n cacheHandler: 'throw',\n });\n\n if (!workflowDefinition) {\n throw new Error(\n `Failed to fetch workflow info for workflow ${workflowId}`,\n );\n }\n const serviceUrl = workflowDefinition.serviceUrl;\n if (!serviceUrl) {\n throw new Error(\n `Service URL is not defined for workflow ${workflowId}`,\n );\n }\n\n const definition =\n await services.orchestratorService.fetchWorkflowDefinition({\n definitionId: workflowId,\n cacheHandler: 'throw',\n });\n\n if (!definition) {\n throw new Error(\n 'Failed to fetch workflow definition for workflow ${workflowId}',\n );\n }\n\n if (!definition.dataInputSchema) {\n res.status(200).json({});\n return;\n }\n\n const instanceVariables = instanceId\n ? await services.orchestratorService.fetchInstanceVariables({\n instanceId,\n cacheHandler: 'throw',\n })\n : undefined;\n\n const workflowData = instanceVariables\n ? services.dataInputSchemaService.extractWorkflowData(\n instanceVariables,\n )\n : undefined;\n\n const workflowInfo = await routerApi.v2\n .getWorkflowInputSchemaById(workflowId, serviceUrl)\n .catch((error: { message: string }) => {\n auditLogRequestError(error, endpointName, endpoint, req);\n res.status(500).json({\n message: error.message || INTERNAL_SERVER_ERROR_MESSAGE,\n });\n });\n\n if (\n !workflowInfo ||\n !workflowInfo.inputSchema ||\n !workflowInfo.inputSchema.properties\n ) {\n res.status(200).json({});\n return;\n }\n\n const inputSchemaProps = workflowInfo.inputSchema.properties;\n let inputData;\n\n if (workflowData) {\n inputData = Object.keys(inputSchemaProps)\n .filter(k => k in workflowData)\n .reduce((result, k) => {\n if (!workflowData[k]) {\n return result;\n }\n result[k] = workflowData[k];\n return result;\n }, {} as JsonObject);\n }\n\n res.status(200).json({\n inputSchema: workflowInfo.inputSchema,\n data: inputData,\n });\n } catch (err) {\n auditLogRequestError(err, endpointName, endpoint, req);\n next(err);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowInstances',\n async (c, req: express.Request, res: express.Response, next) => {\n const endpointName = 'getWorkflowInstances';\n const workflowId = c.request.params.workflowId as string;\n const endpoint = `/v2/workflows/${workflowId}/instances`;\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n\n const decision = await authorize(\n req,\n orchestratorWorkflowInstancesReadPermission,\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, req);\n }\n return routerApi.v2\n .getInstances(buildPagination(req), getRequestFilters(req), workflowId)\n .then(result => res.json(result))\n .catch(error => {\n auditLogRequestError(error, endpointName, endpoint, req);\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getInstances',\n async (_c, req: express.Request, res: express.Response, next) => {\n const endpointName = 'getInstances';\n const endpoint = `/v2/workflows/instances`;\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n\n const decision = await authorize(\n req,\n orchestratorWorkflowInstancesReadPermission,\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, req);\n }\n return routerApi.v2\n .getInstances(buildPagination(req), getRequestFilters(req))\n .then(result => res.json(result))\n .catch(error => {\n auditLogRequestError(error, endpointName, endpoint, req);\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getInstanceById',\n async (c, _req: express.Request, res: express.Response, next) => {\n const instanceId = c.request.params.instanceId as string;\n const endpointName = 'getInstanceById';\n const endpoint = `/v2/workflows/instances/${instanceId}`;\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: _req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n\n const decision = await authorize(\n _req,\n orchestratorWorkflowInstanceReadPermission,\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, _req);\n }\n\n const includeAssessment = routerApi.v2.extractQueryParam(\n c.request,\n QUERY_PARAM_INCLUDE_ASSESSMENT,\n );\n\n return routerApi.v2\n .getInstanceById(instanceId, !!includeAssessment)\n .then(result => res.status(200).json(result))\n .catch(error => {\n auditLogRequestError(error, endpointName, endpoint, _req);\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'abortWorkflow',\n async (c, _req, res, next) => {\n const instanceId = c.request.params.instanceId as string;\n const endpointName = 'abortWorkflow';\n const endpoint = `/v2/workflows/instances/${instanceId}/abort`;\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: _req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n\n const decision = await authorize(\n _req,\n orchestratorWorkflowInstanceAbortPermission,\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, _req);\n }\n return routerApi.v2\n .abortWorkflow(instanceId)\n .then(result => res.json(result))\n .catch(error => {\n auditLogRequestError(error, endpointName, endpoint, _req);\n next(error);\n });\n },\n );\n}\n\n// ======================================================\n// External SonataFlow API calls to delegate to Backstage\n// ======================================================\nfunction setupExternalRoutes(\n router: express.Router,\n discovery: DiscoveryApi,\n scaffolderService: ScaffolderService,\n auditLogger: AuditLogger,\n) {\n router.get('/actions', async (req, res) => {\n auditLogger.auditLog({\n eventName: 'ActionsEndpointHit',\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: req,\n message: `Received request to '/actions' endpoint`,\n });\n const scaffolderUrl = await discovery.getBaseUrl('scaffolder');\n const response = await fetch(`${scaffolderUrl}/v2/actions`);\n const json = await response.json();\n res.status(response.status).json(json);\n });\n\n router.post('/actions/:actionId', async (req, res) => {\n const { actionId } = req.params;\n auditLogger.auditLog({\n eventName: 'ActionsActionIdEndpointHit',\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: req,\n message: `Received request to '/actions/${actionId}' endpoint`,\n });\n const instanceId: string | undefined = req.header('kogitoprocinstanceid');\n const body: JsonObject = (await req.body) as JsonObject;\n\n const filteredBody = Object.fromEntries(\n Object.entries(body).filter(\n ([, value]) => value !== undefined && value !== null,\n ),\n );\n\n const result: JsonValue = await scaffolderService.executeAction({\n actionId,\n instanceId,\n input: filteredBody,\n });\n res.status(200).json(result);\n });\n}\n\nfunction getRequestFilters(req: HttpRequest): Filter | undefined {\n return req.body.filters ? (req.body.filters as Filter) : undefined;\n}\n"],"names":["DefaultAuditLogger","Router","createPermissionIntegrationRouter","orchestratorPermissions","express","resolvePackagePath","pkg.name","ScaffolderService","MiddlewareFactory","DataIndexService","SonataFlowService","WorkflowCacheService","OrchestratorService","DataInputSchemaService","OpenAPIBackend","openApiDocument","fullFormats","v2","V2","UnauthorizedError","INTERNAL_SERVER_ERROR_MESSAGE","orchestratorWorkflowInstancesReadPermission","AuthorizeResult","buildPagination","orchestratorWorkflowReadPermission","orchestratorWorkflowExecutePermission","QUERY_PARAM_BUSINESS_KEY","orchestratorWorkflowInstanceReadPermission","QUERY_PARAM_INCLUDE_ASSESSMENT","orchestratorWorkflowInstanceAbortPermission"],"mappings":"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"}
1
+ {"version":3,"file":"router.cjs.js","sources":["../../src/service/router.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\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 */\nimport { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport {\n HttpAuthService,\n LoggerService,\n PermissionsService,\n resolvePackagePath,\n SchedulerService,\n} from '@backstage/backend-plugin-api';\nimport type { Config } from '@backstage/config';\nimport type { DiscoveryApi } from '@backstage/core-plugin-api';\nimport {\n AuthorizePermissionRequest,\n AuthorizePermissionResponse,\n AuthorizeResult,\n BasicPermission,\n} from '@backstage/plugin-permission-common';\nimport { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node';\nimport type { JsonObject, JsonValue } from '@backstage/types';\n\nimport { UnauthorizedError } from '@backstage-community/plugin-rbac-common';\nimport {\n AuditLogger,\n DefaultAuditLogger,\n} from '@janus-idp/backstage-plugin-audit-log-node';\nimport { fullFormats } from 'ajv-formats/dist/formats';\nimport express, { Router } from 'express';\nimport { Request as HttpRequest } from 'express-serve-static-core';\nimport { OpenAPIBackend, Request } from 'openapi-backend';\n\nimport {\n Filter,\n openApiDocument,\n orchestratorPermissions,\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission,\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission,\n QUERY_PARAM_BUSINESS_KEY,\n QUERY_PARAM_INCLUDE_ASSESSMENT,\n WorkflowOverviewListResultDTO,\n} from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nimport * as pkg from '../../package.json';\nimport { RouterOptions } from '../routerWrapper';\nimport { buildPagination } from '../types/pagination';\nimport { V2 } from './api/v2';\nimport { INTERNAL_SERVER_ERROR_MESSAGE } from './constants';\nimport { DataIndexService } from './DataIndexService';\nimport { DataInputSchemaService } from './DataInputSchemaService';\nimport { OrchestratorService } from './OrchestratorService';\nimport { ScaffolderService } from './ScaffolderService';\nimport { SonataFlowService } from './SonataFlowService';\nimport { WorkflowCacheService } from './WorkflowCacheService';\n\ninterface PublicServices {\n dataInputSchemaService: DataInputSchemaService;\n orchestratorService: OrchestratorService;\n}\n\ninterface RouterApi {\n openApiBackend: OpenAPIBackend;\n v2: V2;\n}\n\nconst authorize = async (\n request: HttpRequest,\n anyOfPermissions: BasicPermission[],\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n): Promise<AuthorizePermissionResponse> => {\n const credentials = await httpAuth.credentials(request);\n\n const decisionResponses: AuthorizePermissionResponse[][] = await Promise.all(\n anyOfPermissions.map(permission =>\n permissionsSvc.authorize([{ permission }], {\n credentials,\n }),\n ),\n );\n const decisions: AuthorizePermissionResponse[] = decisionResponses.map(\n d => d[0],\n );\n\n const allow = decisions.find(d => d.result === AuthorizeResult.ALLOW);\n return (\n allow || {\n result: AuthorizeResult.DENY,\n }\n );\n};\n\nconst filterAuthorizedWorkflowIds = async (\n request: HttpRequest,\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n workflowIds: string[],\n): Promise<string[]> => {\n const credentials = await httpAuth.credentials(request);\n const genericWorkflowPermissionDecision = await permissionsSvc.authorize(\n [{ permission: orchestratorWorkflowPermission }],\n {\n credentials,\n },\n );\n\n if (genericWorkflowPermissionDecision[0].result === AuthorizeResult.ALLOW) {\n // The user can see all workflows\n return workflowIds;\n }\n\n const specificWorkflowRequests: AuthorizePermissionRequest[] =\n workflowIds.map(workflowId => ({\n permission: orchestratorWorkflowSpecificPermission(workflowId),\n }));\n\n const decisions = await permissionsSvc.authorize(specificWorkflowRequests, {\n credentials,\n });\n\n return workflowIds.filter(\n (_, idx) => decisions[idx].result === AuthorizeResult.ALLOW,\n );\n};\n\nconst filterAuthorizedWorkflows = async (\n request: HttpRequest,\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n workflows: WorkflowOverviewListResultDTO,\n): Promise<WorkflowOverviewListResultDTO> => {\n if (!workflows.overviews) {\n return workflows;\n }\n\n const authorizedWorkflowIds = await filterAuthorizedWorkflowIds(\n request,\n permissionsSvc,\n httpAuth,\n workflows.overviews.map(w => w.workflowId),\n );\n\n const filtered = {\n ...workflows,\n overviews: workflows.overviews.filter(w =>\n authorizedWorkflowIds.includes(w.workflowId),\n ),\n };\n\n return filtered;\n};\n\nexport async function createBackendRouter(\n options: RouterOptions,\n): Promise<Router> {\n const {\n config,\n logger,\n discovery,\n catalogApi,\n urlReader,\n scheduler,\n permissions,\n auth,\n httpAuth,\n } = options;\n const publicServices = initPublicServices(logger, config, scheduler);\n\n const routerApi = await initRouterApi(publicServices.orchestratorService);\n\n const auditLogger = new DefaultAuditLogger({\n logger: logger,\n authService: auth,\n httpAuthService: httpAuth,\n });\n\n const router = Router();\n const permissionsIntegrationRouter = createPermissionIntegrationRouter({\n permissions: orchestratorPermissions,\n });\n router.use(express.json());\n router.use(permissionsIntegrationRouter);\n router.use('/workflows', express.text());\n router.use('/static', express.static(resolvePackagePath(pkg.name, 'static')));\n router.get('/health', (_, response) => {\n logger.info('PONG!');\n response.json({ status: 'ok' });\n });\n\n const scaffolderService: ScaffolderService = new ScaffolderService(\n logger,\n config,\n catalogApi,\n urlReader,\n );\n\n setupInternalRoutes(\n publicServices,\n routerApi,\n permissions,\n httpAuth,\n auditLogger,\n );\n setupExternalRoutes(router, discovery, scaffolderService, auditLogger);\n\n router.use((req, res, next) => {\n if (!next) {\n throw new Error('next is undefined');\n }\n\n return routerApi.openApiBackend\n .handleRequest(req as Request, req, res, next)\n .catch(error => {\n auditLogger.auditLog({\n eventName: 'genericErrorHandler',\n stage: 'completion',\n status: 'failed',\n level: 'error',\n request: req,\n message: `Exception thrown during processing request ${req.path} , ${error.message || error.name || error}`,\n errors: [error],\n });\n\n next(error);\n });\n });\n\n const middleware = MiddlewareFactory.create({ logger, config });\n\n router.use(middleware.error());\n\n return router;\n}\n\nfunction initPublicServices(\n logger: LoggerService,\n config: Config,\n scheduler: SchedulerService,\n): PublicServices {\n const dataIndexUrl = config.getString('orchestrator.dataIndexService.url');\n const dataIndexService = new DataIndexService(dataIndexUrl, logger);\n const sonataFlowService = new SonataFlowService(dataIndexService, logger);\n\n const workflowCacheService = new WorkflowCacheService(\n logger,\n dataIndexService,\n sonataFlowService,\n );\n workflowCacheService.schedule({ scheduler: scheduler });\n\n const orchestratorService = new OrchestratorService(\n sonataFlowService,\n dataIndexService,\n workflowCacheService,\n );\n\n const dataInputSchemaService = new DataInputSchemaService();\n\n return {\n orchestratorService,\n dataInputSchemaService,\n };\n}\n\nasync function initRouterApi(\n orchestratorService: OrchestratorService,\n): Promise<RouterApi> {\n const openApiBackend = new OpenAPIBackend({\n definition: openApiDocument,\n strict: false,\n ajvOpts: {\n strict: false,\n strictSchema: false,\n verbose: true,\n addUsedSchema: false,\n formats: fullFormats, // open issue: https://github.com/openapistack/openapi-backend/issues/280\n },\n handlers: {\n validationFail: async (\n c,\n _req: express.Request,\n res: express.Response,\n ) => {\n console.log('validationFail', c.operation);\n res.status(400).json({ err: c.validation.errors });\n },\n notFound: async (_c, req: express.Request, res: express.Response) => {\n res.status(404).json({ err: `${req.path} path not found` });\n },\n notImplemented: async (_c, req: express.Request, res: express.Response) =>\n res.status(500).json({ err: `${req.path} not implemented` }),\n },\n });\n await openApiBackend.init();\n const v2 = new V2(orchestratorService);\n return { v2, openApiBackend };\n}\n\n// ======================================================\n// Internal Backstage API calls to delegate to SonataFlow\n// ======================================================\nfunction setupInternalRoutes(\n services: PublicServices,\n routerApi: RouterApi,\n permissions: PermissionsService,\n httpAuth: HttpAuthService,\n auditLogger: AuditLogger,\n) {\n function manageDenyAuthorization(\n endpointName: string,\n endpoint: string,\n req: HttpRequest,\n ) {\n const error = new UnauthorizedError();\n auditLogger.auditLog({\n eventName: `${endpointName}EndpointHit`,\n stage: 'authorization',\n status: 'failed',\n level: 'error',\n request: req,\n response: {\n status: 403,\n body: {\n errors: [\n {\n name: error.name,\n message: error.message,\n },\n ],\n },\n },\n errors: [error],\n message: `Not authorize to request the ${endpoint} endpoint`,\n });\n throw error;\n }\n\n function auditLogRequestError(\n error: any,\n endpointName: string,\n endpoint: string,\n req: HttpRequest,\n ) {\n auditLogger.auditLog({\n eventName: `${endpointName}EndpointHit`,\n stage: 'completion',\n status: 'failed',\n level: 'error',\n request: req,\n response: {\n status: 500,\n body: {\n errors: [\n {\n name: error.name,\n message: error.message || INTERNAL_SERVER_ERROR_MESSAGE,\n },\n ],\n },\n },\n errors: [error],\n message: `Error occured while requesting the '${endpoint}' endpoint`,\n });\n }\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowsOverview',\n async (_c, req, res: express.Response, next) => {\n const endpointName = 'getWorkflowsOverview';\n const endpoint = '/v2/workflows/overview';\n\n auditLogger.auditLog({\n eventName: 'getWorkflowsOverview',\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n\n try {\n const result = await routerApi.v2.getWorkflowsOverview(\n buildPagination(req),\n getRequestFilters(req),\n );\n\n const workflows = await filterAuthorizedWorkflows(\n req,\n permissions,\n httpAuth,\n result,\n );\n res.json(workflows);\n } catch (error) {\n auditLogRequestError(error, endpointName, endpoint, req);\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowSourceById',\n async (c, _req, res, next) => {\n const workflowId = c.request.params.workflowId as string;\n const endpointName = 'getWorkflowSourceById';\n const endpoint = `/v2/workflows/${workflowId}/source`;\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: _req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n\n const decision = await authorize(\n _req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, _req);\n }\n\n try {\n const result = await routerApi.v2.getWorkflowSourceById(workflowId);\n res.status(200).contentType('text/plain').send(result);\n } catch (error) {\n auditLogRequestError(error, endpointName, endpoint, _req);\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'executeWorkflow',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const endpointName = 'executeWorkflow';\n const endpoint = `/v2/workflows/${workflowId}/execute`;\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, req);\n }\n\n const businessKey = routerApi.v2.extractQueryParam(\n c.request,\n QUERY_PARAM_BUSINESS_KEY,\n );\n\n const executeWorkflowRequestDTO = req.body;\n\n return routerApi.v2\n .executeWorkflow(executeWorkflowRequestDTO, workflowId, businessKey)\n .then(result => res.status(200).json(result))\n .catch(error => {\n auditLogRequestError(error, endpointName, endpoint, req);\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'retriggerInstance',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const instanceId = c.request.params.instanceId as string;\n const endpointName = 'retriggerInstance';\n const endpoint = `/v2/workflows/${workflowId}/${instanceId}/retrigger`;\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, req);\n }\n\n await routerApi.v2\n .retriggerInstance(workflowId, instanceId)\n .then(result => res.status(200).json(result))\n .catch(error => {\n auditLogRequestError(error, endpointName, endpoint, req);\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowOverviewById',\n async (c, _req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const endpointName = 'getWorkflowOverviewById';\n const endpoint = `/v2/workflows/${workflowId}/overview`;\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: _req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n\n const decision = await authorize(\n _req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, _req);\n }\n\n return routerApi.v2\n .getWorkflowOverviewById(workflowId)\n .then(result => res.json(result))\n .catch(error => {\n auditLogRequestError(error, endpointName, endpoint, _req);\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowStatuses',\n async (_c, _req: express.Request, res: express.Response, next) => {\n const endpointName = 'getWorkflowStatuses';\n const endpoint = '/v2/workflows/instances/statuses';\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: _req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n // Anyone is authorized to call this endpoint\n\n return routerApi.v2\n .getWorkflowStatuses()\n .then(result => res.status(200).json(result))\n .catch(error => {\n auditLogRequestError(error, endpointName, endpoint, _req);\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowInputSchemaById',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n const instanceId = c.request.query.instanceId as string;\n const endpointName = 'getWorkflowInputSchemaById';\n const endpoint = `/v2/workflows/${workflowId}/inputSchema`;\n try {\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, req);\n }\n\n const workflowDefinition =\n await services.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\n cacheHandler: 'throw',\n });\n\n if (!workflowDefinition) {\n throw new Error(\n `Failed to fetch workflow info for workflow ${workflowId}`,\n );\n }\n const serviceUrl = workflowDefinition.serviceUrl;\n if (!serviceUrl) {\n throw new Error(\n `Service URL is not defined for workflow ${workflowId}`,\n );\n }\n\n const definition =\n await services.orchestratorService.fetchWorkflowDefinition({\n definitionId: workflowId,\n cacheHandler: 'throw',\n });\n\n if (!definition) {\n throw new Error(\n 'Failed to fetch workflow definition for workflow ${workflowId}',\n );\n }\n\n if (!definition.dataInputSchema) {\n res.status(200).json({});\n return;\n }\n\n const instanceVariables = instanceId\n ? await services.orchestratorService.fetchInstanceVariables({\n instanceId,\n cacheHandler: 'throw',\n })\n : undefined;\n\n const workflowData = instanceVariables\n ? services.dataInputSchemaService.extractWorkflowData(\n instanceVariables,\n )\n : undefined;\n\n const workflowInfo = await routerApi.v2\n .getWorkflowInputSchemaById(workflowId, serviceUrl)\n .catch((error: { message: string }) => {\n auditLogRequestError(error, endpointName, endpoint, req);\n res.status(500).json({\n message: error.message || INTERNAL_SERVER_ERROR_MESSAGE,\n });\n });\n\n if (\n !workflowInfo ||\n !workflowInfo.inputSchema ||\n !workflowInfo.inputSchema.properties\n ) {\n res.status(200).json({});\n return;\n }\n\n const inputSchemaProps = workflowInfo.inputSchema.properties;\n let inputData;\n\n if (workflowData) {\n inputData = Object.keys(inputSchemaProps)\n .filter(k => k in workflowData)\n .reduce((result, k) => {\n if (!workflowData[k]) {\n return result;\n }\n result[k] = workflowData[k];\n return result;\n }, {} as JsonObject);\n }\n\n res.status(200).json({\n inputSchema: workflowInfo.inputSchema,\n data: inputData,\n });\n } catch (err) {\n auditLogRequestError(err, endpointName, endpoint, req);\n next(err);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowInstances',\n async (c, req: express.Request, res: express.Response, next) => {\n const endpointName = 'getWorkflowInstances';\n const workflowId = c.request.params.workflowId as string;\n const endpoint = `/v2/workflows/${workflowId}/instances`;\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n\n const decision = await authorize(\n req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, req);\n }\n return routerApi.v2\n .getInstances(buildPagination(req), getRequestFilters(req), [\n workflowId,\n ])\n .then(result => res.json(result))\n .catch(error => {\n auditLogRequestError(error, endpointName, endpoint, req);\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getInstances',\n async (_c, req: express.Request, res: express.Response, next) => {\n const endpointName = 'getInstances';\n const endpoint = `/v2/workflows/instances`;\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n\n try {\n // Once we assign user to the instance in the future, we can rework this filtering\n const allWorkflowIds = routerApi.v2.getWorkflowIds();\n const authorizedWorkflowIds: string[] =\n await filterAuthorizedWorkflowIds(\n req,\n permissions,\n httpAuth,\n allWorkflowIds,\n );\n\n const result = await routerApi.v2.getInstances(\n buildPagination(req),\n getRequestFilters(req),\n authorizedWorkflowIds,\n );\n\n res.json(result);\n } catch (error) {\n auditLogRequestError(error, endpointName, endpoint, req);\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getInstanceById',\n async (c, _req: express.Request, res: express.Response, next) => {\n const instanceId = c.request.params.instanceId as string;\n const endpointName = 'getInstanceById';\n const endpoint = `/v2/workflows/instances/${instanceId}`;\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: _req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n\n const includeAssessment = routerApi.v2.extractQueryParam(\n c.request,\n QUERY_PARAM_INCLUDE_ASSESSMENT,\n );\n\n try {\n const assessedInstance = await routerApi.v2.getInstanceById(\n instanceId,\n !!includeAssessment,\n );\n\n const workflowId = assessedInstance.instance.processId;\n\n const decision = await authorize(\n _req,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, _req);\n }\n\n res.status(200).json(assessedInstance);\n } catch (error) {\n auditLogRequestError(error, endpointName, endpoint, _req);\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'abortWorkflow',\n async (c, _req, res, next) => {\n const instanceId = c.request.params.instanceId as string;\n const endpointName = 'abortWorkflow';\n const endpoint = `/v2/workflows/instances/${instanceId}/abort`;\n\n auditLogger.auditLog({\n eventName: endpointName,\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: _req,\n message: `Received request to '${endpoint}' endpoint`,\n });\n\n try {\n const assessedInstance = await routerApi.v2.getInstanceById(instanceId);\n const workflowId = assessedInstance.instance.processId;\n\n const decision = await authorize(\n _req,\n [\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(endpointName, endpoint, _req);\n }\n\n const result = await routerApi.v2.abortWorkflow(instanceId);\n res.status(200).json(result);\n } catch (error) {\n auditLogRequestError(error, endpointName, endpoint, _req);\n next(error);\n }\n },\n );\n}\n\n// ======================================================\n// External SonataFlow API calls to delegate to Backstage\n// ======================================================\nfunction setupExternalRoutes(\n router: express.Router,\n discovery: DiscoveryApi,\n scaffolderService: ScaffolderService,\n auditLogger: AuditLogger,\n) {\n router.get('/actions', async (req, res) => {\n auditLogger.auditLog({\n eventName: 'ActionsEndpointHit',\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: req,\n message: `Received request to '/actions' endpoint`,\n });\n const scaffolderUrl = await discovery.getBaseUrl('scaffolder');\n const response = await fetch(`${scaffolderUrl}/v2/actions`);\n const json = await response.json();\n res.status(response.status).json(json);\n });\n\n router.post('/actions/:actionId', async (req, res) => {\n const { actionId } = req.params;\n auditLogger.auditLog({\n eventName: 'ActionsActionIdEndpointHit',\n stage: 'start',\n status: 'succeeded',\n level: 'debug',\n request: req,\n message: `Received request to '/actions/${actionId}' endpoint`,\n });\n const instanceId: string | undefined = req.header('kogitoprocinstanceid');\n const body: JsonObject = (await req.body) as JsonObject;\n\n const filteredBody = Object.fromEntries(\n Object.entries(body).filter(\n ([, value]) => value !== undefined && value !== null,\n ),\n );\n\n const result: JsonValue = await scaffolderService.executeAction({\n actionId,\n instanceId,\n input: filteredBody,\n });\n res.status(200).json(result);\n });\n}\n\nfunction getRequestFilters(req: HttpRequest): Filter | undefined {\n return req.body.filters ? (req.body.filters as Filter) : undefined;\n}\n"],"names":["AuthorizeResult","orchestratorWorkflowPermission","orchestratorWorkflowSpecificPermission","DefaultAuditLogger","Router","createPermissionIntegrationRouter","orchestratorPermissions","express","resolvePackagePath","pkg.name","ScaffolderService","MiddlewareFactory","DataIndexService","SonataFlowService","WorkflowCacheService","OrchestratorService","DataInputSchemaService","OpenAPIBackend","openApiDocument","fullFormats","v2","V2","UnauthorizedError","INTERNAL_SERVER_ERROR_MESSAGE","buildPagination","orchestratorWorkflowUsePermission","orchestratorWorkflowUseSpecificPermission","QUERY_PARAM_BUSINESS_KEY","QUERY_PARAM_INCLUDE_ASSESSMENT"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA+EA,MAAM,SAAY,GAAA,OAChB,OACA,EAAA,gBAAA,EACA,gBACA,QACyC,KAAA;AACzC,EAAA,MAAM,WAAc,GAAA,MAAM,QAAS,CAAA,WAAA,CAAY,OAAO,CAAA,CAAA;AAEtD,EAAM,MAAA,iBAAA,GAAqD,MAAM,OAAQ,CAAA,GAAA;AAAA,IACvE,gBAAiB,CAAA,GAAA;AAAA,MAAI,gBACnB,cAAe,CAAA,SAAA,CAAU,CAAC,EAAE,UAAA,EAAY,CAAG,EAAA;AAAA,QACzC,WAAA;AAAA,OACD,CAAA;AAAA,KACH;AAAA,GACF,CAAA;AACA,EAAA,MAAM,YAA2C,iBAAkB,CAAA,GAAA;AAAA,IACjE,CAAA,CAAA,KAAK,EAAE,CAAC,CAAA;AAAA,GACV,CAAA;AAEA,EAAA,MAAM,QAAQ,SAAU,CAAA,IAAA,CAAK,OAAK,CAAE,CAAA,MAAA,KAAWA,uCAAgB,KAAK,CAAA,CAAA;AACpE,EAAA,OACE,KAAS,IAAA;AAAA,IACP,QAAQA,sCAAgB,CAAA,IAAA;AAAA,GAC1B,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,2BAA8B,GAAA,OAClC,OACA,EAAA,cAAA,EACA,UACA,WACsB,KAAA;AACtB,EAAA,MAAM,WAAc,GAAA,MAAM,QAAS,CAAA,WAAA,CAAY,OAAO,CAAA,CAAA;AACtD,EAAM,MAAA,iCAAA,GAAoC,MAAM,cAAe,CAAA,SAAA;AAAA,IAC7D,CAAC,EAAE,UAAY,EAAAC,gEAAA,EAAgC,CAAA;AAAA,IAC/C;AAAA,MACE,WAAA;AAAA,KACF;AAAA,GACF,CAAA;AAEA,EAAA,IAAI,iCAAkC,CAAA,CAAC,CAAE,CAAA,MAAA,KAAWD,uCAAgB,KAAO,EAAA;AAEzE,IAAO,OAAA,WAAA,CAAA;AAAA,GACT;AAEA,EAAM,MAAA,wBAAA,GACJ,WAAY,CAAA,GAAA,CAAI,CAAe,UAAA,MAAA;AAAA,IAC7B,UAAA,EAAYE,yEAAuC,UAAU,CAAA;AAAA,GAC7D,CAAA,CAAA,CAAA;AAEJ,EAAA,MAAM,SAAY,GAAA,MAAM,cAAe,CAAA,SAAA,CAAU,wBAA0B,EAAA;AAAA,IACzE,WAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,OAAO,WAAY,CAAA,MAAA;AAAA,IACjB,CAAC,CAAG,EAAA,GAAA,KAAQ,UAAU,GAAG,CAAA,CAAE,WAAWF,sCAAgB,CAAA,KAAA;AAAA,GACxD,CAAA;AACF,CAAA,CAAA;AAEA,MAAM,yBAA4B,GAAA,OAChC,OACA,EAAA,cAAA,EACA,UACA,SAC2C,KAAA;AAC3C,EAAI,IAAA,CAAC,UAAU,SAAW,EAAA;AACxB,IAAO,OAAA,SAAA,CAAA;AAAA,GACT;AAEA,EAAA,MAAM,wBAAwB,MAAM,2BAAA;AAAA,IAClC,OAAA;AAAA,IACA,cAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAU,CAAA,SAAA,CAAU,GAAI,CAAA,CAAA,CAAA,KAAK,EAAE,UAAU,CAAA;AAAA,GAC3C,CAAA;AAEA,EAAA,MAAM,QAAW,GAAA;AAAA,IACf,GAAG,SAAA;AAAA,IACH,SAAA,EAAW,UAAU,SAAU,CAAA,MAAA;AAAA,MAAO,CACpC,CAAA,KAAA,qBAAA,CAAsB,QAAS,CAAA,CAAA,CAAE,UAAU,CAAA;AAAA,KAC7C;AAAA,GACF,CAAA;AAEA,EAAO,OAAA,QAAA,CAAA;AACT,CAAA,CAAA;AAEA,eAAsB,oBACpB,OACiB,EAAA;AACjB,EAAM,MAAA;AAAA,IACJ,MAAA;AAAA,IACA,MAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,IAAA;AAAA,IACA,QAAA;AAAA,GACE,GAAA,OAAA,CAAA;AACJ,EAAA,MAAM,cAAiB,GAAA,kBAAA,CAAmB,MAAQ,EAAA,MAAA,EAAQ,SAAS,CAAA,CAAA;AAEnE,EAAA,MAAM,SAAY,GAAA,MAAM,aAAc,CAAA,cAAA,CAAe,mBAAmB,CAAA,CAAA;AAExE,EAAM,MAAA,WAAA,GAAc,IAAIG,8CAAmB,CAAA;AAAA,IACzC,MAAA;AAAA,IACA,WAAa,EAAA,IAAA;AAAA,IACb,eAAiB,EAAA,QAAA;AAAA,GAClB,CAAA,CAAA;AAED,EAAA,MAAM,SAASC,cAAO,EAAA,CAAA;AACtB,EAAA,MAAM,+BAA+BC,sDAAkC,CAAA;AAAA,IACrE,WAAa,EAAAC,yDAAA;AAAA,GACd,CAAA,CAAA;AACD,EAAO,MAAA,CAAA,GAAA,CAAIC,wBAAQ,CAAA,IAAA,EAAM,CAAA,CAAA;AACzB,EAAA,MAAA,CAAO,IAAI,4BAA4B,CAAA,CAAA;AACvC,EAAA,MAAA,CAAO,GAAI,CAAA,YAAA,EAAcA,wBAAQ,CAAA,IAAA,EAAM,CAAA,CAAA;AACvC,EAAO,MAAA,CAAA,GAAA,CAAI,WAAWA,wBAAQ,CAAA,MAAA,CAAOC,oCAAmBC,aAAI,EAAM,QAAQ,CAAC,CAAC,CAAA,CAAA;AAC5E,EAAA,MAAA,CAAO,GAAI,CAAA,SAAA,EAAW,CAAC,CAAA,EAAG,QAAa,KAAA;AACrC,IAAA,MAAA,CAAO,KAAK,OAAO,CAAA,CAAA;AACnB,IAAA,QAAA,CAAS,IAAK,CAAA,EAAE,MAAQ,EAAA,IAAA,EAAM,CAAA,CAAA;AAAA,GAC/B,CAAA,CAAA;AAED,EAAA,MAAM,oBAAuC,IAAIC,mCAAA;AAAA,IAC/C,MAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,GACF,CAAA;AAEA,EAAA,mBAAA;AAAA,IACE,cAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA,WAAA;AAAA,GACF,CAAA;AACA,EAAoB,mBAAA,CAAA,MAAA,EAAQ,SAAW,EAAA,iBAAA,EAAmB,WAAW,CAAA,CAAA;AAErE,EAAA,MAAA,CAAO,GAAI,CAAA,CAAC,GAAK,EAAA,GAAA,EAAK,IAAS,KAAA;AAC7B,IAAA,IAAI,CAAC,IAAM,EAAA;AACT,MAAM,MAAA,IAAI,MAAM,mBAAmB,CAAA,CAAA;AAAA,KACrC;AAEA,IAAO,OAAA,SAAA,CAAU,eACd,aAAc,CAAA,GAAA,EAAgB,KAAK,GAAK,EAAA,IAAI,CAC5C,CAAA,KAAA,CAAM,CAAS,KAAA,KAAA;AACd,MAAA,WAAA,CAAY,QAAS,CAAA;AAAA,QACnB,SAAW,EAAA,qBAAA;AAAA,QACX,KAAO,EAAA,YAAA;AAAA,QACP,MAAQ,EAAA,QAAA;AAAA,QACR,KAAO,EAAA,OAAA;AAAA,QACP,OAAS,EAAA,GAAA;AAAA,QACT,OAAA,EAAS,8CAA8C,GAAI,CAAA,IAAI,MAAM,KAAM,CAAA,OAAA,IAAW,KAAM,CAAA,IAAA,IAAQ,KAAK,CAAA,CAAA;AAAA,QACzG,MAAA,EAAQ,CAAC,KAAK,CAAA;AAAA,OACf,CAAA,CAAA;AAED,MAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,KACX,CAAA,CAAA;AAAA,GACJ,CAAA,CAAA;AAED,EAAA,MAAM,aAAaC,gCAAkB,CAAA,MAAA,CAAO,EAAE,MAAA,EAAQ,QAAQ,CAAA,CAAA;AAE9D,EAAO,MAAA,CAAA,GAAA,CAAI,UAAW,CAAA,KAAA,EAAO,CAAA,CAAA;AAE7B,EAAO,OAAA,MAAA,CAAA;AACT,CAAA;AAEA,SAAS,kBAAA,CACP,MACA,EAAA,MAAA,EACA,SACgB,EAAA;AAChB,EAAM,MAAA,YAAA,GAAe,MAAO,CAAA,SAAA,CAAU,mCAAmC,CAAA,CAAA;AACzE,EAAA,MAAM,gBAAmB,GAAA,IAAIC,iCAAiB,CAAA,YAAA,EAAc,MAAM,CAAA,CAAA;AAClE,EAAA,MAAM,iBAAoB,GAAA,IAAIC,mCAAkB,CAAA,gBAAA,EAAkB,MAAM,CAAA,CAAA;AAExE,EAAA,MAAM,uBAAuB,IAAIC,yCAAA;AAAA,IAC/B,MAAA;AAAA,IACA,gBAAA;AAAA,IACA,iBAAA;AAAA,GACF,CAAA;AACA,EAAqB,oBAAA,CAAA,QAAA,CAAS,EAAE,SAAA,EAAsB,CAAA,CAAA;AAEtD,EAAA,MAAM,sBAAsB,IAAIC,uCAAA;AAAA,IAC9B,iBAAA;AAAA,IACA,gBAAA;AAAA,IACA,oBAAA;AAAA,GACF,CAAA;AAEA,EAAM,MAAA,sBAAA,GAAyB,IAAIC,6CAAuB,EAAA,CAAA;AAE1D,EAAO,OAAA;AAAA,IACL,mBAAA;AAAA,IACA,sBAAA;AAAA,GACF,CAAA;AACF,CAAA;AAEA,eAAe,cACb,mBACoB,EAAA;AACpB,EAAM,MAAA,cAAA,GAAiB,IAAIC,6BAAe,CAAA;AAAA,IACxC,UAAY,EAAAC,iDAAA;AAAA,IACZ,MAAQ,EAAA,KAAA;AAAA,IACR,OAAS,EAAA;AAAA,MACP,MAAQ,EAAA,KAAA;AAAA,MACR,YAAc,EAAA,KAAA;AAAA,MACd,OAAS,EAAA,IAAA;AAAA,MACT,aAAe,EAAA,KAAA;AAAA,MACf,OAAS,EAAAC,mBAAA;AAAA;AAAA,KACX;AAAA,IACA,QAAU,EAAA;AAAA,MACR,cAAgB,EAAA,OACd,CACA,EAAA,IAAA,EACA,GACG,KAAA;AACH,QAAQ,OAAA,CAAA,GAAA,CAAI,gBAAkB,EAAA,CAAA,CAAE,SAAS,CAAA,CAAA;AACzC,QAAI,GAAA,CAAA,MAAA,CAAO,GAAG,CAAE,CAAA,IAAA,CAAK,EAAE,GAAK,EAAA,CAAA,CAAE,UAAW,CAAA,MAAA,EAAQ,CAAA,CAAA;AAAA,OACnD;AAAA,MACA,QAAU,EAAA,OAAO,EAAI,EAAA,GAAA,EAAsB,GAA0B,KAAA;AACnE,QAAI,GAAA,CAAA,MAAA,CAAO,GAAG,CAAA,CAAE,IAAK,CAAA,EAAE,KAAK,CAAG,EAAA,GAAA,CAAI,IAAI,CAAA,eAAA,CAAA,EAAmB,CAAA,CAAA;AAAA,OAC5D;AAAA,MACA,gBAAgB,OAAO,EAAA,EAAI,GAAsB,EAAA,GAAA,KAC/C,IAAI,MAAO,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,EAAE,GAAK,EAAA,CAAA,EAAG,GAAI,CAAA,IAAI,oBAAoB,CAAA;AAAA,KAC/D;AAAA,GACD,CAAA,CAAA;AACD,EAAA,MAAM,eAAe,IAAK,EAAA,CAAA;AAC1B,EAAM,MAAAC,IAAA,GAAK,IAAIC,KAAA,CAAG,mBAAmB,CAAA,CAAA;AACrC,EAAO,OAAA,MAAED,MAAI,cAAe,EAAA,CAAA;AAC9B,CAAA;AAKA,SAAS,mBACP,CAAA,QAAA,EACA,SACA,EAAA,WAAA,EACA,UACA,WACA,EAAA;AACA,EAAS,SAAA,uBAAA,CACP,YACA,EAAA,QAAA,EACA,GACA,EAAA;AACA,IAAM,MAAA,KAAA,GAAQ,IAAIE,kCAAkB,EAAA,CAAA;AACpC,IAAA,WAAA,CAAY,QAAS,CAAA;AAAA,MACnB,SAAA,EAAW,GAAG,YAAY,CAAA,WAAA,CAAA;AAAA,MAC1B,KAAO,EAAA,eAAA;AAAA,MACP,MAAQ,EAAA,QAAA;AAAA,MACR,KAAO,EAAA,OAAA;AAAA,MACP,OAAS,EAAA,GAAA;AAAA,MACT,QAAU,EAAA;AAAA,QACR,MAAQ,EAAA,GAAA;AAAA,QACR,IAAM,EAAA;AAAA,UACJ,MAAQ,EAAA;AAAA,YACN;AAAA,cACE,MAAM,KAAM,CAAA,IAAA;AAAA,cACZ,SAAS,KAAM,CAAA,OAAA;AAAA,aACjB;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,MACA,MAAA,EAAQ,CAAC,KAAK,CAAA;AAAA,MACd,OAAA,EAAS,gCAAgC,QAAQ,CAAA,SAAA,CAAA;AAAA,KAClD,CAAA,CAAA;AACD,IAAM,MAAA,KAAA,CAAA;AAAA,GACR;AAEA,EAAA,SAAS,oBACP,CAAA,KAAA,EACA,YACA,EAAA,QAAA,EACA,GACA,EAAA;AACA,IAAA,WAAA,CAAY,QAAS,CAAA;AAAA,MACnB,SAAA,EAAW,GAAG,YAAY,CAAA,WAAA,CAAA;AAAA,MAC1B,KAAO,EAAA,YAAA;AAAA,MACP,MAAQ,EAAA,QAAA;AAAA,MACR,KAAO,EAAA,OAAA;AAAA,MACP,OAAS,EAAA,GAAA;AAAA,MACT,QAAU,EAAA;AAAA,QACR,MAAQ,EAAA,GAAA;AAAA,QACR,IAAM,EAAA;AAAA,UACJ,MAAQ,EAAA;AAAA,YACN;AAAA,cACE,MAAM,KAAM,CAAA,IAAA;AAAA,cACZ,OAAA,EAAS,MAAM,OAAW,IAAAC,uCAAA;AAAA,aAC5B;AAAA,WACF;AAAA,SACF;AAAA,OACF;AAAA,MACA,MAAA,EAAQ,CAAC,KAAK,CAAA;AAAA,MACd,OAAA,EAAS,uCAAuC,QAAQ,CAAA,UAAA,CAAA;AAAA,KACzD,CAAA,CAAA;AAAA,GACH;AAGA,EAAA,SAAA,CAAU,cAAe,CAAA,QAAA;AAAA,IACvB,sBAAA;AAAA,IACA,OAAO,EAAA,EAAI,GAAK,EAAA,GAAA,EAAuB,IAAS,KAAA;AAC9C,MAAA,MAAM,YAAe,GAAA,sBAAA,CAAA;AACrB,MAAA,MAAM,QAAW,GAAA,wBAAA,CAAA;AAEjB,MAAA,WAAA,CAAY,QAAS,CAAA;AAAA,QACnB,SAAW,EAAA,sBAAA;AAAA,QACX,KAAO,EAAA,OAAA;AAAA,QACP,MAAQ,EAAA,WAAA;AAAA,QACR,KAAO,EAAA,OAAA;AAAA,QACP,OAAS,EAAA,GAAA;AAAA,QACT,OAAA,EAAS,wBAAwB,QAAQ,CAAA,UAAA,CAAA;AAAA,OAC1C,CAAA,CAAA;AAED,MAAI,IAAA;AACF,QAAM,MAAA,MAAA,GAAS,MAAM,SAAA,CAAU,EAAG,CAAA,oBAAA;AAAA,UAChCC,2BAAgB,GAAG,CAAA;AAAA,UACnB,kBAAkB,GAAG,CAAA;AAAA,SACvB,CAAA;AAEA,QAAA,MAAM,YAAY,MAAM,yBAAA;AAAA,UACtB,GAAA;AAAA,UACA,WAAA;AAAA,UACA,QAAA;AAAA,UACA,MAAA;AAAA,SACF,CAAA;AACA,QAAA,GAAA,CAAI,KAAK,SAAS,CAAA,CAAA;AAAA,eACX,KAAO,EAAA;AACd,QAAqB,oBAAA,CAAA,KAAA,EAAO,YAAc,EAAA,QAAA,EAAU,GAAG,CAAA,CAAA;AACvD,QAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,OACZ;AAAA,KACF;AAAA,GACF,CAAA;AAGA,EAAA,SAAA,CAAU,cAAe,CAAA,QAAA;AAAA,IACvB,uBAAA;AAAA,IACA,OAAO,CAAA,EAAG,IAAM,EAAA,GAAA,EAAK,IAAS,KAAA;AAC5B,MAAM,MAAA,UAAA,GAAa,CAAE,CAAA,OAAA,CAAQ,MAAO,CAAA,UAAA,CAAA;AACpC,MAAA,MAAM,YAAe,GAAA,uBAAA,CAAA;AACrB,MAAM,MAAA,QAAA,GAAW,iBAAiB,UAAU,CAAA,OAAA,CAAA,CAAA;AAE5C,MAAA,WAAA,CAAY,QAAS,CAAA;AAAA,QACnB,SAAW,EAAA,YAAA;AAAA,QACX,KAAO,EAAA,OAAA;AAAA,QACP,MAAQ,EAAA,WAAA;AAAA,QACR,KAAO,EAAA,OAAA;AAAA,QACP,OAAS,EAAA,IAAA;AAAA,QACT,OAAA,EAAS,wBAAwB,QAAQ,CAAA,UAAA,CAAA;AAAA,OAC1C,CAAA,CAAA;AAED,MAAA,MAAM,WAAW,MAAM,SAAA;AAAA,QACrB,IAAA;AAAA,QACA;AAAA,UACEvB,gEAAA;AAAA,UACAC,yEAAuC,UAAU,CAAA;AAAA,SACnD;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,OACF,CAAA;AACA,MAAI,IAAA,QAAA,CAAS,MAAW,KAAAF,sCAAA,CAAgB,IAAM,EAAA;AAC5C,QAAwB,uBAAA,CAAA,YAAA,EAAc,UAAU,IAAI,CAAA,CAAA;AAAA,OACtD;AAEA,MAAI,IAAA;AACF,QAAA,MAAM,MAAS,GAAA,MAAM,SAAU,CAAA,EAAA,CAAG,sBAAsB,UAAU,CAAA,CAAA;AAClE,QAAA,GAAA,CAAI,OAAO,GAAG,CAAA,CAAE,YAAY,YAAY,CAAA,CAAE,KAAK,MAAM,CAAA,CAAA;AAAA,eAC9C,KAAO,EAAA;AACd,QAAqB,oBAAA,CAAA,KAAA,EAAO,YAAc,EAAA,QAAA,EAAU,IAAI,CAAA,CAAA;AACxD,QAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,OACZ;AAAA,KACF;AAAA,GACF,CAAA;AAGA,EAAA,SAAA,CAAU,cAAe,CAAA,QAAA;AAAA,IACvB,iBAAA;AAAA,IACA,OAAO,CAAA,EAAG,GAAsB,EAAA,GAAA,EAAuB,IAAS,KAAA;AAC9D,MAAM,MAAA,UAAA,GAAa,CAAE,CAAA,OAAA,CAAQ,MAAO,CAAA,UAAA,CAAA;AACpC,MAAA,MAAM,YAAe,GAAA,iBAAA,CAAA;AACrB,MAAM,MAAA,QAAA,GAAW,iBAAiB,UAAU,CAAA,QAAA,CAAA,CAAA;AAE5C,MAAA,WAAA,CAAY,QAAS,CAAA;AAAA,QACnB,SAAW,EAAA,YAAA;AAAA,QACX,KAAO,EAAA,OAAA;AAAA,QACP,MAAQ,EAAA,WAAA;AAAA,QACR,KAAO,EAAA,OAAA;AAAA,QACP,OAAS,EAAA,GAAA;AAAA,QACT,OAAA,EAAS,wBAAwB,QAAQ,CAAA,UAAA,CAAA;AAAA,OAC1C,CAAA,CAAA;AAED,MAAA,MAAM,WAAW,MAAM,SAAA;AAAA,QACrB,GAAA;AAAA,QACA;AAAA,UACEyB,mEAAA;AAAA,UACAC,4EAA0C,UAAU,CAAA;AAAA,SACtD;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,OACF,CAAA;AACA,MAAI,IAAA,QAAA,CAAS,MAAW,KAAA1B,sCAAA,CAAgB,IAAM,EAAA;AAC5C,QAAwB,uBAAA,CAAA,YAAA,EAAc,UAAU,GAAG,CAAA,CAAA;AAAA,OACrD;AAEA,MAAM,MAAA,WAAA,GAAc,UAAU,EAAG,CAAA,iBAAA;AAAA,QAC/B,CAAE,CAAA,OAAA;AAAA,QACF2B,0DAAA;AAAA,OACF,CAAA;AAEA,MAAA,MAAM,4BAA4B,GAAI,CAAA,IAAA,CAAA;AAEtC,MAAA,OAAO,UAAU,EACd,CAAA,eAAA,CAAgB,2BAA2B,UAAY,EAAA,WAAW,EAClE,IAAK,CAAA,CAAA,MAAA,KAAU,GAAI,CAAA,MAAA,CAAO,GAAG,CAAE,CAAA,IAAA,CAAK,MAAM,CAAC,CAAA,CAC3C,MAAM,CAAS,KAAA,KAAA;AACd,QAAqB,oBAAA,CAAA,KAAA,EAAO,YAAc,EAAA,QAAA,EAAU,GAAG,CAAA,CAAA;AACvD,QAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,OACX,CAAA,CAAA;AAAA,KACL;AAAA,GACF,CAAA;AAGA,EAAA,SAAA,CAAU,cAAe,CAAA,QAAA;AAAA,IACvB,mBAAA;AAAA,IACA,OAAO,CAAA,EAAG,GAAsB,EAAA,GAAA,EAAuB,IAAS,KAAA;AAC9D,MAAM,MAAA,UAAA,GAAa,CAAE,CAAA,OAAA,CAAQ,MAAO,CAAA,UAAA,CAAA;AACpC,MAAM,MAAA,UAAA,GAAa,CAAE,CAAA,OAAA,CAAQ,MAAO,CAAA,UAAA,CAAA;AACpC,MAAA,MAAM,YAAe,GAAA,mBAAA,CAAA;AACrB,MAAA,MAAM,QAAW,GAAA,CAAA,cAAA,EAAiB,UAAU,CAAA,CAAA,EAAI,UAAU,CAAA,UAAA,CAAA,CAAA;AAE1D,MAAA,WAAA,CAAY,QAAS,CAAA;AAAA,QACnB,SAAW,EAAA,YAAA;AAAA,QACX,KAAO,EAAA,OAAA;AAAA,QACP,MAAQ,EAAA,WAAA;AAAA,QACR,KAAO,EAAA,OAAA;AAAA,QACP,OAAS,EAAA,GAAA;AAAA,QACT,OAAA,EAAS,wBAAwB,QAAQ,CAAA,UAAA,CAAA;AAAA,OAC1C,CAAA,CAAA;AAED,MAAA,MAAM,WAAW,MAAM,SAAA;AAAA,QACrB,GAAA;AAAA,QACA;AAAA,UACEF,mEAAA;AAAA,UACAC,4EAA0C,UAAU,CAAA;AAAA,SACtD;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,OACF,CAAA;AACA,MAAI,IAAA,QAAA,CAAS,MAAW,KAAA1B,sCAAA,CAAgB,IAAM,EAAA;AAC5C,QAAwB,uBAAA,CAAA,YAAA,EAAc,UAAU,GAAG,CAAA,CAAA;AAAA,OACrD;AAEA,MAAA,MAAM,UAAU,EACb,CAAA,iBAAA,CAAkB,UAAY,EAAA,UAAU,EACxC,IAAK,CAAA,CAAA,MAAA,KAAU,GAAI,CAAA,MAAA,CAAO,GAAG,CAAE,CAAA,IAAA,CAAK,MAAM,CAAC,CAAA,CAC3C,MAAM,CAAS,KAAA,KAAA;AACd,QAAqB,oBAAA,CAAA,KAAA,EAAO,YAAc,EAAA,QAAA,EAAU,GAAG,CAAA,CAAA;AACvD,QAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,OACX,CAAA,CAAA;AAAA,KACL;AAAA,GACF,CAAA;AAGA,EAAA,SAAA,CAAU,cAAe,CAAA,QAAA;AAAA,IACvB,yBAAA;AAAA,IACA,OAAO,CAAA,EAAG,IAAuB,EAAA,GAAA,EAAuB,IAAS,KAAA;AAC/D,MAAM,MAAA,UAAA,GAAa,CAAE,CAAA,OAAA,CAAQ,MAAO,CAAA,UAAA,CAAA;AACpC,MAAA,MAAM,YAAe,GAAA,yBAAA,CAAA;AACrB,MAAM,MAAA,QAAA,GAAW,iBAAiB,UAAU,CAAA,SAAA,CAAA,CAAA;AAE5C,MAAA,WAAA,CAAY,QAAS,CAAA;AAAA,QACnB,SAAW,EAAA,YAAA;AAAA,QACX,KAAO,EAAA,OAAA;AAAA,QACP,MAAQ,EAAA,WAAA;AAAA,QACR,KAAO,EAAA,OAAA;AAAA,QACP,OAAS,EAAA,IAAA;AAAA,QACT,OAAA,EAAS,wBAAwB,QAAQ,CAAA,UAAA,CAAA;AAAA,OAC1C,CAAA,CAAA;AAED,MAAA,MAAM,WAAW,MAAM,SAAA;AAAA,QACrB,IAAA;AAAA,QACA;AAAA,UACEC,gEAAA;AAAA,UACAC,yEAAuC,UAAU,CAAA;AAAA,SACnD;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,OACF,CAAA;AACA,MAAI,IAAA,QAAA,CAAS,MAAW,KAAAF,sCAAA,CAAgB,IAAM,EAAA;AAC5C,QAAwB,uBAAA,CAAA,YAAA,EAAc,UAAU,IAAI,CAAA,CAAA;AAAA,OACtD;AAEA,MAAA,OAAO,SAAU,CAAA,EAAA,CACd,uBAAwB,CAAA,UAAU,CAClC,CAAA,IAAA,CAAK,CAAU,MAAA,KAAA,GAAA,CAAI,IAAK,CAAA,MAAM,CAAC,CAAA,CAC/B,MAAM,CAAS,KAAA,KAAA;AACd,QAAqB,oBAAA,CAAA,KAAA,EAAO,YAAc,EAAA,QAAA,EAAU,IAAI,CAAA,CAAA;AACxD,QAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,OACX,CAAA,CAAA;AAAA,KACL;AAAA,GACF,CAAA;AAGA,EAAA,SAAA,CAAU,cAAe,CAAA,QAAA;AAAA,IACvB,qBAAA;AAAA,IACA,OAAO,EAAA,EAAI,IAAuB,EAAA,GAAA,EAAuB,IAAS,KAAA;AAChE,MAAA,MAAM,YAAe,GAAA,qBAAA,CAAA;AACrB,MAAA,MAAM,QAAW,GAAA,kCAAA,CAAA;AAEjB,MAAA,WAAA,CAAY,QAAS,CAAA;AAAA,QACnB,SAAW,EAAA,YAAA;AAAA,QACX,KAAO,EAAA,OAAA;AAAA,QACP,MAAQ,EAAA,WAAA;AAAA,QACR,KAAO,EAAA,OAAA;AAAA,QACP,OAAS,EAAA,IAAA;AAAA,QACT,OAAA,EAAS,wBAAwB,QAAQ,CAAA,UAAA,CAAA;AAAA,OAC1C,CAAA,CAAA;AAGD,MAAA,OAAO,SAAU,CAAA,EAAA,CACd,mBAAoB,EAAA,CACpB,KAAK,CAAU,MAAA,KAAA,GAAA,CAAI,MAAO,CAAA,GAAG,EAAE,IAAK,CAAA,MAAM,CAAC,CAAA,CAC3C,MAAM,CAAS,KAAA,KAAA;AACd,QAAqB,oBAAA,CAAA,KAAA,EAAO,YAAc,EAAA,QAAA,EAAU,IAAI,CAAA,CAAA;AACxD,QAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,OACX,CAAA,CAAA;AAAA,KACL;AAAA,GACF,CAAA;AAGA,EAAA,SAAA,CAAU,cAAe,CAAA,QAAA;AAAA,IACvB,4BAAA;AAAA,IACA,OAAO,CAAA,EAAG,GAAsB,EAAA,GAAA,EAAuB,IAAS,KAAA;AAC9D,MAAM,MAAA,UAAA,GAAa,CAAE,CAAA,OAAA,CAAQ,MAAO,CAAA,UAAA,CAAA;AACpC,MAAM,MAAA,UAAA,GAAa,CAAE,CAAA,OAAA,CAAQ,KAAM,CAAA,UAAA,CAAA;AACnC,MAAA,MAAM,YAAe,GAAA,4BAAA,CAAA;AACrB,MAAM,MAAA,QAAA,GAAW,iBAAiB,UAAU,CAAA,YAAA,CAAA,CAAA;AAC5C,MAAI,IAAA;AACF,QAAA,WAAA,CAAY,QAAS,CAAA;AAAA,UACnB,SAAW,EAAA,YAAA;AAAA,UACX,KAAO,EAAA,OAAA;AAAA,UACP,MAAQ,EAAA,WAAA;AAAA,UACR,KAAO,EAAA,OAAA;AAAA,UACP,OAAS,EAAA,GAAA;AAAA,UACT,OAAA,EAAS,wBAAwB,QAAQ,CAAA,UAAA,CAAA;AAAA,SAC1C,CAAA,CAAA;AACD,QAAA,MAAM,WAAW,MAAM,SAAA;AAAA,UACrB,GAAA;AAAA,UACA;AAAA,YACEC,gEAAA;AAAA,YACAC,yEAAuC,UAAU,CAAA;AAAA,WACnD;AAAA,UACA,WAAA;AAAA,UACA,QAAA;AAAA,SACF,CAAA;AACA,QAAI,IAAA,QAAA,CAAS,MAAW,KAAAF,sCAAA,CAAgB,IAAM,EAAA;AAC5C,UAAwB,uBAAA,CAAA,YAAA,EAAc,UAAU,GAAG,CAAA,CAAA;AAAA,SACrD;AAEA,QAAA,MAAM,kBACJ,GAAA,MAAM,QAAS,CAAA,mBAAA,CAAoB,iBAAkB,CAAA;AAAA,UACnD,YAAc,EAAA,UAAA;AAAA,UACd,YAAc,EAAA,OAAA;AAAA,SACf,CAAA,CAAA;AAEH,QAAA,IAAI,CAAC,kBAAoB,EAAA;AACvB,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,8CAA8C,UAAU,CAAA,CAAA;AAAA,WAC1D,CAAA;AAAA,SACF;AACA,QAAA,MAAM,aAAa,kBAAmB,CAAA,UAAA,CAAA;AACtC,QAAA,IAAI,CAAC,UAAY,EAAA;AACf,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,2CAA2C,UAAU,CAAA,CAAA;AAAA,WACvD,CAAA;AAAA,SACF;AAEA,QAAA,MAAM,UACJ,GAAA,MAAM,QAAS,CAAA,mBAAA,CAAoB,uBAAwB,CAAA;AAAA,UACzD,YAAc,EAAA,UAAA;AAAA,UACd,YAAc,EAAA,OAAA;AAAA,SACf,CAAA,CAAA;AAEH,QAAA,IAAI,CAAC,UAAY,EAAA;AACf,UAAA,MAAM,IAAI,KAAA;AAAA,YACR,gEAAA;AAAA,WACF,CAAA;AAAA,SACF;AAEA,QAAI,IAAA,CAAC,WAAW,eAAiB,EAAA;AAC/B,UAAA,GAAA,CAAI,MAAO,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,EAAE,CAAA,CAAA;AACvB,UAAA,OAAA;AAAA,SACF;AAEA,QAAA,MAAM,iBAAoB,GAAA,UAAA,GACtB,MAAM,QAAA,CAAS,oBAAoB,sBAAuB,CAAA;AAAA,UACxD,UAAA;AAAA,UACA,YAAc,EAAA,OAAA;AAAA,SACf,CACD,GAAA,KAAA,CAAA,CAAA;AAEJ,QAAM,MAAA,YAAA,GAAe,iBACjB,GAAA,QAAA,CAAS,sBAAuB,CAAA,mBAAA;AAAA,UAC9B,iBAAA;AAAA,SAEF,GAAA,KAAA,CAAA,CAAA;AAEJ,QAAM,MAAA,YAAA,GAAe,MAAM,SAAA,CAAU,EAClC,CAAA,0BAAA,CAA2B,YAAY,UAAU,CAAA,CACjD,KAAM,CAAA,CAAC,KAA+B,KAAA;AACrC,UAAqB,oBAAA,CAAA,KAAA,EAAO,YAAc,EAAA,QAAA,EAAU,GAAG,CAAA,CAAA;AACvD,UAAI,GAAA,CAAA,MAAA,CAAO,GAAG,CAAA,CAAE,IAAK,CAAA;AAAA,YACnB,OAAA,EAAS,MAAM,OAAW,IAAAuB,uCAAA;AAAA,WAC3B,CAAA,CAAA;AAAA,SACF,CAAA,CAAA;AAEH,QACE,IAAA,CAAC,gBACD,CAAC,YAAA,CAAa,eACd,CAAC,YAAA,CAAa,YAAY,UAC1B,EAAA;AACA,UAAA,GAAA,CAAI,MAAO,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,EAAE,CAAA,CAAA;AACvB,UAAA,OAAA;AAAA,SACF;AAEA,QAAM,MAAA,gBAAA,GAAmB,aAAa,WAAY,CAAA,UAAA,CAAA;AAClD,QAAI,IAAA,SAAA,CAAA;AAEJ,QAAA,IAAI,YAAc,EAAA;AAChB,UAAA,SAAA,GAAY,MAAO,CAAA,IAAA,CAAK,gBAAgB,CAAA,CACrC,MAAO,CAAA,CAAA,CAAA,KAAK,CAAK,IAAA,YAAY,CAC7B,CAAA,MAAA,CAAO,CAAC,MAAA,EAAQ,CAAM,KAAA;AACrB,YAAI,IAAA,CAAC,YAAa,CAAA,CAAC,CAAG,EAAA;AACpB,cAAO,OAAA,MAAA,CAAA;AAAA,aACT;AACA,YAAO,MAAA,CAAA,CAAC,CAAI,GAAA,YAAA,CAAa,CAAC,CAAA,CAAA;AAC1B,YAAO,OAAA,MAAA,CAAA;AAAA,WACT,EAAG,EAAgB,CAAA,CAAA;AAAA,SACvB;AAEA,QAAI,GAAA,CAAA,MAAA,CAAO,GAAG,CAAA,CAAE,IAAK,CAAA;AAAA,UACnB,aAAa,YAAa,CAAA,WAAA;AAAA,UAC1B,IAAM,EAAA,SAAA;AAAA,SACP,CAAA,CAAA;AAAA,eACM,GAAK,EAAA;AACZ,QAAqB,oBAAA,CAAA,GAAA,EAAK,YAAc,EAAA,QAAA,EAAU,GAAG,CAAA,CAAA;AACrD,QAAA,IAAA,CAAK,GAAG,CAAA,CAAA;AAAA,OACV;AAAA,KACF;AAAA,GACF,CAAA;AAGA,EAAA,SAAA,CAAU,cAAe,CAAA,QAAA;AAAA,IACvB,sBAAA;AAAA,IACA,OAAO,CAAA,EAAG,GAAsB,EAAA,GAAA,EAAuB,IAAS,KAAA;AAC9D,MAAA,MAAM,YAAe,GAAA,sBAAA,CAAA;AACrB,MAAM,MAAA,UAAA,GAAa,CAAE,CAAA,OAAA,CAAQ,MAAO,CAAA,UAAA,CAAA;AACpC,MAAM,MAAA,QAAA,GAAW,iBAAiB,UAAU,CAAA,UAAA,CAAA,CAAA;AAE5C,MAAA,WAAA,CAAY,QAAS,CAAA;AAAA,QACnB,SAAW,EAAA,YAAA;AAAA,QACX,KAAO,EAAA,OAAA;AAAA,QACP,MAAQ,EAAA,WAAA;AAAA,QACR,KAAO,EAAA,OAAA;AAAA,QACP,OAAS,EAAA,GAAA;AAAA,QACT,OAAA,EAAS,wBAAwB,QAAQ,CAAA,UAAA,CAAA;AAAA,OAC1C,CAAA,CAAA;AAED,MAAA,MAAM,WAAW,MAAM,SAAA;AAAA,QACrB,GAAA;AAAA,QACA;AAAA,UACEtB,gEAAA;AAAA,UACAC,yEAAuC,UAAU,CAAA;AAAA,SACnD;AAAA,QACA,WAAA;AAAA,QACA,QAAA;AAAA,OACF,CAAA;AACA,MAAI,IAAA,QAAA,CAAS,MAAW,KAAAF,sCAAA,CAAgB,IAAM,EAAA;AAC5C,QAAwB,uBAAA,CAAA,YAAA,EAAc,UAAU,GAAG,CAAA,CAAA;AAAA,OACrD;AACA,MAAO,OAAA,SAAA,CAAU,GACd,YAAa,CAAAwB,0BAAA,CAAgB,GAAG,CAAG,EAAA,iBAAA,CAAkB,GAAG,CAAG,EAAA;AAAA,QAC1D,UAAA;AAAA,OACD,CACA,CAAA,IAAA,CAAK,CAAU,MAAA,KAAA,GAAA,CAAI,KAAK,MAAM,CAAC,CAC/B,CAAA,KAAA,CAAM,CAAS,KAAA,KAAA;AACd,QAAqB,oBAAA,CAAA,KAAA,EAAO,YAAc,EAAA,QAAA,EAAU,GAAG,CAAA,CAAA;AACvD,QAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,OACX,CAAA,CAAA;AAAA,KACL;AAAA,GACF,CAAA;AAGA,EAAA,SAAA,CAAU,cAAe,CAAA,QAAA;AAAA,IACvB,cAAA;AAAA,IACA,OAAO,EAAA,EAAI,GAAsB,EAAA,GAAA,EAAuB,IAAS,KAAA;AAC/D,MAAA,MAAM,YAAe,GAAA,cAAA,CAAA;AACrB,MAAA,MAAM,QAAW,GAAA,CAAA,uBAAA,CAAA,CAAA;AAEjB,MAAA,WAAA,CAAY,QAAS,CAAA;AAAA,QACnB,SAAW,EAAA,YAAA;AAAA,QACX,KAAO,EAAA,OAAA;AAAA,QACP,MAAQ,EAAA,WAAA;AAAA,QACR,KAAO,EAAA,OAAA;AAAA,QACP,OAAS,EAAA,GAAA;AAAA,QACT,OAAA,EAAS,wBAAwB,QAAQ,CAAA,UAAA,CAAA;AAAA,OAC1C,CAAA,CAAA;AAED,MAAI,IAAA;AAEF,QAAM,MAAA,cAAA,GAAiB,SAAU,CAAA,EAAA,CAAG,cAAe,EAAA,CAAA;AACnD,QAAA,MAAM,wBACJ,MAAM,2BAAA;AAAA,UACJ,GAAA;AAAA,UACA,WAAA;AAAA,UACA,QAAA;AAAA,UACA,cAAA;AAAA,SACF,CAAA;AAEF,QAAM,MAAA,MAAA,GAAS,MAAM,SAAA,CAAU,EAAG,CAAA,YAAA;AAAA,UAChCA,2BAAgB,GAAG,CAAA;AAAA,UACnB,kBAAkB,GAAG,CAAA;AAAA,UACrB,qBAAA;AAAA,SACF,CAAA;AAEA,QAAA,GAAA,CAAI,KAAK,MAAM,CAAA,CAAA;AAAA,eACR,KAAO,EAAA;AACd,QAAqB,oBAAA,CAAA,KAAA,EAAO,YAAc,EAAA,QAAA,EAAU,GAAG,CAAA,CAAA;AACvD,QAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,OACZ;AAAA,KACF;AAAA,GACF,CAAA;AAGA,EAAA,SAAA,CAAU,cAAe,CAAA,QAAA;AAAA,IACvB,iBAAA;AAAA,IACA,OAAO,CAAA,EAAG,IAAuB,EAAA,GAAA,EAAuB,IAAS,KAAA;AAC/D,MAAM,MAAA,UAAA,GAAa,CAAE,CAAA,OAAA,CAAQ,MAAO,CAAA,UAAA,CAAA;AACpC,MAAA,MAAM,YAAe,GAAA,iBAAA,CAAA;AACrB,MAAM,MAAA,QAAA,GAAW,2BAA2B,UAAU,CAAA,CAAA,CAAA;AAEtD,MAAA,WAAA,CAAY,QAAS,CAAA;AAAA,QACnB,SAAW,EAAA,YAAA;AAAA,QACX,KAAO,EAAA,OAAA;AAAA,QACP,MAAQ,EAAA,WAAA;AAAA,QACR,KAAO,EAAA,OAAA;AAAA,QACP,OAAS,EAAA,IAAA;AAAA,QACT,OAAA,EAAS,wBAAwB,QAAQ,CAAA,UAAA,CAAA;AAAA,OAC1C,CAAA,CAAA;AAED,MAAM,MAAA,iBAAA,GAAoB,UAAU,EAAG,CAAA,iBAAA;AAAA,QACrC,CAAE,CAAA,OAAA;AAAA,QACFI,gEAAA;AAAA,OACF,CAAA;AAEA,MAAI,IAAA;AACF,QAAM,MAAA,gBAAA,GAAmB,MAAM,SAAA,CAAU,EAAG,CAAA,eAAA;AAAA,UAC1C,UAAA;AAAA,UACA,CAAC,CAAC,iBAAA;AAAA,SACJ,CAAA;AAEA,QAAM,MAAA,UAAA,GAAa,iBAAiB,QAAS,CAAA,SAAA,CAAA;AAE7C,QAAA,MAAM,WAAW,MAAM,SAAA;AAAA,UACrB,IAAA;AAAA,UACA;AAAA,YACE3B,gEAAA;AAAA,YACAC,yEAAuC,UAAU,CAAA;AAAA,WACnD;AAAA,UACA,WAAA;AAAA,UACA,QAAA;AAAA,SACF,CAAA;AACA,QAAI,IAAA,QAAA,CAAS,MAAW,KAAAF,sCAAA,CAAgB,IAAM,EAAA;AAC5C,UAAwB,uBAAA,CAAA,YAAA,EAAc,UAAU,IAAI,CAAA,CAAA;AAAA,SACtD;AAEA,QAAA,GAAA,CAAI,MAAO,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,gBAAgB,CAAA,CAAA;AAAA,eAC9B,KAAO,EAAA;AACd,QAAqB,oBAAA,CAAA,KAAA,EAAO,YAAc,EAAA,QAAA,EAAU,IAAI,CAAA,CAAA;AACxD,QAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,OACZ;AAAA,KACF;AAAA,GACF,CAAA;AAGA,EAAA,SAAA,CAAU,cAAe,CAAA,QAAA;AAAA,IACvB,eAAA;AAAA,IACA,OAAO,CAAA,EAAG,IAAM,EAAA,GAAA,EAAK,IAAS,KAAA;AAC5B,MAAM,MAAA,UAAA,GAAa,CAAE,CAAA,OAAA,CAAQ,MAAO,CAAA,UAAA,CAAA;AACpC,MAAA,MAAM,YAAe,GAAA,eAAA,CAAA;AACrB,MAAM,MAAA,QAAA,GAAW,2BAA2B,UAAU,CAAA,MAAA,CAAA,CAAA;AAEtD,MAAA,WAAA,CAAY,QAAS,CAAA;AAAA,QACnB,SAAW,EAAA,YAAA;AAAA,QACX,KAAO,EAAA,OAAA;AAAA,QACP,MAAQ,EAAA,WAAA;AAAA,QACR,KAAO,EAAA,OAAA;AAAA,QACP,OAAS,EAAA,IAAA;AAAA,QACT,OAAA,EAAS,wBAAwB,QAAQ,CAAA,UAAA,CAAA;AAAA,OAC1C,CAAA,CAAA;AAED,MAAI,IAAA;AACF,QAAA,MAAM,gBAAmB,GAAA,MAAM,SAAU,CAAA,EAAA,CAAG,gBAAgB,UAAU,CAAA,CAAA;AACtE,QAAM,MAAA,UAAA,GAAa,iBAAiB,QAAS,CAAA,SAAA,CAAA;AAE7C,QAAA,MAAM,WAAW,MAAM,SAAA;AAAA,UACrB,IAAA;AAAA,UACA;AAAA,YACEyB,mEAAA;AAAA,YACAC,4EAA0C,UAAU,CAAA;AAAA,WACtD;AAAA,UACA,WAAA;AAAA,UACA,QAAA;AAAA,SACF,CAAA;AACA,QAAI,IAAA,QAAA,CAAS,MAAW,KAAA1B,sCAAA,CAAgB,IAAM,EAAA;AAC5C,UAAwB,uBAAA,CAAA,YAAA,EAAc,UAAU,IAAI,CAAA,CAAA;AAAA,SACtD;AAEA,QAAA,MAAM,MAAS,GAAA,MAAM,SAAU,CAAA,EAAA,CAAG,cAAc,UAAU,CAAA,CAAA;AAC1D,QAAA,GAAA,CAAI,MAAO,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,eACpB,KAAO,EAAA;AACd,QAAqB,oBAAA,CAAA,KAAA,EAAO,YAAc,EAAA,QAAA,EAAU,IAAI,CAAA,CAAA;AACxD,QAAA,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,OACZ;AAAA,KACF;AAAA,GACF,CAAA;AACF,CAAA;AAKA,SAAS,mBACP,CAAA,MAAA,EACA,SACA,EAAA,iBAAA,EACA,WACA,EAAA;AACA,EAAA,MAAA,CAAO,GAAI,CAAA,UAAA,EAAY,OAAO,GAAA,EAAK,GAAQ,KAAA;AACzC,IAAA,WAAA,CAAY,QAAS,CAAA;AAAA,MACnB,SAAW,EAAA,oBAAA;AAAA,MACX,KAAO,EAAA,OAAA;AAAA,MACP,MAAQ,EAAA,WAAA;AAAA,MACR,KAAO,EAAA,OAAA;AAAA,MACP,OAAS,EAAA,GAAA;AAAA,MACT,OAAS,EAAA,CAAA,uCAAA,CAAA;AAAA,KACV,CAAA,CAAA;AACD,IAAA,MAAM,aAAgB,GAAA,MAAM,SAAU,CAAA,UAAA,CAAW,YAAY,CAAA,CAAA;AAC7D,IAAA,MAAM,QAAW,GAAA,MAAM,KAAM,CAAA,CAAA,EAAG,aAAa,CAAa,WAAA,CAAA,CAAA,CAAA;AAC1D,IAAM,MAAA,IAAA,GAAO,MAAM,QAAA,CAAS,IAAK,EAAA,CAAA;AACjC,IAAA,GAAA,CAAI,MAAO,CAAA,QAAA,CAAS,MAAM,CAAA,CAAE,KAAK,IAAI,CAAA,CAAA;AAAA,GACtC,CAAA,CAAA;AAED,EAAA,MAAA,CAAO,IAAK,CAAA,oBAAA,EAAsB,OAAO,GAAA,EAAK,GAAQ,KAAA;AACpD,IAAM,MAAA,EAAE,QAAS,EAAA,GAAI,GAAI,CAAA,MAAA,CAAA;AACzB,IAAA,WAAA,CAAY,QAAS,CAAA;AAAA,MACnB,SAAW,EAAA,4BAAA;AAAA,MACX,KAAO,EAAA,OAAA;AAAA,MACP,MAAQ,EAAA,WAAA;AAAA,MACR,KAAO,EAAA,OAAA;AAAA,MACP,OAAS,EAAA,GAAA;AAAA,MACT,OAAA,EAAS,iCAAiC,QAAQ,CAAA,UAAA,CAAA;AAAA,KACnD,CAAA,CAAA;AACD,IAAM,MAAA,UAAA,GAAiC,GAAI,CAAA,MAAA,CAAO,sBAAsB,CAAA,CAAA;AACxE,IAAM,MAAA,IAAA,GAAoB,MAAM,GAAI,CAAA,IAAA,CAAA;AAEpC,IAAA,MAAM,eAAe,MAAO,CAAA,WAAA;AAAA,MAC1B,MAAA,CAAO,OAAQ,CAAA,IAAI,CAAE,CAAA,MAAA;AAAA,QACnB,CAAC,GAAG,KAAK,CAAM,KAAA,KAAA,KAAU,UAAa,KAAU,KAAA,IAAA;AAAA,OAClD;AAAA,KACF,CAAA;AAEA,IAAM,MAAA,MAAA,GAAoB,MAAM,iBAAA,CAAkB,aAAc,CAAA;AAAA,MAC9D,QAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAO,EAAA,YAAA;AAAA,KACR,CAAA,CAAA;AACD,IAAA,GAAA,CAAI,MAAO,CAAA,GAAG,CAAE,CAAA,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,GAC5B,CAAA,CAAA;AACH,CAAA;AAEA,SAAS,kBAAkB,GAAsC,EAAA;AAC/D,EAAA,OAAO,GAAI,CAAA,IAAA,CAAK,OAAW,GAAA,GAAA,CAAI,KAAK,OAAqB,GAAA,KAAA,CAAA,CAAA;AAC3D;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@red-hat-developer-hub/backstage-plugin-orchestrator-backend",
3
- "version": "5.0.1",
3
+ "version": "5.1.0",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.cjs.js",
6
6
  "types": "./dist/index.d.ts",
@@ -75,7 +75,7 @@
75
75
  "@backstage/plugin-permission-node": "^0.8.4",
76
76
  "@backstage/plugin-scaffolder-backend": "^1.26.2",
77
77
  "@backstage/plugin-scaffolder-node": "^0.5.0",
78
- "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "^1.24.3",
78
+ "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "^1.25.0",
79
79
  "@urql/core": "^4.1.4",
80
80
  "ajv-formats": "^2.1.1",
81
81
  "cloudevents": "^8.0.0",
@@ -83,7 +83,6 @@
83
83
  "express-promise-router": "^4.1.1",
84
84
  "fs-extra": "^10.1.0",
85
85
  "isomorphic-git": "^1.23.0",
86
- "json-schema": "^0.4.0",
87
86
  "moment": "^2.29.4",
88
87
  "openapi-backend": "^5.10.5",
89
88
  "yn": "^5.0.0"