@gadmin2n/schematics 0.0.139 → 0.0.141
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/config/ui/Event.ts +1 -1
- 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/gen-jwt.ts +8 -1
- 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 +710 -121
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +125 -10
- 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/temporal.service.spec.ts +34 -1
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +26 -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 +512 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +368 -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-http-response.spec.ts +85 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.ts +157 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.spec.ts +59 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +27 -5
- 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 +493 -21
- package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +426 -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/PageHeader.tsx +46 -0
- 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/index.ts +1 -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.test.ts +10 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +18 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +32 -3
- 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 +575 -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 +575 -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 +9 -15
- 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/list.tsx +141 -138
- 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 +175 -119
- 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 +209 -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/page/list.tsx +47 -150
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permissionReadme/index.tsx +21 -20
- 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 +115 -118
- 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/role/list.tsx +61 -64
- 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/user/list.tsx +187 -200
- 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 +210 -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 +283 -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 +180 -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 +29 -35
- 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 +4 -3
- 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 +9 -17
- 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 +135 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.tsx +273 -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 +81 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +281 -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.test.tsx +152 -0
- package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +438 -141
- 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 +77 -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 +40 -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,14 @@ 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
|
+
responseMode: 'IMMEDIATE' | 'WAIT_FOR_RESULT';
|
|
57
|
+
responseTimeoutSeconds: number;
|
|
58
|
+
}> {
|
|
43
59
|
if (!Array.isArray(dsl?.nodes)) return [];
|
|
44
60
|
return dsl.nodes
|
|
45
61
|
.filter(
|
|
@@ -50,6 +66,18 @@ export class WorkflowService {
|
|
|
50
66
|
path: n.config.path,
|
|
51
67
|
method: n.config.method,
|
|
52
68
|
secret: n.config.secret,
|
|
69
|
+
verificationMode:
|
|
70
|
+
n.config.verificationMode === 'NONE' ? 'NONE' : 'HMAC',
|
|
71
|
+
responseMode:
|
|
72
|
+
n.config.responseMode === 'WAIT_FOR_RESULT'
|
|
73
|
+
? 'WAIT_FOR_RESULT'
|
|
74
|
+
: 'IMMEDIATE',
|
|
75
|
+
responseTimeoutSeconds:
|
|
76
|
+
Number.isInteger(n.config.responseTimeoutSeconds) &&
|
|
77
|
+
n.config.responseTimeoutSeconds >= 1 &&
|
|
78
|
+
n.config.responseTimeoutSeconds <= 300
|
|
79
|
+
? n.config.responseTimeoutSeconds
|
|
80
|
+
: 60,
|
|
53
81
|
}));
|
|
54
82
|
}
|
|
55
83
|
|
|
@@ -142,6 +170,87 @@ export class WorkflowService {
|
|
|
142
170
|
return { items: enrichedItems, total };
|
|
143
171
|
}
|
|
144
172
|
|
|
173
|
+
async findCallableWorkflows(resultType = 'APPROVAL_SUBJECTS') {
|
|
174
|
+
const workflows = await this.prisma.workflow.findMany({
|
|
175
|
+
where: { status: 'PUBLISHED', isEnabled: true },
|
|
176
|
+
orderBy: { name: 'asc' },
|
|
177
|
+
include: {
|
|
178
|
+
versions: {
|
|
179
|
+
orderBy: { version: 'desc' },
|
|
180
|
+
take: 1,
|
|
181
|
+
select: { dsl: true },
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
});
|
|
185
|
+
return workflows.flatMap((workflow) => {
|
|
186
|
+
try {
|
|
187
|
+
const descriptor = describeCallableWorkflow(workflow.versions[0]?.dsl);
|
|
188
|
+
if (
|
|
189
|
+
!descriptor ||
|
|
190
|
+
descriptor.mode !== 'RETURN' ||
|
|
191
|
+
descriptor.resultType !== resultType
|
|
192
|
+
)
|
|
193
|
+
return [];
|
|
194
|
+
return [
|
|
195
|
+
{
|
|
196
|
+
id: String(workflow.id),
|
|
197
|
+
name: workflow.name,
|
|
198
|
+
description: workflow.description,
|
|
199
|
+
inputParameters: descriptor.inputParameters,
|
|
200
|
+
resultType: descriptor.resultType,
|
|
201
|
+
},
|
|
202
|
+
];
|
|
203
|
+
} catch {
|
|
204
|
+
return [];
|
|
205
|
+
}
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
async findExternalInteractionOptions() {
|
|
210
|
+
const workflows = await this.prisma.workflow.findMany({
|
|
211
|
+
where: { status: 'PUBLISHED', isEnabled: true },
|
|
212
|
+
orderBy: { name: 'asc' },
|
|
213
|
+
include: {
|
|
214
|
+
versions: {
|
|
215
|
+
orderBy: { version: 'desc' },
|
|
216
|
+
take: 1,
|
|
217
|
+
select: { dsl: true },
|
|
218
|
+
},
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
const dispatchWorkflows: Array<{ id: string; name: string }> = [];
|
|
222
|
+
const callbackWorkflows: Array<{ id: string; name: string }> = [];
|
|
223
|
+
for (const workflow of workflows) {
|
|
224
|
+
const dsl = workflow.versions[0]?.dsl;
|
|
225
|
+
try {
|
|
226
|
+
if (describeCallableWorkflow(dsl)?.mode === 'ONE_WAY') {
|
|
227
|
+
dispatchWorkflows.push({
|
|
228
|
+
id: String(workflow.id),
|
|
229
|
+
name: workflow.name,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
} catch {
|
|
233
|
+
// Invalid callable Workflows are not selectable.
|
|
234
|
+
}
|
|
235
|
+
const nodes =
|
|
236
|
+
dsl &&
|
|
237
|
+
typeof dsl === 'object' &&
|
|
238
|
+
!Array.isArray(dsl) &&
|
|
239
|
+
Array.isArray((dsl as { nodes?: unknown }).nodes)
|
|
240
|
+
? (dsl as { nodes: Array<{ type?: string }> }).nodes ?? []
|
|
241
|
+
: [];
|
|
242
|
+
if (
|
|
243
|
+
nodes.filter((node) => node.type === 'webhook_trigger').length === 1
|
|
244
|
+
) {
|
|
245
|
+
callbackWorkflows.push({
|
|
246
|
+
id: String(workflow.id),
|
|
247
|
+
name: workflow.name,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return { dispatchWorkflows, callbackWorkflows };
|
|
252
|
+
}
|
|
253
|
+
|
|
145
254
|
async findOne(id: bigint) {
|
|
146
255
|
const workflow = await this.prisma.workflow.findUnique({
|
|
147
256
|
where: { id },
|
|
@@ -179,11 +288,25 @@ export class WorkflowService {
|
|
|
179
288
|
}
|
|
180
289
|
|
|
181
290
|
async saveDraft(id: bigint, dsl: any) {
|
|
182
|
-
const workflow = await this.prisma.workflow.findUnique({
|
|
291
|
+
const workflow = await this.prisma.workflow.findUnique({
|
|
292
|
+
where: { id },
|
|
293
|
+
include: {
|
|
294
|
+
versions: {
|
|
295
|
+
orderBy: { version: 'desc' },
|
|
296
|
+
take: 1,
|
|
297
|
+
select: { dsl: true },
|
|
298
|
+
},
|
|
299
|
+
},
|
|
300
|
+
});
|
|
183
301
|
if (!workflow) throw new NotFoundException('Workflow not found');
|
|
302
|
+
const latestPublishedDsl = workflow.versions?.[0]?.dsl;
|
|
303
|
+
const status =
|
|
304
|
+
latestPublishedDsl && areWorkflowDslSourcesEqual(dsl, latestPublishedDsl)
|
|
305
|
+
? 'PUBLISHED'
|
|
306
|
+
: 'DRAFT';
|
|
184
307
|
return this.prisma.workflow.update({
|
|
185
308
|
where: { id },
|
|
186
|
-
data: { dsl, status
|
|
309
|
+
data: { dsl, status },
|
|
187
310
|
});
|
|
188
311
|
}
|
|
189
312
|
|
|
@@ -228,7 +351,29 @@ export class WorkflowService {
|
|
|
228
351
|
);
|
|
229
352
|
}
|
|
230
353
|
|
|
231
|
-
return this.prisma
|
|
354
|
+
return this.prisma.$transaction(async (tx) => {
|
|
355
|
+
const interactions = await tx.externalInteraction.findMany({
|
|
356
|
+
where: {
|
|
357
|
+
OR: [
|
|
358
|
+
{ workflowInstance: { workflowId: id } },
|
|
359
|
+
{ workflowVersion: { workflowId: id } },
|
|
360
|
+
],
|
|
361
|
+
},
|
|
362
|
+
select: { id: true },
|
|
363
|
+
});
|
|
364
|
+
const interactionIds = interactions.map((interaction) => interaction.id);
|
|
365
|
+
|
|
366
|
+
if (interactionIds.length) {
|
|
367
|
+
const where = { interactionId: { in: interactionIds } };
|
|
368
|
+
await tx.externalInteractionSignalOutbox.deleteMany({ where });
|
|
369
|
+
await tx.externalInteractionEvent.deleteMany({ where });
|
|
370
|
+
await tx.externalInteraction.deleteMany({
|
|
371
|
+
where: { id: { in: interactionIds } },
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
return tx.workflow.delete({ where: { id } });
|
|
376
|
+
});
|
|
232
377
|
}
|
|
233
378
|
|
|
234
379
|
async getVersions(workflowId: bigint) {
|
|
@@ -261,22 +406,34 @@ export class WorkflowService {
|
|
|
261
406
|
) {
|
|
262
407
|
const workflow = await this.prisma.workflow.findUnique({
|
|
263
408
|
where: { id: workflowId },
|
|
409
|
+
include: {
|
|
410
|
+
versions: {
|
|
411
|
+
orderBy: { version: 'desc' },
|
|
412
|
+
take: 1,
|
|
413
|
+
select: { dsl: true },
|
|
414
|
+
},
|
|
415
|
+
},
|
|
264
416
|
});
|
|
265
417
|
if (!workflow) throw new NotFoundException('Workflow not found');
|
|
266
418
|
|
|
267
419
|
// Use workflow.dsl if available; otherwise fall back to latest version's DSL
|
|
268
420
|
let dslToPublish = workflow.dsl;
|
|
269
421
|
if (!dslToPublish) {
|
|
270
|
-
|
|
271
|
-
where: { workflowId },
|
|
272
|
-
orderBy: { version: 'desc' },
|
|
273
|
-
select: { dsl: true },
|
|
274
|
-
});
|
|
275
|
-
dslToPublish = latestVersion?.dsl ?? null;
|
|
422
|
+
dslToPublish = workflow.versions?.[0]?.dsl ?? null;
|
|
276
423
|
}
|
|
277
424
|
if (!dslToPublish) {
|
|
278
425
|
throw new NotFoundException('No draft DSL to publish');
|
|
279
426
|
}
|
|
427
|
+
const latestPublishedDsl = workflow.versions?.[0]?.dsl;
|
|
428
|
+
if (
|
|
429
|
+
latestPublishedDsl &&
|
|
430
|
+
areWorkflowDslSourcesEqual(dslToPublish, latestPublishedDsl)
|
|
431
|
+
) {
|
|
432
|
+
throw new BadRequestException({
|
|
433
|
+
code: 'WORKFLOW_DSL_UNCHANGED',
|
|
434
|
+
message: '保存后的 Workflow DSL 与最新发布版本相同,无需再次发布',
|
|
435
|
+
});
|
|
436
|
+
}
|
|
280
437
|
|
|
281
438
|
// Structural + cycle validation. Reject malformed/cyclic DSL up-front so the
|
|
282
439
|
// worker's executeGraph never has to deal with them at runtime.
|
|
@@ -286,11 +443,38 @@ export class WorkflowService {
|
|
|
286
443
|
throw new BadRequestException(`Invalid DSL: ${err?.message ?? err}`);
|
|
287
444
|
}
|
|
288
445
|
|
|
289
|
-
//
|
|
290
|
-
//
|
|
291
|
-
//
|
|
292
|
-
|
|
293
|
-
const
|
|
446
|
+
// Validate source handles against the same node-type metadata consumed by
|
|
447
|
+
// the canvas. This also supports project-specific node types and output
|
|
448
|
+
// declarations without requiring a nest-common release.
|
|
449
|
+
const handleDsl = dslToPublish as any;
|
|
450
|
+
const nodeTypes = await this.prisma.workflowNodeType.findMany({
|
|
451
|
+
select: { type: true, outputs: true },
|
|
452
|
+
});
|
|
453
|
+
const outputsMap = Object.fromEntries(
|
|
454
|
+
nodeTypes.map((nodeType) => [
|
|
455
|
+
nodeType.type,
|
|
456
|
+
nodeType.outputs === null
|
|
457
|
+
? null
|
|
458
|
+
: Array.isArray(nodeType.outputs)
|
|
459
|
+
? nodeType.outputs.filter(
|
|
460
|
+
(output): output is string => typeof output === 'string',
|
|
461
|
+
)
|
|
462
|
+
: [],
|
|
463
|
+
]),
|
|
464
|
+
) as NodeOutputsMap;
|
|
465
|
+
const handleErrors = validateWorkflowHandles(
|
|
466
|
+
{
|
|
467
|
+
...handleDsl,
|
|
468
|
+
edges: (handleDsl.edges ?? [])
|
|
469
|
+
.filter((edge: any) => !edge.kind || edge.kind === 'FLOW')
|
|
470
|
+
.map((edge: any) =>
|
|
471
|
+
['response-out', 'result-out'].includes(edge.sourceHandle)
|
|
472
|
+
? { ...edge, sourceHandle: undefined }
|
|
473
|
+
: edge,
|
|
474
|
+
),
|
|
475
|
+
},
|
|
476
|
+
outputsMap,
|
|
477
|
+
);
|
|
294
478
|
if (handleErrors.length > 0) {
|
|
295
479
|
throw new BadRequestException({
|
|
296
480
|
message: 'DSL validation failed: invalid edge sourceHandle(s)',
|
|
@@ -299,21 +483,43 @@ export class WorkflowService {
|
|
|
299
483
|
});
|
|
300
484
|
}
|
|
301
485
|
|
|
486
|
+
const compiledDsl = await this.workflowCompiler.compile(
|
|
487
|
+
dslToPublish as unknown as DraftWorkflowDsl,
|
|
488
|
+
{ userId: creator, username: creator },
|
|
489
|
+
);
|
|
490
|
+
try {
|
|
491
|
+
validateWorkflowDataEdges(compiledDsl as any);
|
|
492
|
+
} catch (error) {
|
|
493
|
+
throw new BadRequestException(
|
|
494
|
+
`Invalid node dependency: ${
|
|
495
|
+
error instanceof Error ? error.message : error
|
|
496
|
+
}`,
|
|
497
|
+
);
|
|
498
|
+
}
|
|
499
|
+
|
|
302
500
|
// Validate webhook path collisions across other published workflows
|
|
303
|
-
const webhookConfigs = this.extractWebhookConfigs(
|
|
501
|
+
const webhookConfigs = this.extractWebhookConfigs(compiledDsl);
|
|
304
502
|
if (webhookConfigs.length > 0) {
|
|
305
503
|
const otherPublished = await this.prisma.workflow.findMany({
|
|
306
504
|
where: { status: 'PUBLISHED', id: { not: workflowId } },
|
|
307
|
-
select: {
|
|
505
|
+
select: {
|
|
506
|
+
id: true,
|
|
507
|
+
name: true,
|
|
508
|
+
versions: {
|
|
509
|
+
orderBy: { version: 'desc' },
|
|
510
|
+
take: 1,
|
|
511
|
+
select: { dsl: true },
|
|
512
|
+
},
|
|
513
|
+
},
|
|
308
514
|
});
|
|
309
515
|
for (const cfg of webhookConfigs) {
|
|
310
|
-
if (!cfg.secret) {
|
|
516
|
+
if (cfg.verificationMode === 'HMAC' && !cfg.secret) {
|
|
311
517
|
throw new Error(
|
|
312
518
|
`webhook_trigger path="${cfg.method} ${cfg.path}" requires a secret (HMAC strict mode)`,
|
|
313
519
|
);
|
|
314
520
|
}
|
|
315
521
|
const conflict = otherPublished.find((w) =>
|
|
316
|
-
this.extractWebhookConfigs(w.dsl).some(
|
|
522
|
+
this.extractWebhookConfigs(w.versions[0]?.dsl).some(
|
|
317
523
|
(other) => other.path === cfg.path && other.method === cfg.method,
|
|
318
524
|
),
|
|
319
525
|
);
|
|
@@ -337,7 +543,7 @@ export class WorkflowService {
|
|
|
337
543
|
data: {
|
|
338
544
|
workflowId,
|
|
339
545
|
version: nextVersion,
|
|
340
|
-
dsl:
|
|
546
|
+
dsl: compiledDsl as unknown as Prisma.InputJsonValue,
|
|
341
547
|
prompt: data.changeSummary,
|
|
342
548
|
changeSummary: data.changeSummary,
|
|
343
549
|
creator,
|
|
@@ -349,17 +555,34 @@ export class WorkflowService {
|
|
|
349
555
|
data: { status: 'PUBLISHED' },
|
|
350
556
|
});
|
|
351
557
|
|
|
558
|
+
await tx.audit.create({
|
|
559
|
+
data: {
|
|
560
|
+
creator,
|
|
561
|
+
authorName: creator,
|
|
562
|
+
action: 'PUBLISH_WORKFLOW_VERSION',
|
|
563
|
+
resource: 'workflow',
|
|
564
|
+
resourceId: String(workflowId),
|
|
565
|
+
data: JSON.stringify({
|
|
566
|
+
workflowVersionId: String(version.id),
|
|
567
|
+
version: nextVersion,
|
|
568
|
+
configHashes: compiledDsl.nodes.flatMap((node) =>
|
|
569
|
+
node.source?.configHash ? [node.source.configHash] : [],
|
|
570
|
+
),
|
|
571
|
+
}),
|
|
572
|
+
},
|
|
573
|
+
});
|
|
574
|
+
|
|
352
575
|
return version;
|
|
353
576
|
});
|
|
354
577
|
|
|
355
578
|
// Cron schedule lifecycle: register/update if cron_trigger present, delete otherwise
|
|
356
|
-
const cronConfig = this.extractCronConfig(
|
|
579
|
+
const cronConfig = this.extractCronConfig(result.dsl);
|
|
357
580
|
try {
|
|
358
581
|
if (cronConfig) {
|
|
359
582
|
await this.temporalService.upsertCronSchedule({
|
|
360
583
|
workflowId: Number(workflowId),
|
|
361
584
|
versionId: Number(result.id),
|
|
362
|
-
dsl:
|
|
585
|
+
dsl: result.dsl,
|
|
363
586
|
cron: cronConfig.cron,
|
|
364
587
|
timezone: cronConfig.timezone,
|
|
365
588
|
});
|
|
@@ -498,7 +721,11 @@ export class WorkflowService {
|
|
|
498
721
|
|
|
499
722
|
async executeWorkflow(
|
|
500
723
|
workflowId: bigint,
|
|
501
|
-
dto: {
|
|
724
|
+
dto: {
|
|
725
|
+
workflow?: Record<string, any>;
|
|
726
|
+
versionId?: number;
|
|
727
|
+
workflowVersionId?: bigint;
|
|
728
|
+
},
|
|
502
729
|
creator: string,
|
|
503
730
|
temporalService: any,
|
|
504
731
|
) {
|
|
@@ -523,7 +750,11 @@ export class WorkflowService {
|
|
|
523
750
|
|
|
524
751
|
// Determine which version to use
|
|
525
752
|
let version;
|
|
526
|
-
if (dto.
|
|
753
|
+
if (dto.workflowVersionId) {
|
|
754
|
+
version = await this.prisma.workflowVersion.findFirst({
|
|
755
|
+
where: { id: dto.workflowVersionId, workflowId },
|
|
756
|
+
});
|
|
757
|
+
} else if (dto.versionId) {
|
|
527
758
|
version = await this.prisma.workflowVersion.findFirst({
|
|
528
759
|
where: { workflowId, version: dto.versionId },
|
|
529
760
|
});
|
|
@@ -533,13 +764,15 @@ export class WorkflowService {
|
|
|
533
764
|
|
|
534
765
|
if (!version) throw new NotFoundException('No published version found');
|
|
535
766
|
|
|
767
|
+
const executionContext = createWorkflowExecutionState(dto.workflow);
|
|
768
|
+
|
|
536
769
|
// Create a WorkflowInstance record
|
|
537
770
|
const instance = await this.prisma.workflowInstance.create({
|
|
538
771
|
data: {
|
|
539
772
|
workflowId,
|
|
540
773
|
versionId: version.id,
|
|
541
774
|
status: 'PENDING',
|
|
542
|
-
context:
|
|
775
|
+
context: executionContext,
|
|
543
776
|
creator,
|
|
544
777
|
},
|
|
545
778
|
});
|
|
@@ -550,7 +783,7 @@ export class WorkflowService {
|
|
|
550
783
|
workflowId: Number(workflowId),
|
|
551
784
|
versionId: Number(version.id),
|
|
552
785
|
dsl: version.dsl,
|
|
553
|
-
context:
|
|
786
|
+
context: executionContext,
|
|
554
787
|
});
|
|
555
788
|
|
|
556
789
|
// Update instance with Temporal run ID
|
|
@@ -562,14 +795,15 @@ export class WorkflowService {
|
|
|
562
795
|
return {
|
|
563
796
|
instanceId: instance.id.toString(),
|
|
564
797
|
temporalRunId,
|
|
798
|
+
workflowVersionId: version.id.toString(),
|
|
565
799
|
status: 'PENDING',
|
|
566
800
|
};
|
|
567
801
|
}
|
|
568
802
|
|
|
569
803
|
/**
|
|
570
804
|
* Webhook trigger entry point. Looks up published workflows whose DSL contains a
|
|
571
|
-
* webhook_trigger node matching (path, method),
|
|
572
|
-
*
|
|
805
|
+
* webhook_trigger node matching (path, method), applies the trigger's configured
|
|
806
|
+
* request verification, and starts a workflow instance per accepted match.
|
|
573
807
|
*
|
|
574
808
|
* Returns the list of created instance IDs. Throws:
|
|
575
809
|
* - NotFoundException when no published workflow listens on this path/method
|
|
@@ -584,20 +818,16 @@ export class WorkflowService {
|
|
|
584
818
|
body: any;
|
|
585
819
|
headers: Record<string, any>;
|
|
586
820
|
query: Record<string, any>;
|
|
587
|
-
}): Promise<{
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
);
|
|
598
|
-
}
|
|
599
|
-
|
|
600
|
-
// 2) Lookup matching published + enabled workflows
|
|
821
|
+
}): Promise<{
|
|
822
|
+
instanceIds: string[];
|
|
823
|
+
response?: {
|
|
824
|
+
statusCode: number;
|
|
825
|
+
headers: Record<string, string>;
|
|
826
|
+
body: unknown;
|
|
827
|
+
};
|
|
828
|
+
}> {
|
|
829
|
+
// 1) Lookup matching published + enabled workflows. Verification is configured
|
|
830
|
+
// per trigger, so the matching trigger must be known before headers are checked.
|
|
601
831
|
const published = await this.prisma.workflow.findMany({
|
|
602
832
|
where: { status: 'PUBLISHED', isEnabled: true },
|
|
603
833
|
include: {
|
|
@@ -609,23 +839,30 @@ export class WorkflowService {
|
|
|
609
839
|
workflowId: bigint;
|
|
610
840
|
versionId: bigint;
|
|
611
841
|
dsl: any;
|
|
612
|
-
secret
|
|
842
|
+
secret?: string;
|
|
843
|
+
verificationMode: 'HMAC' | 'NONE';
|
|
844
|
+
responseMode: 'IMMEDIATE' | 'WAIT_FOR_RESULT';
|
|
845
|
+
responseTimeoutSeconds: number;
|
|
613
846
|
};
|
|
614
847
|
const matches: Match[] = [];
|
|
615
848
|
for (const wf of published) {
|
|
616
849
|
const version = wf.versions[0];
|
|
617
|
-
|
|
618
|
-
|
|
850
|
+
if (!version) continue;
|
|
851
|
+
const dsl = version.dsl;
|
|
619
852
|
const cfgs = this.extractWebhookConfigs(dsl);
|
|
620
853
|
const cfg = cfgs.find(
|
|
621
854
|
(c) => c.path === input.path && c.method === input.method,
|
|
622
855
|
);
|
|
623
|
-
if (!cfg
|
|
856
|
+
if (!cfg) continue;
|
|
857
|
+
if (cfg.verificationMode === 'HMAC' && !cfg.secret) continue;
|
|
624
858
|
matches.push({
|
|
625
859
|
workflowId: wf.id,
|
|
626
|
-
versionId: version
|
|
860
|
+
versionId: version.id,
|
|
627
861
|
dsl,
|
|
628
862
|
secret: cfg.secret,
|
|
863
|
+
verificationMode: cfg.verificationMode,
|
|
864
|
+
responseMode: cfg.responseMode,
|
|
865
|
+
responseTimeoutSeconds: cfg.responseTimeoutSeconds,
|
|
629
866
|
});
|
|
630
867
|
}
|
|
631
868
|
|
|
@@ -635,10 +872,26 @@ export class WorkflowService {
|
|
|
635
872
|
);
|
|
636
873
|
}
|
|
637
874
|
|
|
638
|
-
//
|
|
639
|
-
|
|
875
|
+
// 2) Preserve strict HMAC verification for existing triggers. A missing
|
|
876
|
+
// verificationMode is normalized to HMAC by extractWebhookConfigs.
|
|
877
|
+
const signedMatches = matches.filter(
|
|
878
|
+
(match) => match.verificationMode === 'HMAC',
|
|
879
|
+
);
|
|
880
|
+
if (signedMatches.length > 0) {
|
|
881
|
+
const tsMs = Number(input.timestampHeader) * 1000;
|
|
882
|
+
if (
|
|
883
|
+
!input.timestampHeader ||
|
|
884
|
+
!Number.isFinite(tsMs) ||
|
|
885
|
+
Math.abs(Date.now() - tsMs) > 5 * 60 * 1000
|
|
886
|
+
) {
|
|
887
|
+
throw new UnauthorizedException(
|
|
888
|
+
'Invalid or expired X-Workflow-Timestamp',
|
|
889
|
+
);
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
for (const m of signedMatches) {
|
|
640
893
|
const ok = verifyWebhookSignature(
|
|
641
|
-
m.secret
|
|
894
|
+
m.secret!,
|
|
642
895
|
input.timestampHeader!,
|
|
643
896
|
input.rawBody,
|
|
644
897
|
input.signatureHeader,
|
|
@@ -648,8 +901,8 @@ export class WorkflowService {
|
|
|
648
901
|
}
|
|
649
902
|
}
|
|
650
903
|
|
|
651
|
-
//
|
|
652
|
-
const
|
|
904
|
+
// 3) Trigger executions in parallel
|
|
905
|
+
const workflowData = {
|
|
653
906
|
headers: input.headers,
|
|
654
907
|
query: input.query,
|
|
655
908
|
body: input.body,
|
|
@@ -659,21 +912,82 @@ export class WorkflowService {
|
|
|
659
912
|
matches.map((m) =>
|
|
660
913
|
this.executeWorkflow(
|
|
661
914
|
m.workflowId,
|
|
662
|
-
{
|
|
915
|
+
{ workflow: workflowData, workflowVersionId: m.versionId },
|
|
663
916
|
'webhook',
|
|
664
917
|
this.temporalService,
|
|
665
918
|
),
|
|
666
919
|
),
|
|
667
920
|
);
|
|
668
921
|
|
|
669
|
-
|
|
922
|
+
const instanceIds = results.map((result) => result.instanceId);
|
|
923
|
+
const waitingIndex = matches.findIndex(
|
|
924
|
+
(match) => match.responseMode === 'WAIT_FOR_RESULT',
|
|
925
|
+
);
|
|
926
|
+
if (waitingIndex === -1) return { instanceIds };
|
|
927
|
+
|
|
928
|
+
const match = matches[waitingIndex];
|
|
929
|
+
const execution = results[waitingIndex];
|
|
930
|
+
try {
|
|
931
|
+
const waited = await this.temporalService.waitForWorkflowResult(
|
|
932
|
+
execution.temporalRunId,
|
|
933
|
+
match.responseTimeoutSeconds * 1000,
|
|
934
|
+
);
|
|
935
|
+
if (waited.kind === 'TIMED_OUT') {
|
|
936
|
+
return {
|
|
937
|
+
instanceIds,
|
|
938
|
+
response: {
|
|
939
|
+
statusCode: 504,
|
|
940
|
+
headers: {},
|
|
941
|
+
body: {
|
|
942
|
+
code: 'WORKFLOW_RESPONSE_TIMEOUT',
|
|
943
|
+
message: `Workflow did not return a result within ${match.responseTimeoutSeconds} seconds`,
|
|
944
|
+
instanceId: execution.instanceId,
|
|
945
|
+
},
|
|
946
|
+
},
|
|
947
|
+
};
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
const workflowResult = asRecord(waited.result);
|
|
951
|
+
if (
|
|
952
|
+
workflowResult.status !== 'COMPLETED' ||
|
|
953
|
+
!Object.prototype.hasOwnProperty.call(workflowResult, 'output')
|
|
954
|
+
) {
|
|
955
|
+
throw new Error('Workflow completed without a return result');
|
|
956
|
+
}
|
|
957
|
+
const httpResponse = asRecord(workflowResult.httpResponse);
|
|
958
|
+
return {
|
|
959
|
+
instanceIds,
|
|
960
|
+
response: {
|
|
961
|
+
statusCode: normalizeHttpStatusCode(httpResponse.statusCode),
|
|
962
|
+
headers: normalizeHttpHeaders(httpResponse.headers),
|
|
963
|
+
body: workflowResult.output,
|
|
964
|
+
},
|
|
965
|
+
};
|
|
966
|
+
} catch (error) {
|
|
967
|
+
this.logger.error(
|
|
968
|
+
`Workflow ${execution.instanceId} failed while waiting for an HTTP response`,
|
|
969
|
+
error instanceof Error ? error.stack : String(error),
|
|
970
|
+
);
|
|
971
|
+
return {
|
|
972
|
+
instanceIds,
|
|
973
|
+
response: {
|
|
974
|
+
statusCode: 500,
|
|
975
|
+
headers: {},
|
|
976
|
+
body: {
|
|
977
|
+
code: 'WORKFLOW_EXECUTION_FAILED',
|
|
978
|
+
message: 'Workflow execution failed',
|
|
979
|
+
instanceId: execution.instanceId,
|
|
980
|
+
},
|
|
981
|
+
},
|
|
982
|
+
};
|
|
983
|
+
}
|
|
670
984
|
}
|
|
671
985
|
|
|
672
986
|
async getInstanceDetail(instanceId: bigint) {
|
|
673
987
|
const instance = await this.prisma.workflowInstance.findUnique({
|
|
674
988
|
where: { id: instanceId },
|
|
675
989
|
include: {
|
|
676
|
-
workflow: { select: { name: true
|
|
990
|
+
workflow: { select: { name: true } },
|
|
677
991
|
nodeExecutions: {
|
|
678
992
|
orderBy: { createdAt: 'asc' },
|
|
679
993
|
},
|
|
@@ -692,11 +1006,6 @@ export class WorkflowService {
|
|
|
692
1006
|
dsl = version?.dsl || null;
|
|
693
1007
|
}
|
|
694
1008
|
|
|
695
|
-
// Fallback: use DSL from the workflow itself
|
|
696
|
-
if (!dsl && instance.workflow.dsl) {
|
|
697
|
-
dsl = instance.workflow.dsl;
|
|
698
|
-
}
|
|
699
|
-
|
|
700
1009
|
return {
|
|
701
1010
|
...instance,
|
|
702
1011
|
workflow: { name: instance.workflow.name },
|
|
@@ -740,12 +1049,18 @@ export class WorkflowService {
|
|
|
740
1049
|
throw new Error('Can only retry FAILED instances');
|
|
741
1050
|
}
|
|
742
1051
|
|
|
743
|
-
|
|
1052
|
+
const executionState = instance.context as Record<string, any>;
|
|
1053
|
+
// Create a new instance with the same immutable Workflow data.
|
|
744
1054
|
return this.executeWorkflow(
|
|
745
1055
|
instance.workflowId,
|
|
746
1056
|
{
|
|
747
|
-
|
|
748
|
-
|
|
1057
|
+
workflow:
|
|
1058
|
+
executionState.workflow &&
|
|
1059
|
+
typeof executionState.workflow === 'object' &&
|
|
1060
|
+
!Array.isArray(executionState.workflow)
|
|
1061
|
+
? executionState.workflow
|
|
1062
|
+
: {},
|
|
1063
|
+
workflowVersionId: instance.versionId,
|
|
749
1064
|
},
|
|
750
1065
|
creator,
|
|
751
1066
|
temporalService,
|
|
@@ -778,34 +1093,55 @@ export class WorkflowService {
|
|
|
778
1093
|
instanceId: bigint,
|
|
779
1094
|
dto: { nodeId: string; approved: boolean; comment?: string },
|
|
780
1095
|
approverId: string,
|
|
781
|
-
|
|
1096
|
+
_temporalService: any,
|
|
782
1097
|
) {
|
|
783
|
-
const
|
|
784
|
-
where: {
|
|
1098
|
+
const request = await this.prisma.approvalRequest.findUnique({
|
|
1099
|
+
where: {
|
|
1100
|
+
workflowInstanceId_nodeId: {
|
|
1101
|
+
workflowInstanceId: instanceId,
|
|
1102
|
+
nodeId: dto.nodeId,
|
|
1103
|
+
},
|
|
1104
|
+
},
|
|
785
1105
|
});
|
|
786
|
-
if (!
|
|
787
|
-
|
|
788
|
-
throw new Error('Instance has no Temporal run ID');
|
|
1106
|
+
if (!request || request.status !== 'PENDING') {
|
|
1107
|
+
throw new NotFoundException('Open approval request not found');
|
|
789
1108
|
}
|
|
1109
|
+
return this.humanApprovalService.submitDecision(
|
|
1110
|
+
request.id,
|
|
1111
|
+
{ decision: dto.approved ? 'APPROVE' : 'REJECT', comment: dto.comment },
|
|
1112
|
+
{ userId: approverId },
|
|
1113
|
+
);
|
|
1114
|
+
}
|
|
1115
|
+
}
|
|
790
1116
|
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
1117
|
+
function createWorkflowExecutionState(
|
|
1118
|
+
value: Record<string, any> | undefined,
|
|
1119
|
+
): Record<string, any> {
|
|
1120
|
+
return {
|
|
1121
|
+
workflow: value ?? {},
|
|
1122
|
+
nodes: {},
|
|
1123
|
+
};
|
|
1124
|
+
}
|
|
795
1125
|
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
}
|
|
1126
|
+
function asRecord(value: unknown): Record<string, unknown> {
|
|
1127
|
+
return value && typeof value === 'object' && !Array.isArray(value)
|
|
1128
|
+
? (value as Record<string, unknown>)
|
|
1129
|
+
: {};
|
|
1130
|
+
}
|
|
802
1131
|
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
1132
|
+
function normalizeHttpStatusCode(value: unknown): number {
|
|
1133
|
+
return typeof value === 'number' &&
|
|
1134
|
+
Number.isInteger(value) &&
|
|
1135
|
+
value >= 100 &&
|
|
1136
|
+
value <= 599
|
|
1137
|
+
? value
|
|
1138
|
+
: 200;
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
function normalizeHttpHeaders(value: unknown): Record<string, string> {
|
|
1142
|
+
return Object.fromEntries(
|
|
1143
|
+
Object.entries(asRecord(value)).filter(
|
|
1144
|
+
(entry): entry is [string, string] => typeof entry[1] === 'string',
|
|
1145
|
+
),
|
|
1146
|
+
);
|
|
811
1147
|
}
|