@gadmin2n/schematics 0.0.138 → 0.0.140
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/dist/lib/application/files/gadmin2-game-angle-demo/Jenkinsfile +6 -34
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/approval.prisma +199 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +9 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +191 -14
- package/dist/lib/application/files/gadmin2-game-angle-demo/gitignore +6 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/readme.md +10 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/migrate-between-pg-schemas.js +6 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +5 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +12 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/migrate-human-approval-configs.ts +86 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +682 -121
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +110 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/config/index.ts +28 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/json-body-parser.spec.ts +61 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/json-body-parser.ts +7 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.spec.ts +54 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.ts +86 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +9 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.controller.ts +89 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.dto.ts +68 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.spec.ts +177 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.ts +283 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approvalChannel.module.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.spec.ts +42 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.ts +108 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +101 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.dto.ts +29 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/codeRuntime.module.ts +21 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-handler.registry.ts +30 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-handler.ts +15 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.spec.ts +105 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.ts +96 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.dto.ts +78 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.spec.ts +56 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.ts +111 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-token.spec.ts +23 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-token.ts +18 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.spec.ts +240 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.ts +339 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.types.ts +74 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-wait.handler.ts +47 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/externalInteraction.module.ts +41 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.spec.ts +70 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.ts +76 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.controller.ts +12 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.spec.ts +227 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.ts +121 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +160 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.dto.ts +41 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.spec.ts +171 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.ts +245 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/httpRequest.module.ts +22 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule-evaluator.spec.ts +68 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule-evaluator.ts +126 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule.types.ts +34 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.ts +115 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.spec.ts +45 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.ts +59 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.controller.ts +72 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.dto.ts +144 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.errors.ts +19 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.external-decision.spec.ts +350 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +774 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/humanApproval.module.ts +46 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/legacy-approval-config-migration.ts +227 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/outbox-retry.util.ts +14 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +151 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.dto.ts +88 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/runtime-token.guard.ts +43 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +21 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.controller.ts +77 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.dto.ts +98 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.ts +277 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-secret-cipher.spec.ts +14 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-secret-cipher.ts +59 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integrationConnection.module.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/actor-context.util.ts +27 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/providers/user-group.provider.ts +208 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/providers/user.provider.ts +168 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.controller.spec.ts +157 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.controller.ts +176 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.dto.ts +21 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.errors.ts +78 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.registry.spec.ts +100 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.registry.ts +115 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.types.ts +97 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subjectProvider.module.ts +34 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.spec.ts +89 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.ts +4 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.controller.ts +119 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.dto.ts +91 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.errors.ts +34 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.service.spec.ts +161 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.service.ts +390 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/userGroup.module.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.spec.ts +17 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.ts +8 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/parameter-binding.ts +93 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.spec.ts +158 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.ts +155 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +363 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +354 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.types.ts +43 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.spec.ts +174 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.ts +149 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-dsl-comparison.ts +43 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +4 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +70 -28
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +128 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +12 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.module.ts +18 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +369 -22
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +319 -90
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.spec.ts +79 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.ts +62 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/schema.types.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.spec.ts +124 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.ts +236 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.spec.ts +49 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.ts +69 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/workflowConfig.module.ts +20 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/node-instance-config.util.spec.ts +15 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/node-instance-config.util.ts +25 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.ts +103 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.dto.ts +98 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.module.ts +3 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +72 -62
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.ts +148 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +13 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +5 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/authProvider.ts +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/BulkActions.tsx +0 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/SearchBar.tsx +26 -18
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/eventList/index.tsx +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logButton/index.tsx +24 -17
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logList/index.tsx +7 -18
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/modalDiffViewer/index.tsx +2 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +288 -33
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/themeStyles.ts +97 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/SettingDrawer.tsx +251 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +47 -19
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +18 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/menuRenderer.tsx +155 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +123 -129
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +16 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +2 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +98 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +101 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +8 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +51 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/form.tsx +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +40 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/show.tsx +5 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +16 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useListPageState.ts +10 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +4 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +26 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/workflow.json +556 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +26 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json +556 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +152 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +6 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/show.tsx +41 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/edit.tsx +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/list.tsx +10 -8
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/show.tsx +3 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.css +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +3 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.css +3 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.tsx +45 -13
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasComponentLibrary.tsx +45 -22
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +168 -101
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +248 -74
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +33 -18
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CodeFloatWindow.tsx +16 -10
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/PublishModal.tsx +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +31 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +15 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/BarChartDataSourceModal.tsx +16 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/CanvasAiModal.tsx +25 -21
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/ExportModal.tsx +6 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/LineChartDataSourceModal.tsx +9 -10
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartConfigModal.tsx +4 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartDataSourceModal.tsx +23 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/NumCardDataSourceModal.tsx +16 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/PromptModal.tsx +2 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/RadarChartDataSourceModal.tsx +16 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableConfigModal.tsx +2 -9
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableDataSourceModal.tsx +23 -12
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/canvasModalProps.ts +2 -17
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.test.ts +149 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.ts +111 -17
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/types.ts +1 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardLayout.test.ts +83 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardLayout.ts +118 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardName.test.ts +26 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas-page/index.tsx +9 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/edit.tsx +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/list.tsx +10 -8
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/show.tsx +3 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.tsx +71 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/inbox.tsx +216 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +6 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permissionReadme/index.tsx +8 -8
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +5 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.test.tsx +84 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.tsx +141 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/approval-channel.types.ts +16 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/index.tsx +208 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CreateNodeInstanceDrawer.tsx +154 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +194 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DeletableEdge.tsx +76 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.tsx +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +176 -22
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.test.tsx +62 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.tsx +94 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExportModal.tsx +15 -10
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +251 -70
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ImportModal.tsx +18 -24
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/InstanceRequiredDialog.tsx +106 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.test.tsx +45 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.tsx +43 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NewNodeDefaults.test.tsx +279 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeEditModal.tsx +6 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.test.tsx +335 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +433 -237
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ParameterBindingEditor.tsx +179 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.tsx +18 -16
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +20 -16
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/VersionPanel.tsx +6 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.test.tsx +68 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.tsx +367 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connection.types.ts +21 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.tsx +171 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +38 -22
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useNodeInstanceLibrary.ts +41 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +6 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +27 -20
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +8 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +6 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +56 -23
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/create.tsx +21 -6
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/edit.tsx +17 -20
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/index.tsx +6 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaField.tsx +311 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.test.tsx +218 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.tsx +83 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/default-widgets.tsx +135 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/schema-defaults.ts +36 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/schema.types.ts +32 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.test.tsx +23 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.tsx +52 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +9 -13
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRequestTriggerConfigEditor.tsx +39 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.test.tsx +20 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.tsx +72 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.test.tsx +47 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.tsx +185 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.test.tsx +102 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.tsx +150 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.tsx +103 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.test.tsx +93 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.tsx +196 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalWaitConfigEditor.tsx +303 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.test.tsx +189 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.tsx +706 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.test.tsx +86 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.tsx +458 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.test.tsx +53 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +91 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.test.tsx +61 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.tsx +266 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitApprovalResultConfigEditor.tsx +104 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitExternalResultConfigEditor.tsx +98 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupCreateModal.tsx +70 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupEditModal.tsx +138 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.test.ts +25 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.ts +42 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/subject-provider.api.ts +95 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +15 -11
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +49 -8
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types/parameter-binding.ts +49 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +31 -2
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.test.ts +208 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.ts +246 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/newNodeConfig.ts +73 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.test.ts +34 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.ts +18 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.ts +66 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.test.ts +39 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.ts +48 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.test.ts +51 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.ts +32 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +10 -8
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +3 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd-theme-vars.css +93 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.css +8 -8
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/fc.css +4 -4
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +20 -5
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-drawer.module.css +3 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-page.module.css +3 -3
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/theme-styles.css +81 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/test/setup.ts +5 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +1 -7
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/vitest.config.ts +12 -0
- package/package.json +1 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/DynamicConfigForm.tsx +0 -154
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { validateDslHandles } from '@gadmin2n/nest-common/workflow-dsl';
|
|
2
1
|
import {
|
|
3
2
|
BadRequestException,
|
|
4
3
|
Injectable,
|
|
@@ -8,9 +7,19 @@ import {
|
|
|
8
7
|
} from '@nestjs/common';
|
|
9
8
|
import { Prisma } from '@prisma/client';
|
|
10
9
|
import { PrismaService } from 'nestjs-prisma';
|
|
10
|
+
import { HumanApprovalService } from '../humanApproval/human-approval.service';
|
|
11
11
|
import { validateDslGraph } from './dsl-validate.util';
|
|
12
12
|
import { TemporalService } from './temporal.service';
|
|
13
13
|
import { verifyWebhookSignature } from './webhook-signature.util';
|
|
14
|
+
import { describeCallableWorkflow } from './workflow-callable';
|
|
15
|
+
import { WorkflowCompilerService } from './workflow-compiler.service';
|
|
16
|
+
import { DraftWorkflowDsl } from './workflow-compiler.types';
|
|
17
|
+
import { validateWorkflowDataEdges } from './workflow-data-edge.util';
|
|
18
|
+
import { areWorkflowDslSourcesEqual } from './workflow-dsl-comparison';
|
|
19
|
+
import {
|
|
20
|
+
NodeOutputsMap,
|
|
21
|
+
validateWorkflowHandles,
|
|
22
|
+
} from './workflow-handle-validator';
|
|
14
23
|
|
|
15
24
|
@Injectable()
|
|
16
25
|
export class WorkflowService {
|
|
@@ -19,6 +28,8 @@ export class WorkflowService {
|
|
|
19
28
|
constructor(
|
|
20
29
|
private prisma: PrismaService,
|
|
21
30
|
private temporalService: TemporalService,
|
|
31
|
+
private humanApprovalService: HumanApprovalService,
|
|
32
|
+
private workflowCompiler: WorkflowCompilerService,
|
|
22
33
|
) {}
|
|
23
34
|
|
|
24
35
|
/**
|
|
@@ -37,9 +48,12 @@ export class WorkflowService {
|
|
|
37
48
|
* Find all webhook_trigger configs in a DSL.
|
|
38
49
|
* Each entry includes path + method; used for collision detection on publish.
|
|
39
50
|
*/
|
|
40
|
-
private extractWebhookConfigs(
|
|
41
|
-
|
|
42
|
-
|
|
51
|
+
private extractWebhookConfigs(dsl: any): Array<{
|
|
52
|
+
path: string;
|
|
53
|
+
method: string;
|
|
54
|
+
secret?: string;
|
|
55
|
+
verificationMode: 'HMAC' | 'NONE';
|
|
56
|
+
}> {
|
|
43
57
|
if (!Array.isArray(dsl?.nodes)) return [];
|
|
44
58
|
return dsl.nodes
|
|
45
59
|
.filter(
|
|
@@ -50,6 +64,8 @@ export class WorkflowService {
|
|
|
50
64
|
path: n.config.path,
|
|
51
65
|
method: n.config.method,
|
|
52
66
|
secret: n.config.secret,
|
|
67
|
+
verificationMode:
|
|
68
|
+
n.config.verificationMode === 'NONE' ? 'NONE' : 'HMAC',
|
|
53
69
|
}));
|
|
54
70
|
}
|
|
55
71
|
|
|
@@ -142,6 +158,87 @@ export class WorkflowService {
|
|
|
142
158
|
return { items: enrichedItems, total };
|
|
143
159
|
}
|
|
144
160
|
|
|
161
|
+
async findCallableWorkflows(resultType = 'APPROVAL_SUBJECTS') {
|
|
162
|
+
const workflows = await this.prisma.workflow.findMany({
|
|
163
|
+
where: { status: 'PUBLISHED', isEnabled: true },
|
|
164
|
+
orderBy: { name: 'asc' },
|
|
165
|
+
include: {
|
|
166
|
+
versions: {
|
|
167
|
+
orderBy: { version: 'desc' },
|
|
168
|
+
take: 1,
|
|
169
|
+
select: { dsl: true },
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
return workflows.flatMap((workflow) => {
|
|
174
|
+
try {
|
|
175
|
+
const descriptor = describeCallableWorkflow(workflow.versions[0]?.dsl);
|
|
176
|
+
if (
|
|
177
|
+
!descriptor ||
|
|
178
|
+
descriptor.mode !== 'RETURN' ||
|
|
179
|
+
descriptor.resultType !== resultType
|
|
180
|
+
)
|
|
181
|
+
return [];
|
|
182
|
+
return [
|
|
183
|
+
{
|
|
184
|
+
id: String(workflow.id),
|
|
185
|
+
name: workflow.name,
|
|
186
|
+
description: workflow.description,
|
|
187
|
+
inputParameters: descriptor.inputParameters,
|
|
188
|
+
resultType: descriptor.resultType,
|
|
189
|
+
},
|
|
190
|
+
];
|
|
191
|
+
} catch {
|
|
192
|
+
return [];
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
async findExternalInteractionOptions() {
|
|
198
|
+
const workflows = await this.prisma.workflow.findMany({
|
|
199
|
+
where: { status: 'PUBLISHED', isEnabled: true },
|
|
200
|
+
orderBy: { name: 'asc' },
|
|
201
|
+
include: {
|
|
202
|
+
versions: {
|
|
203
|
+
orderBy: { version: 'desc' },
|
|
204
|
+
take: 1,
|
|
205
|
+
select: { dsl: true },
|
|
206
|
+
},
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
const dispatchWorkflows: Array<{ id: string; name: string }> = [];
|
|
210
|
+
const callbackWorkflows: Array<{ id: string; name: string }> = [];
|
|
211
|
+
for (const workflow of workflows) {
|
|
212
|
+
const dsl = workflow.versions[0]?.dsl;
|
|
213
|
+
try {
|
|
214
|
+
if (describeCallableWorkflow(dsl)?.mode === 'ONE_WAY') {
|
|
215
|
+
dispatchWorkflows.push({
|
|
216
|
+
id: String(workflow.id),
|
|
217
|
+
name: workflow.name,
|
|
218
|
+
});
|
|
219
|
+
}
|
|
220
|
+
} catch {
|
|
221
|
+
// Invalid callable Workflows are not selectable.
|
|
222
|
+
}
|
|
223
|
+
const nodes =
|
|
224
|
+
dsl &&
|
|
225
|
+
typeof dsl === 'object' &&
|
|
226
|
+
!Array.isArray(dsl) &&
|
|
227
|
+
Array.isArray((dsl as { nodes?: unknown }).nodes)
|
|
228
|
+
? (dsl as { nodes: Array<{ type?: string }> }).nodes ?? []
|
|
229
|
+
: [];
|
|
230
|
+
if (
|
|
231
|
+
nodes.filter((node) => node.type === 'webhook_trigger').length === 1
|
|
232
|
+
) {
|
|
233
|
+
callbackWorkflows.push({
|
|
234
|
+
id: String(workflow.id),
|
|
235
|
+
name: workflow.name,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return { dispatchWorkflows, callbackWorkflows };
|
|
240
|
+
}
|
|
241
|
+
|
|
145
242
|
async findOne(id: bigint) {
|
|
146
243
|
const workflow = await this.prisma.workflow.findUnique({
|
|
147
244
|
where: { id },
|
|
@@ -179,11 +276,25 @@ export class WorkflowService {
|
|
|
179
276
|
}
|
|
180
277
|
|
|
181
278
|
async saveDraft(id: bigint, dsl: any) {
|
|
182
|
-
const workflow = await this.prisma.workflow.findUnique({
|
|
279
|
+
const workflow = await this.prisma.workflow.findUnique({
|
|
280
|
+
where: { id },
|
|
281
|
+
include: {
|
|
282
|
+
versions: {
|
|
283
|
+
orderBy: { version: 'desc' },
|
|
284
|
+
take: 1,
|
|
285
|
+
select: { dsl: true },
|
|
286
|
+
},
|
|
287
|
+
},
|
|
288
|
+
});
|
|
183
289
|
if (!workflow) throw new NotFoundException('Workflow not found');
|
|
290
|
+
const latestPublishedDsl = workflow.versions?.[0]?.dsl;
|
|
291
|
+
const status =
|
|
292
|
+
latestPublishedDsl && areWorkflowDslSourcesEqual(dsl, latestPublishedDsl)
|
|
293
|
+
? 'PUBLISHED'
|
|
294
|
+
: 'DRAFT';
|
|
184
295
|
return this.prisma.workflow.update({
|
|
185
296
|
where: { id },
|
|
186
|
-
data: { dsl, status
|
|
297
|
+
data: { dsl, status },
|
|
187
298
|
});
|
|
188
299
|
}
|
|
189
300
|
|
|
@@ -228,7 +339,29 @@ export class WorkflowService {
|
|
|
228
339
|
);
|
|
229
340
|
}
|
|
230
341
|
|
|
231
|
-
return this.prisma
|
|
342
|
+
return this.prisma.$transaction(async (tx) => {
|
|
343
|
+
const interactions = await tx.externalInteraction.findMany({
|
|
344
|
+
where: {
|
|
345
|
+
OR: [
|
|
346
|
+
{ workflowInstance: { workflowId: id } },
|
|
347
|
+
{ workflowVersion: { workflowId: id } },
|
|
348
|
+
],
|
|
349
|
+
},
|
|
350
|
+
select: { id: true },
|
|
351
|
+
});
|
|
352
|
+
const interactionIds = interactions.map((interaction) => interaction.id);
|
|
353
|
+
|
|
354
|
+
if (interactionIds.length) {
|
|
355
|
+
const where = { interactionId: { in: interactionIds } };
|
|
356
|
+
await tx.externalInteractionSignalOutbox.deleteMany({ where });
|
|
357
|
+
await tx.externalInteractionEvent.deleteMany({ where });
|
|
358
|
+
await tx.externalInteraction.deleteMany({
|
|
359
|
+
where: { id: { in: interactionIds } },
|
|
360
|
+
});
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
return tx.workflow.delete({ where: { id } });
|
|
364
|
+
});
|
|
232
365
|
}
|
|
233
366
|
|
|
234
367
|
async getVersions(workflowId: bigint) {
|
|
@@ -261,22 +394,34 @@ export class WorkflowService {
|
|
|
261
394
|
) {
|
|
262
395
|
const workflow = await this.prisma.workflow.findUnique({
|
|
263
396
|
where: { id: workflowId },
|
|
397
|
+
include: {
|
|
398
|
+
versions: {
|
|
399
|
+
orderBy: { version: 'desc' },
|
|
400
|
+
take: 1,
|
|
401
|
+
select: { dsl: true },
|
|
402
|
+
},
|
|
403
|
+
},
|
|
264
404
|
});
|
|
265
405
|
if (!workflow) throw new NotFoundException('Workflow not found');
|
|
266
406
|
|
|
267
407
|
// Use workflow.dsl if available; otherwise fall back to latest version's DSL
|
|
268
408
|
let dslToPublish = workflow.dsl;
|
|
269
409
|
if (!dslToPublish) {
|
|
270
|
-
|
|
271
|
-
where: { workflowId },
|
|
272
|
-
orderBy: { version: 'desc' },
|
|
273
|
-
select: { dsl: true },
|
|
274
|
-
});
|
|
275
|
-
dslToPublish = latestVersion?.dsl ?? null;
|
|
410
|
+
dslToPublish = workflow.versions?.[0]?.dsl ?? null;
|
|
276
411
|
}
|
|
277
412
|
if (!dslToPublish) {
|
|
278
413
|
throw new NotFoundException('No draft DSL to publish');
|
|
279
414
|
}
|
|
415
|
+
const latestPublishedDsl = workflow.versions?.[0]?.dsl;
|
|
416
|
+
if (
|
|
417
|
+
latestPublishedDsl &&
|
|
418
|
+
areWorkflowDslSourcesEqual(dslToPublish, latestPublishedDsl)
|
|
419
|
+
) {
|
|
420
|
+
throw new BadRequestException({
|
|
421
|
+
code: 'WORKFLOW_DSL_UNCHANGED',
|
|
422
|
+
message: '保存后的 Workflow DSL 与最新发布版本相同,无需再次发布',
|
|
423
|
+
});
|
|
424
|
+
}
|
|
280
425
|
|
|
281
426
|
// Structural + cycle validation. Reject malformed/cyclic DSL up-front so the
|
|
282
427
|
// worker's executeGraph never has to deal with them at runtime.
|
|
@@ -286,11 +431,38 @@ export class WorkflowService {
|
|
|
286
431
|
throw new BadRequestException(`Invalid DSL: ${err?.message ?? err}`);
|
|
287
432
|
}
|
|
288
433
|
|
|
289
|
-
//
|
|
290
|
-
//
|
|
291
|
-
//
|
|
292
|
-
|
|
293
|
-
const
|
|
434
|
+
// Validate source handles against the same node-type metadata consumed by
|
|
435
|
+
// the canvas. This also supports project-specific node types and output
|
|
436
|
+
// declarations without requiring a nest-common release.
|
|
437
|
+
const handleDsl = dslToPublish as any;
|
|
438
|
+
const nodeTypes = await this.prisma.workflowNodeType.findMany({
|
|
439
|
+
select: { type: true, outputs: true },
|
|
440
|
+
});
|
|
441
|
+
const outputsMap = Object.fromEntries(
|
|
442
|
+
nodeTypes.map((nodeType) => [
|
|
443
|
+
nodeType.type,
|
|
444
|
+
nodeType.outputs === null
|
|
445
|
+
? null
|
|
446
|
+
: Array.isArray(nodeType.outputs)
|
|
447
|
+
? nodeType.outputs.filter(
|
|
448
|
+
(output): output is string => typeof output === 'string',
|
|
449
|
+
)
|
|
450
|
+
: [],
|
|
451
|
+
]),
|
|
452
|
+
) as NodeOutputsMap;
|
|
453
|
+
const handleErrors = validateWorkflowHandles(
|
|
454
|
+
{
|
|
455
|
+
...handleDsl,
|
|
456
|
+
edges: (handleDsl.edges ?? [])
|
|
457
|
+
.filter((edge: any) => !edge.kind || edge.kind === 'FLOW')
|
|
458
|
+
.map((edge: any) =>
|
|
459
|
+
['response-out', 'result-out'].includes(edge.sourceHandle)
|
|
460
|
+
? { ...edge, sourceHandle: undefined }
|
|
461
|
+
: edge,
|
|
462
|
+
),
|
|
463
|
+
},
|
|
464
|
+
outputsMap,
|
|
465
|
+
);
|
|
294
466
|
if (handleErrors.length > 0) {
|
|
295
467
|
throw new BadRequestException({
|
|
296
468
|
message: 'DSL validation failed: invalid edge sourceHandle(s)',
|
|
@@ -299,21 +471,43 @@ export class WorkflowService {
|
|
|
299
471
|
});
|
|
300
472
|
}
|
|
301
473
|
|
|
474
|
+
const compiledDsl = await this.workflowCompiler.compile(
|
|
475
|
+
dslToPublish as unknown as DraftWorkflowDsl,
|
|
476
|
+
{ userId: creator, username: creator },
|
|
477
|
+
);
|
|
478
|
+
try {
|
|
479
|
+
validateWorkflowDataEdges(compiledDsl as any);
|
|
480
|
+
} catch (error) {
|
|
481
|
+
throw new BadRequestException(
|
|
482
|
+
`Invalid node dependency: ${
|
|
483
|
+
error instanceof Error ? error.message : error
|
|
484
|
+
}`,
|
|
485
|
+
);
|
|
486
|
+
}
|
|
487
|
+
|
|
302
488
|
// Validate webhook path collisions across other published workflows
|
|
303
|
-
const webhookConfigs = this.extractWebhookConfigs(
|
|
489
|
+
const webhookConfigs = this.extractWebhookConfigs(compiledDsl);
|
|
304
490
|
if (webhookConfigs.length > 0) {
|
|
305
491
|
const otherPublished = await this.prisma.workflow.findMany({
|
|
306
492
|
where: { status: 'PUBLISHED', id: { not: workflowId } },
|
|
307
|
-
select: {
|
|
493
|
+
select: {
|
|
494
|
+
id: true,
|
|
495
|
+
name: true,
|
|
496
|
+
versions: {
|
|
497
|
+
orderBy: { version: 'desc' },
|
|
498
|
+
take: 1,
|
|
499
|
+
select: { dsl: true },
|
|
500
|
+
},
|
|
501
|
+
},
|
|
308
502
|
});
|
|
309
503
|
for (const cfg of webhookConfigs) {
|
|
310
|
-
if (!cfg.secret) {
|
|
504
|
+
if (cfg.verificationMode === 'HMAC' && !cfg.secret) {
|
|
311
505
|
throw new Error(
|
|
312
506
|
`webhook_trigger path="${cfg.method} ${cfg.path}" requires a secret (HMAC strict mode)`,
|
|
313
507
|
);
|
|
314
508
|
}
|
|
315
509
|
const conflict = otherPublished.find((w) =>
|
|
316
|
-
this.extractWebhookConfigs(w.dsl).some(
|
|
510
|
+
this.extractWebhookConfigs(w.versions[0]?.dsl).some(
|
|
317
511
|
(other) => other.path === cfg.path && other.method === cfg.method,
|
|
318
512
|
),
|
|
319
513
|
);
|
|
@@ -337,7 +531,7 @@ export class WorkflowService {
|
|
|
337
531
|
data: {
|
|
338
532
|
workflowId,
|
|
339
533
|
version: nextVersion,
|
|
340
|
-
dsl:
|
|
534
|
+
dsl: compiledDsl as unknown as Prisma.InputJsonValue,
|
|
341
535
|
prompt: data.changeSummary,
|
|
342
536
|
changeSummary: data.changeSummary,
|
|
343
537
|
creator,
|
|
@@ -349,17 +543,34 @@ export class WorkflowService {
|
|
|
349
543
|
data: { status: 'PUBLISHED' },
|
|
350
544
|
});
|
|
351
545
|
|
|
546
|
+
await tx.audit.create({
|
|
547
|
+
data: {
|
|
548
|
+
creator,
|
|
549
|
+
authorName: creator,
|
|
550
|
+
action: 'PUBLISH_WORKFLOW_VERSION',
|
|
551
|
+
resource: 'workflow',
|
|
552
|
+
resourceId: String(workflowId),
|
|
553
|
+
data: JSON.stringify({
|
|
554
|
+
workflowVersionId: String(version.id),
|
|
555
|
+
version: nextVersion,
|
|
556
|
+
configHashes: compiledDsl.nodes.flatMap((node) =>
|
|
557
|
+
node.source?.configHash ? [node.source.configHash] : [],
|
|
558
|
+
),
|
|
559
|
+
}),
|
|
560
|
+
},
|
|
561
|
+
});
|
|
562
|
+
|
|
352
563
|
return version;
|
|
353
564
|
});
|
|
354
565
|
|
|
355
566
|
// Cron schedule lifecycle: register/update if cron_trigger present, delete otherwise
|
|
356
|
-
const cronConfig = this.extractCronConfig(
|
|
567
|
+
const cronConfig = this.extractCronConfig(result.dsl);
|
|
357
568
|
try {
|
|
358
569
|
if (cronConfig) {
|
|
359
570
|
await this.temporalService.upsertCronSchedule({
|
|
360
571
|
workflowId: Number(workflowId),
|
|
361
572
|
versionId: Number(result.id),
|
|
362
|
-
dsl:
|
|
573
|
+
dsl: result.dsl,
|
|
363
574
|
cron: cronConfig.cron,
|
|
364
575
|
timezone: cronConfig.timezone,
|
|
365
576
|
});
|
|
@@ -498,7 +709,11 @@ export class WorkflowService {
|
|
|
498
709
|
|
|
499
710
|
async executeWorkflow(
|
|
500
711
|
workflowId: bigint,
|
|
501
|
-
dto: {
|
|
712
|
+
dto: {
|
|
713
|
+
workflow?: Record<string, any>;
|
|
714
|
+
versionId?: number;
|
|
715
|
+
workflowVersionId?: bigint;
|
|
716
|
+
},
|
|
502
717
|
creator: string,
|
|
503
718
|
temporalService: any,
|
|
504
719
|
) {
|
|
@@ -523,7 +738,11 @@ export class WorkflowService {
|
|
|
523
738
|
|
|
524
739
|
// Determine which version to use
|
|
525
740
|
let version;
|
|
526
|
-
if (dto.
|
|
741
|
+
if (dto.workflowVersionId) {
|
|
742
|
+
version = await this.prisma.workflowVersion.findFirst({
|
|
743
|
+
where: { id: dto.workflowVersionId, workflowId },
|
|
744
|
+
});
|
|
745
|
+
} else if (dto.versionId) {
|
|
527
746
|
version = await this.prisma.workflowVersion.findFirst({
|
|
528
747
|
where: { workflowId, version: dto.versionId },
|
|
529
748
|
});
|
|
@@ -533,13 +752,15 @@ export class WorkflowService {
|
|
|
533
752
|
|
|
534
753
|
if (!version) throw new NotFoundException('No published version found');
|
|
535
754
|
|
|
755
|
+
const executionContext = createWorkflowExecutionState(dto.workflow);
|
|
756
|
+
|
|
536
757
|
// Create a WorkflowInstance record
|
|
537
758
|
const instance = await this.prisma.workflowInstance.create({
|
|
538
759
|
data: {
|
|
539
760
|
workflowId,
|
|
540
761
|
versionId: version.id,
|
|
541
762
|
status: 'PENDING',
|
|
542
|
-
context:
|
|
763
|
+
context: executionContext,
|
|
543
764
|
creator,
|
|
544
765
|
},
|
|
545
766
|
});
|
|
@@ -550,7 +771,7 @@ export class WorkflowService {
|
|
|
550
771
|
workflowId: Number(workflowId),
|
|
551
772
|
versionId: Number(version.id),
|
|
552
773
|
dsl: version.dsl,
|
|
553
|
-
context:
|
|
774
|
+
context: executionContext,
|
|
554
775
|
});
|
|
555
776
|
|
|
556
777
|
// Update instance with Temporal run ID
|
|
@@ -562,14 +783,15 @@ export class WorkflowService {
|
|
|
562
783
|
return {
|
|
563
784
|
instanceId: instance.id.toString(),
|
|
564
785
|
temporalRunId,
|
|
786
|
+
workflowVersionId: version.id.toString(),
|
|
565
787
|
status: 'PENDING',
|
|
566
788
|
};
|
|
567
789
|
}
|
|
568
790
|
|
|
569
791
|
/**
|
|
570
792
|
* Webhook trigger entry point. Looks up published workflows whose DSL contains a
|
|
571
|
-
* webhook_trigger node matching (path, method),
|
|
572
|
-
*
|
|
793
|
+
* webhook_trigger node matching (path, method), applies the trigger's configured
|
|
794
|
+
* request verification, and starts a workflow instance per accepted match.
|
|
573
795
|
*
|
|
574
796
|
* Returns the list of created instance IDs. Throws:
|
|
575
797
|
* - NotFoundException when no published workflow listens on this path/method
|
|
@@ -585,19 +807,8 @@ export class WorkflowService {
|
|
|
585
807
|
headers: Record<string, any>;
|
|
586
808
|
query: Record<string, any>;
|
|
587
809
|
}): Promise<{ instanceIds: string[] }> {
|
|
588
|
-
// 1)
|
|
589
|
-
|
|
590
|
-
if (
|
|
591
|
-
!input.timestampHeader ||
|
|
592
|
-
!Number.isFinite(tsMs) ||
|
|
593
|
-
Math.abs(Date.now() - tsMs) > 5 * 60 * 1000
|
|
594
|
-
) {
|
|
595
|
-
throw new UnauthorizedException(
|
|
596
|
-
'Invalid or expired X-Workflow-Timestamp',
|
|
597
|
-
);
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
// 2) Lookup matching published + enabled workflows
|
|
810
|
+
// 1) Lookup matching published + enabled workflows. Verification is configured
|
|
811
|
+
// per trigger, so the matching trigger must be known before headers are checked.
|
|
601
812
|
const published = await this.prisma.workflow.findMany({
|
|
602
813
|
where: { status: 'PUBLISHED', isEnabled: true },
|
|
603
814
|
include: {
|
|
@@ -609,23 +820,26 @@ export class WorkflowService {
|
|
|
609
820
|
workflowId: bigint;
|
|
610
821
|
versionId: bigint;
|
|
611
822
|
dsl: any;
|
|
612
|
-
secret
|
|
823
|
+
secret?: string;
|
|
824
|
+
verificationMode: 'HMAC' | 'NONE';
|
|
613
825
|
};
|
|
614
826
|
const matches: Match[] = [];
|
|
615
827
|
for (const wf of published) {
|
|
616
828
|
const version = wf.versions[0];
|
|
617
|
-
|
|
618
|
-
|
|
829
|
+
if (!version) continue;
|
|
830
|
+
const dsl = version.dsl;
|
|
619
831
|
const cfgs = this.extractWebhookConfigs(dsl);
|
|
620
832
|
const cfg = cfgs.find(
|
|
621
833
|
(c) => c.path === input.path && c.method === input.method,
|
|
622
834
|
);
|
|
623
|
-
if (!cfg
|
|
835
|
+
if (!cfg) continue;
|
|
836
|
+
if (cfg.verificationMode === 'HMAC' && !cfg.secret) continue;
|
|
624
837
|
matches.push({
|
|
625
838
|
workflowId: wf.id,
|
|
626
|
-
versionId: version
|
|
839
|
+
versionId: version.id,
|
|
627
840
|
dsl,
|
|
628
841
|
secret: cfg.secret,
|
|
842
|
+
verificationMode: cfg.verificationMode,
|
|
629
843
|
});
|
|
630
844
|
}
|
|
631
845
|
|
|
@@ -635,10 +849,26 @@ export class WorkflowService {
|
|
|
635
849
|
);
|
|
636
850
|
}
|
|
637
851
|
|
|
638
|
-
//
|
|
639
|
-
|
|
852
|
+
// 2) Preserve strict HMAC verification for existing triggers. A missing
|
|
853
|
+
// verificationMode is normalized to HMAC by extractWebhookConfigs.
|
|
854
|
+
const signedMatches = matches.filter(
|
|
855
|
+
(match) => match.verificationMode === 'HMAC',
|
|
856
|
+
);
|
|
857
|
+
if (signedMatches.length > 0) {
|
|
858
|
+
const tsMs = Number(input.timestampHeader) * 1000;
|
|
859
|
+
if (
|
|
860
|
+
!input.timestampHeader ||
|
|
861
|
+
!Number.isFinite(tsMs) ||
|
|
862
|
+
Math.abs(Date.now() - tsMs) > 5 * 60 * 1000
|
|
863
|
+
) {
|
|
864
|
+
throw new UnauthorizedException(
|
|
865
|
+
'Invalid or expired X-Workflow-Timestamp',
|
|
866
|
+
);
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
for (const m of signedMatches) {
|
|
640
870
|
const ok = verifyWebhookSignature(
|
|
641
|
-
m.secret
|
|
871
|
+
m.secret!,
|
|
642
872
|
input.timestampHeader!,
|
|
643
873
|
input.rawBody,
|
|
644
874
|
input.signatureHeader,
|
|
@@ -648,8 +878,8 @@ export class WorkflowService {
|
|
|
648
878
|
}
|
|
649
879
|
}
|
|
650
880
|
|
|
651
|
-
//
|
|
652
|
-
const
|
|
881
|
+
// 3) Trigger executions in parallel
|
|
882
|
+
const workflowData = {
|
|
653
883
|
headers: input.headers,
|
|
654
884
|
query: input.query,
|
|
655
885
|
body: input.body,
|
|
@@ -659,7 +889,7 @@ export class WorkflowService {
|
|
|
659
889
|
matches.map((m) =>
|
|
660
890
|
this.executeWorkflow(
|
|
661
891
|
m.workflowId,
|
|
662
|
-
{
|
|
892
|
+
{ workflow: workflowData, workflowVersionId: m.versionId },
|
|
663
893
|
'webhook',
|
|
664
894
|
this.temporalService,
|
|
665
895
|
),
|
|
@@ -673,7 +903,7 @@ export class WorkflowService {
|
|
|
673
903
|
const instance = await this.prisma.workflowInstance.findUnique({
|
|
674
904
|
where: { id: instanceId },
|
|
675
905
|
include: {
|
|
676
|
-
workflow: { select: { name: true
|
|
906
|
+
workflow: { select: { name: true } },
|
|
677
907
|
nodeExecutions: {
|
|
678
908
|
orderBy: { createdAt: 'asc' },
|
|
679
909
|
},
|
|
@@ -692,11 +922,6 @@ export class WorkflowService {
|
|
|
692
922
|
dsl = version?.dsl || null;
|
|
693
923
|
}
|
|
694
924
|
|
|
695
|
-
// Fallback: use DSL from the workflow itself
|
|
696
|
-
if (!dsl && instance.workflow.dsl) {
|
|
697
|
-
dsl = instance.workflow.dsl;
|
|
698
|
-
}
|
|
699
|
-
|
|
700
925
|
return {
|
|
701
926
|
...instance,
|
|
702
927
|
workflow: { name: instance.workflow.name },
|
|
@@ -740,12 +965,18 @@ export class WorkflowService {
|
|
|
740
965
|
throw new Error('Can only retry FAILED instances');
|
|
741
966
|
}
|
|
742
967
|
|
|
743
|
-
|
|
968
|
+
const executionState = instance.context as Record<string, any>;
|
|
969
|
+
// Create a new instance with the same immutable Workflow data.
|
|
744
970
|
return this.executeWorkflow(
|
|
745
971
|
instance.workflowId,
|
|
746
972
|
{
|
|
747
|
-
|
|
748
|
-
|
|
973
|
+
workflow:
|
|
974
|
+
executionState.workflow &&
|
|
975
|
+
typeof executionState.workflow === 'object' &&
|
|
976
|
+
!Array.isArray(executionState.workflow)
|
|
977
|
+
? executionState.workflow
|
|
978
|
+
: {},
|
|
979
|
+
workflowVersionId: instance.versionId,
|
|
749
980
|
},
|
|
750
981
|
creator,
|
|
751
982
|
temporalService,
|
|
@@ -778,34 +1009,32 @@ export class WorkflowService {
|
|
|
778
1009
|
instanceId: bigint,
|
|
779
1010
|
dto: { nodeId: string; approved: boolean; comment?: string },
|
|
780
1011
|
approverId: string,
|
|
781
|
-
|
|
1012
|
+
_temporalService: any,
|
|
782
1013
|
) {
|
|
783
|
-
const
|
|
784
|
-
where: {
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
const nodeExecution = await this.prisma.workflowNodeExecution.findUnique({
|
|
792
|
-
where: { instanceId_nodeId: { instanceId, nodeId: dto.nodeId } },
|
|
1014
|
+
const request = await this.prisma.approvalRequest.findUnique({
|
|
1015
|
+
where: {
|
|
1016
|
+
workflowInstanceId_nodeId: {
|
|
1017
|
+
workflowInstanceId: instanceId,
|
|
1018
|
+
nodeId: dto.nodeId,
|
|
1019
|
+
},
|
|
1020
|
+
},
|
|
793
1021
|
});
|
|
794
|
-
if (!
|
|
795
|
-
|
|
796
|
-
const approvers: string[] = (nodeExecution.input as any)?.approvers || [];
|
|
797
|
-
if (!approvers.includes(approverId)) {
|
|
798
|
-
throw new UnauthorizedException(
|
|
799
|
-
`${approverId} is not an approver for this node`,
|
|
800
|
-
);
|
|
1022
|
+
if (!request || request.status !== 'PENDING') {
|
|
1023
|
+
throw new NotFoundException('Open approval request not found');
|
|
801
1024
|
}
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
comment: dto.comment,
|
|
808
|
-
});
|
|
809
|
-
return { success: true };
|
|
1025
|
+
return this.humanApprovalService.submitDecision(
|
|
1026
|
+
request.id,
|
|
1027
|
+
{ decision: dto.approved ? 'APPROVE' : 'REJECT', comment: dto.comment },
|
|
1028
|
+
{ userId: approverId },
|
|
1029
|
+
);
|
|
810
1030
|
}
|
|
811
1031
|
}
|
|
1032
|
+
|
|
1033
|
+
function createWorkflowExecutionState(
|
|
1034
|
+
value: Record<string, any> | undefined,
|
|
1035
|
+
): Record<string, any> {
|
|
1036
|
+
return {
|
|
1037
|
+
workflow: value ?? {},
|
|
1038
|
+
nodes: {},
|
|
1039
|
+
};
|
|
1040
|
+
}
|