@red-hat-developer-hub/backstage-plugin-orchestrator-backend 6.0.3 → 6.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,17 @@
1
1
  ### Dependencies
2
2
 
3
+ ## 6.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 53f3ffb: implemented authorization widget for enabling specifying the required auth providers in the schema so the UI can pick it up from there and forward to workflow execution
8
+
9
+ ### Patch Changes
10
+
11
+ - d68d693: Updated dependency `@types/express` to `4.17.23`.
12
+ - Updated dependencies [53f3ffb]
13
+ - @red-hat-developer-hub/backstage-plugin-orchestrator-common@1.28.0
14
+
3
15
  ## 6.0.3
4
16
 
5
17
  ### Patch Changes
@@ -1,7 +1,12 @@
1
1
  'use strict';
2
2
 
3
+ var capitalize = require('lodash/capitalize');
3
4
  var backstagePluginOrchestratorCommon = require('@red-hat-developer-hub/backstage-plugin-orchestrator-common');
4
5
 
6
+ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
7
+
8
+ var capitalize__default = /*#__PURE__*/_interopDefaultCompat(capitalize);
9
+
5
10
  class SonataFlowService {
6
11
  constructor(dataIndexService, logger) {
7
12
  this.dataIndexService = dataIndexService;
@@ -52,7 +57,7 @@ class SonataFlowService {
52
57
  if (args.authTokens && Array.isArray(args.authTokens)) {
53
58
  args.authTokens.forEach((tokenObj) => {
54
59
  if (tokenObj.provider && tokenObj.token) {
55
- const headerKey = `X-Authorization-${tokenObj.provider}`;
60
+ const headerKey = `X-${capitalize__default.default(tokenObj.provider)}-Authorization`;
56
61
  headers[headerKey] = String(tokenObj.token);
57
62
  }
58
63
  });
@@ -1 +1 @@
1
- {"version":3,"file":"SonataFlowService.cjs.js","sources":["../../src/service/SonataFlowService.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nimport {\n AuthToken,\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 const jsonResponse = await this.handleWorkflowServiceResponse(\n 'Get workflow info',\n args.definitionId,\n urlToFetch,\n response,\n 'GET',\n );\n this.logger.debug(\n `Fetch workflow info result: ${JSON.stringify(jsonResponse)}`,\n );\n return jsonResponse;\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 authTokens?: Array<AuthToken>;\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 const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add X-Authentication headers from authTokens\n if (args.authTokens && Array.isArray(args.authTokens)) {\n args.authTokens.forEach(tokenObj => {\n if (tokenObj.provider && tokenObj.token) {\n const headerKey = `X-Authorization-${tokenObj.provider}`;\n headers[headerKey] = String(tokenObj.token); // Ensure token is a string\n }\n });\n } else {\n this.logger.debug(\n 'No authTokens provided or authTokens is not an array.',\n );\n }\n\n const response = await fetch(urlToFetch, {\n method: 'POST',\n body: JSON.stringify(args.inputData || {}),\n headers,\n });\n\n const json = await this.handleWorkflowServiceResponse(\n 'Execute',\n args.definitionId,\n urlToFetch,\n response,\n 'POST',\n );\n if (json.id) {\n this.logger.debug(\n `Execute workflow successful. Response: ${JSON.stringify(json)}`,\n );\n return json;\n }\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 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 await this.handleWorkflowServiceResponse(\n 'Retrigger',\n args.definitionId,\n urlToFetch,\n response,\n 'POST',\n );\n\n return true;\n }\n\n public async abortInstance(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n }): Promise<void> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}/instances/${args.instanceId}`;\n\n const response = await fetch(urlToFetch, {\n method: 'DELETE',\n });\n\n await this.handleWorkflowServiceResponse(\n 'Abort',\n args.definitionId,\n urlToFetch,\n response,\n 'DELETE',\n );\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 private async handleWorkflowServiceResponse(\n operation: 'Abort' | 'Execute' | 'Retrigger' | 'Get workflow info',\n workflowId: string,\n serviceUrl: string,\n response: Response,\n httpMethod: Request['method'],\n ): Promise<any> {\n const logErrorPrefix = `Error during operation '${operation}' on workflow ${workflowId} with service URL ${serviceUrl}`;\n\n const errorLines: string[] = [];\n errorLines.push(`HTTP ${httpMethod} request to ${serviceUrl} failed.`);\n errorLines.push(`Status Code: ${response.status}`);\n if (response.statusText) {\n errorLines.push(`Status Text: ${response.statusText}`);\n }\n try {\n const jsonResponse = await response.json();\n if ((jsonResponse.id && operation === 'Execute') || response.ok) {\n // Treat as successful from the UI perspective.\n // This allows navigation to the instance page even if the workflow execution\n // fails immediately after initiation. The presence of an instance id or a successful\n // 'ok' status indicates the initiation was successful.\n return jsonResponse;\n }\n if (jsonResponse?.message) {\n errorLines.push(`Message: ${jsonResponse.message}`);\n }\n if (jsonResponse?.details) {\n errorLines.push(`Details: ${jsonResponse.details}`);\n }\n if (jsonResponse?.stack) {\n errorLines.push(`Stack Trace: ${jsonResponse.stack}`);\n }\n if (jsonResponse?.failedNodeId) {\n errorLines.push(`Failed Node ID: ${jsonResponse.failedNodeId}`);\n }\n this.logger.error(`${logErrorPrefix}: ${JSON.stringify(jsonResponse)}`);\n } catch (jsonParseError) {\n this.logger.error(\n `${logErrorPrefix}. The details of this error cannot be provided because the response body was not in a parsable format.`,\n );\n }\n throw new Error(errorLines.join('\\n'));\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 Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoggerService } from '@backstage/backend-plugin-api';\n\nimport capitalize from 'lodash/capitalize';\n\nimport {\n AuthToken,\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 const jsonResponse = await this.handleWorkflowServiceResponse(\n 'Get workflow info',\n args.definitionId,\n urlToFetch,\n response,\n 'GET',\n );\n this.logger.debug(\n `Fetch workflow info result: ${JSON.stringify(jsonResponse)}`,\n );\n return jsonResponse;\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 authTokens?: Array<AuthToken>;\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 const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add X-Authentication headers from authTokens\n if (args.authTokens && Array.isArray(args.authTokens)) {\n args.authTokens.forEach(tokenObj => {\n if (tokenObj.provider && tokenObj.token) {\n const headerKey = `X-${capitalize(tokenObj.provider)}-Authorization`;\n headers[headerKey] = String(tokenObj.token); // Ensure token is a string\n }\n });\n } else {\n this.logger.debug(\n 'No authTokens provided or authTokens is not an array.',\n );\n }\n\n const response = await fetch(urlToFetch, {\n method: 'POST',\n body: JSON.stringify(args.inputData || {}),\n headers,\n });\n\n const json = await this.handleWorkflowServiceResponse(\n 'Execute',\n args.definitionId,\n urlToFetch,\n response,\n 'POST',\n );\n if (json.id) {\n this.logger.debug(\n `Execute workflow successful. Response: ${JSON.stringify(json)}`,\n );\n return json;\n }\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 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 await this.handleWorkflowServiceResponse(\n 'Retrigger',\n args.definitionId,\n urlToFetch,\n response,\n 'POST',\n );\n\n return true;\n }\n\n public async abortInstance(args: {\n definitionId: string;\n instanceId: string;\n serviceUrl: string;\n }): Promise<void> {\n const urlToFetch = `${args.serviceUrl}/management/processes/${args.definitionId}/instances/${args.instanceId}`;\n\n const response = await fetch(urlToFetch, {\n method: 'DELETE',\n });\n\n await this.handleWorkflowServiceResponse(\n 'Abort',\n args.definitionId,\n urlToFetch,\n response,\n 'DELETE',\n );\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 private async handleWorkflowServiceResponse(\n operation: 'Abort' | 'Execute' | 'Retrigger' | 'Get workflow info',\n workflowId: string,\n serviceUrl: string,\n response: Response,\n httpMethod: Request['method'],\n ): Promise<any> {\n const logErrorPrefix = `Error during operation '${operation}' on workflow ${workflowId} with service URL ${serviceUrl}`;\n\n const errorLines: string[] = [];\n errorLines.push(`HTTP ${httpMethod} request to ${serviceUrl} failed.`);\n errorLines.push(`Status Code: ${response.status}`);\n if (response.statusText) {\n errorLines.push(`Status Text: ${response.statusText}`);\n }\n try {\n const jsonResponse = await response.json();\n if ((jsonResponse.id && operation === 'Execute') || response.ok) {\n // Treat as successful from the UI perspective.\n // This allows navigation to the instance page even if the workflow execution\n // fails immediately after initiation. The presence of an instance id or a successful\n // 'ok' status indicates the initiation was successful.\n return jsonResponse;\n }\n if (jsonResponse?.message) {\n errorLines.push(`Message: ${jsonResponse.message}`);\n }\n if (jsonResponse?.details) {\n errorLines.push(`Details: ${jsonResponse.details}`);\n }\n if (jsonResponse?.stack) {\n errorLines.push(`Stack Trace: ${jsonResponse.stack}`);\n }\n if (jsonResponse?.failedNodeId) {\n errorLines.push(`Failed Node ID: ${jsonResponse.failedNodeId}`);\n }\n this.logger.error(`${logErrorPrefix}: ${JSON.stringify(jsonResponse)}`);\n } catch (jsonParseError) {\n this.logger.error(\n `${logErrorPrefix}. The details of this error cannot be provided because the response body was not in a parsable format.`,\n );\n }\n throw new Error(errorLines.join('\\n'));\n }\n}\n"],"names":["fromWorkflowSource","capitalize","extractWorkflowFormat","getWorkflowCategory"],"mappings":"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"}
@@ -147,7 +147,7 @@ async function createBackendRouter(options) {
147
147
  });
148
148
  });
149
149
  const middleware = rootHttpRouter.MiddlewareFactory.create({ logger, config });
150
- router.use(middleware.error());
150
+ router.use(middleware.error({ logAllErrors: true }));
151
151
  return router;
152
152
  }
153
153
  function initPublicServices(logger, config, scheduler) {
@@ -185,7 +185,7 @@ async function initRouterApi(orchestratorService) {
185
185
  },
186
186
  handlers: {
187
187
  validationFail: async (c, _req, res) => {
188
- console.log("validationFail", c.operation);
188
+ console.log("OPENAPI validationFail", c.operation);
189
189
  res.status(400).json({ err: c.validation.errors });
190
190
  },
191
191
  notFound: async (_c, req, res) => {
@@ -1 +1 @@
1
- {"version":3,"file":"router.cjs.js","sources":["../../src/service/router.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport {\n AuditorService,\n AuditorServiceEvent,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n SchedulerService,\n UserInfoService,\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 { 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 FieldFilter,\n Filter,\n NestedFilter,\n openApiDocument,\n orchestratorInstanceAdminViewPermission,\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 { RouterOptions } from '../routerWrapper';\nimport { buildPagination } from '../types/pagination';\nimport { V2 } from './api/v2';\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 isUserAuthorizedForInstanceAdminViewPermission = async (\n request: HttpRequest,\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n): Promise<boolean> => {\n const credentials = await httpAuth.credentials(request);\n const [decision] = await permissionsSvc.authorize(\n [{ permission: orchestratorInstanceAdminViewPermission }],\n { credentials },\n );\n\n return decision.result === AuthorizeResult.ALLOW;\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 auditor,\n discovery,\n catalogApi,\n urlReader,\n scheduler,\n permissions,\n httpAuth,\n userInfo,\n } = options;\n const publicServices = initPublicServices(logger, config, scheduler);\n\n const routerApi = await initRouterApi(publicServices.orchestratorService);\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.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 auditor,\n userInfo,\n );\n setupExternalRoutes(router, discovery, scaffolderService, auditor);\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 auditor\n .createEvent({\n eventId: 'generic-error-handler',\n request: req,\n // Keep at high since this is a fallback - any error should be caught in handlers\n severityLevel: 'high',\n meta: {},\n })\n .then(event => {\n event.fail({\n meta: {},\n error,\n });\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 auditor: AuditorService,\n userInfo: UserInfoService,\n) {\n function manageDenyAuthorization(auditEvent: AuditorServiceEvent) {\n const error = new UnauthorizedError();\n auditEvent.fail({\n meta: {\n message: 'Not authorized to request the endpoint',\n },\n error: new UnauthorizedError(),\n });\n\n throw error;\n }\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowsOverview',\n async (_c, req, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-overview',\n request: req,\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 auditEvent.success({\n meta: {\n workflowsCount: workflows.overviews?.length,\n },\n });\n res.json(workflows);\n } catch (error) {\n auditEvent.fail({ error });\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\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-source',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n },\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(auditEvent);\n }\n\n try {\n const result = await routerApi.v2.getWorkflowSourceById(workflowId);\n auditEvent.success();\n res.status(200).contentType('text/plain').send(result);\n } catch (error) {\n auditEvent.fail({ error });\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 credentials = await httpAuth.credentials(req);\n const initiatorEntity = await (\n await userInfo.getUserInfo(credentials)\n ).userEntityRef;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'execute-workflow',\n request: req,\n meta: {\n workflowId,\n },\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(auditEvent);\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(\n executeWorkflowRequestDTO,\n workflowId,\n businessKey,\n initiatorEntity,\n )\n .then(result => {\n auditEvent.success({ meta: { id: result.id } });\n return res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\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\n const auditEvent = await auditor.createEvent({\n eventId: 'retrigger-instance',\n request: req,\n meta: {\n workflowId,\n instanceId,\n },\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(auditEvent);\n }\n\n await routerApi.v2\n .retriggerInstance(workflowId, instanceId)\n .then(result => {\n auditEvent.success();\n return res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\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\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-overview',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n },\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(auditEvent);\n }\n\n return routerApi.v2\n .getWorkflowOverviewById(workflowId)\n .then(result => {\n auditEvent.success({\n meta: {\n workflowId: result.workflowId,\n },\n });\n return res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowStatuses',\n async (_c, request: express.Request, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-statuses',\n request,\n });\n\n // Anyone is authorized to call this endpoint\n\n return routerApi.v2\n .getWorkflowStatuses()\n .then(result => {\n auditEvent.success();\n res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\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\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-input-schema',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n instanceId,\n },\n });\n\n try {\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(auditEvent);\n }\n\n const workflowDefinition =\n await services.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\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 });\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 })\n : undefined;\n\n const workflowData = instanceVariables\n ? services.dataInputSchemaService.extractWorkflowData(\n instanceVariables,\n )\n : undefined;\n\n const workflowInfo = await routerApi.v2.getWorkflowInputSchemaById(\n workflowId,\n serviceUrl,\n );\n\n if (!workflowInfo?.inputSchema?.properties) {\n auditEvent.success({\n meta: {\n message: 'Successfully found nothing.',\n },\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 auditEvent.success({\n meta: {\n workflowId: workflowInfo.id,\n },\n });\n res.status(200).json({\n inputSchema: workflowInfo.inputSchema,\n data: inputData,\n });\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowInstances',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-instances',\n request: req,\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(auditEvent);\n }\n\n return routerApi.v2\n .getInstances(buildPagination(req), getRequestFilters(req), [\n workflowId,\n ])\n .then(result => {\n auditEvent.success();\n res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'pingWorkflowServiceById',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'ping-workflow-service',\n request: req,\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(auditEvent);\n }\n\n return routerApi.v2\n .pingWorkflowService(workflowId)\n .then(result => {\n auditEvent.success();\n res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\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 auditEvent = await auditor.createEvent({\n eventId: 'get-instances',\n request: req,\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 if (!authorizedWorkflowIds || authorizedWorkflowIds.length === 0)\n res.json([]);\n\n const credentials = await httpAuth.credentials(req);\n const initiatorEntity = (await userInfo.getUserInfo(credentials))\n .userEntityRef;\n const isUserAuthorizedForInstanceAdminView: boolean = // This permission will let user see ALL instances (including ones others created)\n await isUserAuthorizedForInstanceAdminViewPermission(\n req,\n permissions,\n httpAuth,\n );\n\n const requestFilters = getRequestFilters(req);\n\n let filters = requestFilters;\n\n if (!isUserAuthorizedForInstanceAdminView) {\n const initiatorEntityFilter: FieldFilter = {\n operator: 'EQ',\n value: initiatorEntity,\n field: 'initiatorEntity',\n };\n\n const nestedVariablesFilter: NestedFilter = {\n field: 'variables',\n nested: initiatorEntityFilter,\n };\n\n if (requestFilters === undefined) {\n filters = nestedVariablesFilter;\n } else {\n // combine filters\n filters = {\n operator: 'AND',\n filters: [nestedVariablesFilter, requestFilters],\n };\n }\n }\n\n const result = await routerApi.v2.getInstances(\n buildPagination(req),\n filters,\n authorizedWorkflowIds,\n );\n\n auditEvent.success({ meta: { authorizedWorkflowIds } });\n res.json(result);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getInstanceById',\n async (c, request: express.Request, res: express.Response, next) => {\n const instanceId = c.request.params.instanceId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-instance',\n request,\n meta: {\n actionType: 'by-id',\n instanceId,\n },\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 request,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const credentials = await httpAuth.credentials(request);\n const initiatorEntity = (await userInfo.getUserInfo(credentials))\n .userEntityRef;\n // Check if user is authorized to view all instances\n const isUserAuthorizedForInstanceAdminView =\n await isUserAuthorizedForInstanceAdminViewPermission(\n request,\n permissions,\n httpAuth,\n );\n\n // If not an admin, enforce initiatorEntity check\n if (!isUserAuthorizedForInstanceAdminView) {\n const instanceInitiatorEntity =\n assessedInstance.instance.initiatorEntity;\n if (instanceInitiatorEntity !== initiatorEntity) {\n throw new Error(\n `Unauthorized to access instance ${instanceId} not initiated by user.`,\n );\n }\n }\n\n auditEvent.success();\n res.status(200).json(assessedInstance);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'abortWorkflow',\n async (c, request, res, next) => {\n const instanceId = c.request.params.instanceId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'abort-workflow',\n request,\n meta: {\n actionType: 'by-id',\n instanceId,\n },\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 request,\n [\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const result = await routerApi.v2.abortWorkflow(workflowId, instanceId);\n auditEvent.success({ meta: { result } });\n res.status(200).json(result);\n } catch (error) {\n auditEvent.fail({ error });\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 auditor: AuditorService,\n) {\n router.get('/actions', async (req, res) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'actions',\n request: req,\n });\n const scaffolderUrl = await discovery.getBaseUrl('scaffolder');\n const response = await fetch(`${scaffolderUrl}/v2/actions`);\n const json = await response.json();\n auditEvent.success();\n res.status(response.status).json(json);\n });\n\n router.post('/actions/:actionId', async (req, res) => {\n const { actionId } = req.params;\n const instanceId: string | undefined = req.header('kogitoprocinstanceid');\n const body: JsonObject = (await req.body) as JsonObject;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'actions',\n request: req,\n meta: {\n actionType: 'by-id',\n instanceId,\n },\n });\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 auditEvent.success();\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","orchestratorInstanceAdminViewPermission","orchestratorWorkflowPermission","orchestratorWorkflowSpecificPermission","Router","createPermissionIntegrationRouter","orchestratorPermissions","express","ScaffolderService","MiddlewareFactory","DataIndexService","SonataFlowService","WorkflowCacheService","OrchestratorService","DataInputSchemaService","OpenAPIBackend","openApiDocument","fullFormats","v2","V2","UnauthorizedError","buildPagination","orchestratorWorkflowUsePermission","orchestratorWorkflowUseSpecificPermission","QUERY_PARAM_BUSINESS_KEY","QUERY_PARAM_INCLUDE_ASSESSMENT"],"mappings":"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"}
1
+ {"version":3,"file":"router.cjs.js","sources":["../../src/service/router.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { MiddlewareFactory } from '@backstage/backend-defaults/rootHttpRouter';\nimport {\n AuditorService,\n AuditorServiceEvent,\n HttpAuthService,\n LoggerService,\n PermissionsService,\n SchedulerService,\n UserInfoService,\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 { 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 FieldFilter,\n Filter,\n NestedFilter,\n openApiDocument,\n orchestratorInstanceAdminViewPermission,\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 { RouterOptions } from '../routerWrapper';\nimport { buildPagination } from '../types/pagination';\nimport { V2 } from './api/v2';\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 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 isUserAuthorizedForInstanceAdminViewPermission = async (\n request: HttpRequest,\n permissionsSvc: PermissionsService,\n httpAuth: HttpAuthService,\n): Promise<boolean> => {\n const credentials = await httpAuth.credentials(request);\n const [decision] = await permissionsSvc.authorize(\n [{ permission: orchestratorInstanceAdminViewPermission }],\n { credentials },\n );\n\n return decision.result === AuthorizeResult.ALLOW;\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 auditor,\n discovery,\n catalogApi,\n urlReader,\n scheduler,\n permissions,\n httpAuth,\n userInfo,\n } = options;\n const publicServices = initPublicServices(logger, config, scheduler);\n\n const routerApi = await initRouterApi(publicServices.orchestratorService);\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.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 auditor,\n userInfo,\n );\n setupExternalRoutes(router, discovery, scaffolderService, auditor);\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 auditor\n .createEvent({\n eventId: 'generic-error-handler',\n request: req,\n // Keep at high since this is a fallback - any error should be caught in handlers\n severityLevel: 'high',\n meta: {},\n })\n .then(event => {\n event.fail({\n meta: {},\n error,\n });\n });\n\n next(error);\n });\n });\n\n const middleware = MiddlewareFactory.create({ logger, config });\n\n router.use(middleware.error({ logAllErrors: true })); // log also openapi errors\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('OPENAPI 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 auditor: AuditorService,\n userInfo: UserInfoService,\n) {\n function manageDenyAuthorization(auditEvent: AuditorServiceEvent) {\n const error = new UnauthorizedError();\n auditEvent.fail({\n meta: {\n message: 'Not authorized to request the endpoint',\n },\n error: new UnauthorizedError(),\n });\n\n throw error;\n }\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowsOverview',\n async (_c, req, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-overview',\n request: req,\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 auditEvent.success({\n meta: {\n workflowsCount: workflows.overviews?.length,\n },\n });\n res.json(workflows);\n } catch (error) {\n auditEvent.fail({ error });\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\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-source',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n },\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(auditEvent);\n }\n\n try {\n const result = await routerApi.v2.getWorkflowSourceById(workflowId);\n auditEvent.success();\n res.status(200).contentType('text/plain').send(result);\n } catch (error) {\n auditEvent.fail({ error });\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 credentials = await httpAuth.credentials(req);\n const initiatorEntity = await (\n await userInfo.getUserInfo(credentials)\n ).userEntityRef;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'execute-workflow',\n request: req,\n meta: {\n workflowId,\n },\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(auditEvent);\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(\n executeWorkflowRequestDTO,\n workflowId,\n businessKey,\n initiatorEntity,\n )\n .then(result => {\n auditEvent.success({ meta: { id: result.id } });\n return res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\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\n const auditEvent = await auditor.createEvent({\n eventId: 'retrigger-instance',\n request: req,\n meta: {\n workflowId,\n instanceId,\n },\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(auditEvent);\n }\n\n await routerApi.v2\n .retriggerInstance(workflowId, instanceId)\n .then(result => {\n auditEvent.success();\n return res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\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\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-overview',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n },\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(auditEvent);\n }\n\n return routerApi.v2\n .getWorkflowOverviewById(workflowId)\n .then(result => {\n auditEvent.success({\n meta: {\n workflowId: result.workflowId,\n },\n });\n return res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowStatuses',\n async (_c, request: express.Request, res: express.Response, next) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-statuses',\n request,\n });\n\n // Anyone is authorized to call this endpoint\n\n return routerApi.v2\n .getWorkflowStatuses()\n .then(result => {\n auditEvent.success();\n res.status(200).json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\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\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-input-schema',\n request: req,\n meta: {\n actionType: 'by-id',\n workflowId,\n instanceId,\n },\n });\n\n try {\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(auditEvent);\n }\n\n const workflowDefinition =\n await services.orchestratorService.fetchWorkflowInfo({\n definitionId: workflowId,\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 });\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 })\n : undefined;\n\n const workflowData = instanceVariables\n ? services.dataInputSchemaService.extractWorkflowData(\n instanceVariables,\n )\n : undefined;\n\n const workflowInfo = await routerApi.v2.getWorkflowInputSchemaById(\n workflowId,\n serviceUrl,\n );\n\n if (!workflowInfo?.inputSchema?.properties) {\n auditEvent.success({\n meta: {\n message: 'Successfully found nothing.',\n },\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 auditEvent.success({\n meta: {\n workflowId: workflowInfo.id,\n },\n });\n res.status(200).json({\n inputSchema: workflowInfo.inputSchema,\n data: inputData,\n });\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getWorkflowInstances',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-workflow-instances',\n request: req,\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(auditEvent);\n }\n\n return routerApi.v2\n .getInstances(buildPagination(req), getRequestFilters(req), [\n workflowId,\n ])\n .then(result => {\n auditEvent.success();\n res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\n next(error);\n });\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'pingWorkflowServiceById',\n async (c, req: express.Request, res: express.Response, next) => {\n const workflowId = c.request.params.workflowId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'ping-workflow-service',\n request: req,\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(auditEvent);\n }\n\n return routerApi.v2\n .pingWorkflowService(workflowId)\n .then(result => {\n auditEvent.success();\n res.json(result);\n })\n .catch(error => {\n auditEvent.fail({ error });\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 auditEvent = await auditor.createEvent({\n eventId: 'get-instances',\n request: req,\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 if (!authorizedWorkflowIds || authorizedWorkflowIds.length === 0)\n res.json([]);\n\n const credentials = await httpAuth.credentials(req);\n const initiatorEntity = (await userInfo.getUserInfo(credentials))\n .userEntityRef;\n const isUserAuthorizedForInstanceAdminView: boolean = // This permission will let user see ALL instances (including ones others created)\n await isUserAuthorizedForInstanceAdminViewPermission(\n req,\n permissions,\n httpAuth,\n );\n\n const requestFilters = getRequestFilters(req);\n\n let filters = requestFilters;\n\n if (!isUserAuthorizedForInstanceAdminView) {\n const initiatorEntityFilter: FieldFilter = {\n operator: 'EQ',\n value: initiatorEntity,\n field: 'initiatorEntity',\n };\n\n const nestedVariablesFilter: NestedFilter = {\n field: 'variables',\n nested: initiatorEntityFilter,\n };\n\n if (requestFilters === undefined) {\n filters = nestedVariablesFilter;\n } else {\n // combine filters\n filters = {\n operator: 'AND',\n filters: [nestedVariablesFilter, requestFilters],\n };\n }\n }\n\n const result = await routerApi.v2.getInstances(\n buildPagination(req),\n filters,\n authorizedWorkflowIds,\n );\n\n auditEvent.success({ meta: { authorizedWorkflowIds } });\n res.json(result);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'getInstanceById',\n async (c, request: express.Request, res: express.Response, next) => {\n const instanceId = c.request.params.instanceId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'get-instance',\n request,\n meta: {\n actionType: 'by-id',\n instanceId,\n },\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 request,\n [\n orchestratorWorkflowPermission,\n orchestratorWorkflowSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const credentials = await httpAuth.credentials(request);\n const initiatorEntity = (await userInfo.getUserInfo(credentials))\n .userEntityRef;\n // Check if user is authorized to view all instances\n const isUserAuthorizedForInstanceAdminView =\n await isUserAuthorizedForInstanceAdminViewPermission(\n request,\n permissions,\n httpAuth,\n );\n\n // If not an admin, enforce initiatorEntity check\n if (!isUserAuthorizedForInstanceAdminView) {\n const instanceInitiatorEntity =\n assessedInstance.instance.initiatorEntity;\n if (instanceInitiatorEntity !== initiatorEntity) {\n throw new Error(\n `Unauthorized to access instance ${instanceId} not initiated by user.`,\n );\n }\n }\n\n auditEvent.success();\n res.status(200).json(assessedInstance);\n } catch (error) {\n auditEvent.fail({ error });\n next(error);\n }\n },\n );\n\n // v2\n routerApi.openApiBackend.register(\n 'abortWorkflow',\n async (c, request, res, next) => {\n const instanceId = c.request.params.instanceId as string;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'abort-workflow',\n request,\n meta: {\n actionType: 'by-id',\n instanceId,\n },\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 request,\n [\n orchestratorWorkflowUsePermission,\n orchestratorWorkflowUseSpecificPermission(workflowId),\n ],\n permissions,\n httpAuth,\n );\n if (decision.result === AuthorizeResult.DENY) {\n manageDenyAuthorization(auditEvent);\n }\n\n const result = await routerApi.v2.abortWorkflow(workflowId, instanceId);\n auditEvent.success({ meta: { result } });\n res.status(200).json(result);\n } catch (error) {\n auditEvent.fail({ error });\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 auditor: AuditorService,\n) {\n router.get('/actions', async (req, res) => {\n const auditEvent = await auditor.createEvent({\n eventId: 'actions',\n request: req,\n });\n const scaffolderUrl = await discovery.getBaseUrl('scaffolder');\n const response = await fetch(`${scaffolderUrl}/v2/actions`);\n const json = await response.json();\n auditEvent.success();\n res.status(response.status).json(json);\n });\n\n router.post('/actions/:actionId', async (req, res) => {\n const { actionId } = req.params;\n const instanceId: string | undefined = req.header('kogitoprocinstanceid');\n const body: JsonObject = (await req.body) as JsonObject;\n\n const auditEvent = await auditor.createEvent({\n eventId: 'actions',\n request: req,\n meta: {\n actionType: 'by-id',\n instanceId,\n },\n });\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 auditEvent.success();\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","orchestratorInstanceAdminViewPermission","orchestratorWorkflowPermission","orchestratorWorkflowSpecificPermission","Router","createPermissionIntegrationRouter","orchestratorPermissions","express","ScaffolderService","MiddlewareFactory","DataIndexService","SonataFlowService","WorkflowCacheService","OrchestratorService","DataInputSchemaService","OpenAPIBackend","openApiDocument","fullFormats","v2","V2","UnauthorizedError","buildPagination","orchestratorWorkflowUsePermission","orchestratorWorkflowUseSpecificPermission","QUERY_PARAM_BUSINESS_KEY","QUERY_PARAM_INCLUDE_ASSESSMENT"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@red-hat-developer-hub/backstage-plugin-orchestrator-backend",
3
- "version": "6.0.3",
3
+ "version": "6.1.0",
4
4
  "license": "Apache-2.0",
5
5
  "main": "./dist/index.cjs.js",
6
6
  "types": "./dist/index.d.ts",
@@ -78,7 +78,7 @@
78
78
  "@backstage/plugin-permission-node": "^0.9.0",
79
79
  "@backstage/plugin-scaffolder-backend": "^1.31.0",
80
80
  "@backstage/plugin-scaffolder-node": "^0.8.0",
81
- "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "^1.27.3",
81
+ "@red-hat-developer-hub/backstage-plugin-orchestrator-common": "^1.28.0",
82
82
  "@urql/core": "^4.1.4",
83
83
  "ajv-formats": "^2.1.1",
84
84
  "cloudevents": "^8.0.0",
@@ -86,6 +86,7 @@
86
86
  "express-promise-router": "^4.1.1",
87
87
  "fs-extra": "^10.1.0",
88
88
  "isomorphic-git": "^1.23.0",
89
+ "lodash": "^4.17.21",
89
90
  "moment": "^2.29.4",
90
91
  "openapi-backend": "^5.10.5",
91
92
  "yn": "^5.0.0"
@@ -96,7 +97,7 @@
96
97
  "@backstage/cli": "^0.31.1",
97
98
  "@janus-idp/backstage-plugin-audit-log-node": "^1.7.1",
98
99
  "@janus-idp/cli": "3.6.1",
99
- "@types/express": "4.17.22",
100
+ "@types/express": "4.17.23",
100
101
  "@types/fs-extra": "11.0.4",
101
102
  "@types/json-schema": "7.0.15",
102
103
  "prettier": "3.5.3"