@red-hat-developer-hub/backstage-plugin-orchestrator-backend 4.1.1
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 +740 -0
- package/README.md +5 -0
- package/app-config.yaml +3 -0
- package/dist/helpers/errorBuilder.cjs.js +36 -0
- package/dist/helpers/errorBuilder.cjs.js.map +1 -0
- package/dist/helpers/filterBuilder.cjs.js +197 -0
- package/dist/helpers/filterBuilder.cjs.js.map +1 -0
- package/dist/helpers/queryBuilder.cjs.js +40 -0
- package/dist/helpers/queryBuilder.cjs.js.map +1 -0
- package/dist/index.cjs.js +10 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/package.json.cjs.js +6 -0
- package/dist/package.json.cjs.js.map +1 -0
- package/dist/plugin.cjs.js +45 -0
- package/dist/plugin.cjs.js.map +1 -0
- package/dist/routerWrapper/index.cjs.js +31 -0
- package/dist/routerWrapper/index.cjs.js.map +1 -0
- package/dist/service/DataIndexService.cjs.js +405 -0
- package/dist/service/DataIndexService.cjs.js.map +1 -0
- package/dist/service/DataInputSchemaService.cjs.js +12 -0
- package/dist/service/DataInputSchemaService.cjs.js.map +1 -0
- package/dist/service/DevModeService.cjs.js +144 -0
- package/dist/service/DevModeService.cjs.js.map +1 -0
- package/dist/service/GitService.cjs.js +72 -0
- package/dist/service/GitService.cjs.js.map +1 -0
- package/dist/service/GitWrapper/git.cjs.js +219 -0
- package/dist/service/GitWrapper/git.cjs.js.map +1 -0
- package/dist/service/Helper.cjs.js +66 -0
- package/dist/service/Helper.cjs.js.map +1 -0
- package/dist/service/OrchestratorService.cjs.js +119 -0
- package/dist/service/OrchestratorService.cjs.js.map +1 -0
- package/dist/service/ScaffolderService.cjs.js +94 -0
- package/dist/service/ScaffolderService.cjs.js.map +1 -0
- package/dist/service/SonataFlowService.cjs.js +188 -0
- package/dist/service/SonataFlowService.cjs.js.map +1 -0
- package/dist/service/WorkflowCacheService.cjs.js +91 -0
- package/dist/service/WorkflowCacheService.cjs.js.map +1 -0
- package/dist/service/api/mapping/V2Mappings.cjs.js +150 -0
- package/dist/service/api/mapping/V2Mappings.cjs.js.map +1 -0
- package/dist/service/api/v2.cjs.js +187 -0
- package/dist/service/api/v2.cjs.js.map +1 -0
- package/dist/service/constants.cjs.js +10 -0
- package/dist/service/constants.cjs.js.map +1 -0
- package/dist/service/router.cjs.js +626 -0
- package/dist/service/router.cjs.js.map +1 -0
- package/dist/types/pagination.cjs.js +30 -0
- package/dist/types/pagination.cjs.js.map +1 -0
- package/package.json +110 -0
|
@@ -0,0 +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 const includeAssessment = routerApi.v2.extractQueryParam(\n c.request,\n QUERY_PARAM_INCLUDE_ASSESSMENT,\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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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function buildPagination(req) {
|
|
4
|
+
const pagination = {
|
|
5
|
+
limit: void 0,
|
|
6
|
+
offset: void 0,
|
|
7
|
+
order: void 0,
|
|
8
|
+
sortField: void 0
|
|
9
|
+
};
|
|
10
|
+
if (!req.body?.paginationInfo) {
|
|
11
|
+
return pagination;
|
|
12
|
+
}
|
|
13
|
+
const { offset, pageSize, orderBy, orderDirection } = req.body.paginationInfo;
|
|
14
|
+
if (!isNaN(Number(offset))) {
|
|
15
|
+
pagination.offset = Number(offset);
|
|
16
|
+
}
|
|
17
|
+
if (!isNaN(Number(pageSize))) {
|
|
18
|
+
pagination.limit = Number(pageSize);
|
|
19
|
+
}
|
|
20
|
+
if (orderBy) {
|
|
21
|
+
pagination.sortField = String(orderBy);
|
|
22
|
+
}
|
|
23
|
+
if (orderDirection) {
|
|
24
|
+
pagination.order = String(orderDirection).toUpperCase();
|
|
25
|
+
}
|
|
26
|
+
return pagination;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
exports.buildPagination = buildPagination;
|
|
30
|
+
//# sourceMappingURL=pagination.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.cjs.js","sources":["../../src/types/pagination.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 { Request } from 'express-serve-static-core';\n\nimport { PaginationInfoDTO } from '@red-hat-developer-hub/backstage-plugin-orchestrator-common';\n\nexport interface Pagination {\n offset?: number;\n limit?: number;\n order?: string;\n sortField?: string;\n}\n\nexport function buildPagination(req: Request): Pagination {\n const pagination: Pagination = {\n limit: undefined,\n offset: undefined,\n order: undefined,\n sortField: undefined,\n };\n\n if (!req.body?.paginationInfo) {\n return pagination;\n }\n const { offset, pageSize, orderBy, orderDirection } = req.body\n .paginationInfo as PaginationInfoDTO;\n\n if (!isNaN(Number(offset))) {\n pagination.offset = Number(offset);\n }\n\n if (!isNaN(Number(pageSize))) {\n pagination.limit = Number(pageSize);\n }\n\n if (orderBy) {\n pagination.sortField = String(orderBy);\n }\n\n if (orderDirection) {\n pagination.order = String(orderDirection).toUpperCase();\n }\n return pagination;\n}\n\nexport function buildPaginationTmp(\n paginationInfo?: PaginationInfoDTO,\n): Pagination {\n const pagination: Pagination = {\n limit: undefined,\n offset: undefined,\n order: undefined,\n sortField: undefined,\n };\n\n if (!paginationInfo) {\n return pagination;\n }\n const { offset, pageSize, orderBy, orderDirection } = paginationInfo;\n\n if (!isNaN(Number(offset))) {\n pagination.offset = Number(offset);\n }\n\n if (!isNaN(Number(pageSize))) {\n pagination.limit = Number(pageSize);\n }\n\n if (orderBy) {\n pagination.sortField = String(orderBy);\n }\n\n if (orderDirection) {\n pagination.order = String(orderDirection).toUpperCase();\n }\n return pagination;\n}\n"],"names":[],"mappings":";;AA0BO,SAAS,gBAAgB,GAA0B,EAAA;AACxD,EAAA,MAAM,UAAyB,GAAA;AAAA,IAC7B,KAAO,EAAA,KAAA,CAAA;AAAA,IACP,MAAQ,EAAA,KAAA,CAAA;AAAA,IACR,KAAO,EAAA,KAAA,CAAA;AAAA,IACP,SAAW,EAAA,KAAA,CAAA;AAAA,GACb,CAAA;AAEA,EAAI,IAAA,CAAC,GAAI,CAAA,IAAA,EAAM,cAAgB,EAAA;AAC7B,IAAO,OAAA,UAAA,CAAA;AAAA,GACT;AACA,EAAA,MAAM,EAAE,MAAQ,EAAA,QAAA,EAAU,SAAS,cAAe,EAAA,GAAI,IAAI,IACvD,CAAA,cAAA,CAAA;AAEH,EAAA,IAAI,CAAC,KAAA,CAAM,MAAO,CAAA,MAAM,CAAC,CAAG,EAAA;AAC1B,IAAW,UAAA,CAAA,MAAA,GAAS,OAAO,MAAM,CAAA,CAAA;AAAA,GACnC;AAEA,EAAA,IAAI,CAAC,KAAA,CAAM,MAAO,CAAA,QAAQ,CAAC,CAAG,EAAA;AAC5B,IAAW,UAAA,CAAA,KAAA,GAAQ,OAAO,QAAQ,CAAA,CAAA;AAAA,GACpC;AAEA,EAAA,IAAI,OAAS,EAAA;AACX,IAAW,UAAA,CAAA,SAAA,GAAY,OAAO,OAAO,CAAA,CAAA;AAAA,GACvC;AAEA,EAAA,IAAI,cAAgB,EAAA;AAClB,IAAA,UAAA,CAAW,KAAQ,GAAA,MAAA,CAAO,cAAc,CAAA,CAAE,WAAY,EAAA,CAAA;AAAA,GACxD;AACA,EAAO,OAAA,UAAA,CAAA;AACT;;;;"}
|
package/package.json
ADDED
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@red-hat-developer-hub/backstage-plugin-orchestrator-backend",
|
|
3
|
+
"version": "4.1.1",
|
|
4
|
+
"license": "Apache-2.0",
|
|
5
|
+
"main": "./dist/index.cjs.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public"
|
|
9
|
+
},
|
|
10
|
+
"backstage": {
|
|
11
|
+
"role": "backend-plugin",
|
|
12
|
+
"supported-versions": "1.32.5",
|
|
13
|
+
"pluginId": "orchestrator",
|
|
14
|
+
"pluginPackages": [
|
|
15
|
+
"@red-hat-developer-hub/backstage-plugin-orchestrator",
|
|
16
|
+
"@red-hat-developer-hub/backstage-plugin-orchestrator-backend",
|
|
17
|
+
"@red-hat-developer-hub/backstage-plugin-orchestrator-common"
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"backstage": "@backstage/BackendFeature",
|
|
23
|
+
"require": "./dist/index.cjs.js",
|
|
24
|
+
"types": "./dist/index.d.ts",
|
|
25
|
+
"default": "./dist/index.cjs.js"
|
|
26
|
+
},
|
|
27
|
+
"./package.json": "./package.json"
|
|
28
|
+
},
|
|
29
|
+
"homepage": "https://red.ht/rhdh",
|
|
30
|
+
"repository": {
|
|
31
|
+
"type": "git",
|
|
32
|
+
"url": "https://github.com/redhat-developer/rhdh-plugins",
|
|
33
|
+
"directory": "workspaces/orchestrator/plugins/orchestrator-backend"
|
|
34
|
+
},
|
|
35
|
+
"bugs": "https://github.com/redhat-developer/rhdh-plugins/issues",
|
|
36
|
+
"keywords": [
|
|
37
|
+
"support:tech-preview",
|
|
38
|
+
"lifecycle:active",
|
|
39
|
+
"backstage",
|
|
40
|
+
"plugin",
|
|
41
|
+
"orchestrator",
|
|
42
|
+
"workflows"
|
|
43
|
+
],
|
|
44
|
+
"files": [
|
|
45
|
+
"app-config.yaml",
|
|
46
|
+
"dist",
|
|
47
|
+
"dist-dynamic/*.*",
|
|
48
|
+
"dist-dynamic/dist/**",
|
|
49
|
+
"static"
|
|
50
|
+
],
|
|
51
|
+
"scripts": {
|
|
52
|
+
"start": "backstage-cli package start",
|
|
53
|
+
"build": "backstage-cli package build",
|
|
54
|
+
"tsc": "tsc",
|
|
55
|
+
"prettier:check": "prettier --ignore-unknown --check .",
|
|
56
|
+
"prettier:fix": "prettier --ignore-unknown --write .",
|
|
57
|
+
"lint:check": "backstage-cli package lint",
|
|
58
|
+
"lint:fix": "backstage-cli package lint --fix",
|
|
59
|
+
"test": "backstage-cli package test --passWithNoTests --coverage",
|
|
60
|
+
"clean": "backstage-cli package clean",
|
|
61
|
+
"prepack": "backstage-cli package prepack",
|
|
62
|
+
"postpack": "backstage-cli package postpack"
|
|
63
|
+
},
|
|
64
|
+
"dependencies": {
|
|
65
|
+
"@backstage/backend-common": "^0.25.0",
|
|
66
|
+
"@backstage/backend-defaults": "^0.5.2",
|
|
67
|
+
"@backstage/backend-plugin-api": "^1.0.1",
|
|
68
|
+
"@backstage/backend-tasks": "^0.6.1",
|
|
69
|
+
"@backstage/catalog-client": "^1.7.1",
|
|
70
|
+
"@backstage/errors": "^1.2.4",
|
|
71
|
+
"@backstage/integration": "^1.15.1",
|
|
72
|
+
"@backstage/plugin-catalog-node": "^1.13.1",
|
|
73
|
+
"@backstage/plugin-permission-common": "^0.8.1",
|
|
74
|
+
"@backstage/plugin-permission-node": "^0.8.4",
|
|
75
|
+
"@backstage/plugin-scaffolder-backend": "^1.26.2",
|
|
76
|
+
"@backstage/plugin-scaffolder-node": "^0.5.0",
|
|
77
|
+
"@red-hat-developer-hub/backstage-plugin-orchestrator-common": "^1.24.1",
|
|
78
|
+
"@urql/core": "^4.1.4",
|
|
79
|
+
"ajv-formats": "^2.1.1",
|
|
80
|
+
"cloudevents": "^8.0.0",
|
|
81
|
+
"express": "^4.18.2",
|
|
82
|
+
"express-promise-router": "^4.1.1",
|
|
83
|
+
"fs-extra": "^10.1.0",
|
|
84
|
+
"isomorphic-git": "^1.23.0",
|
|
85
|
+
"json-schema": "^0.4.0",
|
|
86
|
+
"moment": "^2.29.4",
|
|
87
|
+
"openapi-backend": "^5.10.5",
|
|
88
|
+
"yn": "^5.0.0"
|
|
89
|
+
},
|
|
90
|
+
"devDependencies": {
|
|
91
|
+
"@backstage-community/plugin-rbac-common": "^1.12.1",
|
|
92
|
+
"@backstage/backend-test-utils": "1.0.2",
|
|
93
|
+
"@backstage/cli": "0.28.2",
|
|
94
|
+
"@janus-idp/backstage-plugin-audit-log-node": "^1.7.1",
|
|
95
|
+
"@types/express": "4.17.21",
|
|
96
|
+
"@types/fs-extra": "11.0.4",
|
|
97
|
+
"@types/json-schema": "7.0.15",
|
|
98
|
+
"prettier": "3.3.3"
|
|
99
|
+
},
|
|
100
|
+
"peerDependencies": {
|
|
101
|
+
"@backstage-community/plugin-rbac-common": "^1.12.1",
|
|
102
|
+
"@janus-idp/backstage-plugin-audit-log-node": "^1.7.1"
|
|
103
|
+
},
|
|
104
|
+
"maintainers": [
|
|
105
|
+
"@mlibra",
|
|
106
|
+
"@batzionb",
|
|
107
|
+
"@gciavarrini"
|
|
108
|
+
],
|
|
109
|
+
"author": "The Backstage Community"
|
|
110
|
+
}
|