@gadmin2n/schematics 0.0.139 → 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.
Files changed (314) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/Jenkinsfile +6 -34
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/approval.prisma +199 -0
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +9 -0
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +191 -14
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/gitignore +6 -5
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/readme.md +10 -3
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/server/migrate-between-pg-schemas.js +6 -4
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +4 -1
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +12 -3
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/migrate-human-approval-configs.ts +86 -0
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +682 -121
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +110 -1
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/config/index.ts +28 -0
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/json-body-parser.spec.ts +61 -0
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/json-body-parser.ts +7 -0
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.spec.ts +54 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.ts +86 -0
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +9 -3
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.controller.ts +89 -0
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.dto.ts +68 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.spec.ts +177 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.ts +283 -0
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approvalChannel.module.ts +10 -0
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.spec.ts +42 -0
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.ts +108 -0
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +101 -0
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.dto.ts +29 -0
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/codeRuntime.module.ts +21 -0
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-handler.registry.ts +30 -0
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-handler.ts +15 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.spec.ts +105 -0
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.ts +96 -0
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.dto.ts +78 -0
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.spec.ts +56 -0
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.ts +111 -0
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-token.spec.ts +23 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-token.ts +18 -0
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.spec.ts +240 -0
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.ts +339 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.types.ts +74 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-wait.handler.ts +47 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/externalInteraction.module.ts +41 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.spec.ts +70 -0
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.ts +76 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.controller.ts +12 -0
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.spec.ts +227 -0
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.ts +121 -0
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +160 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.dto.ts +41 -0
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.spec.ts +171 -0
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.ts +245 -0
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/httpRequest.module.ts +22 -0
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule-evaluator.spec.ts +68 -0
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule-evaluator.ts +126 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule.types.ts +34 -0
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.ts +115 -0
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.spec.ts +45 -0
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.ts +59 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.controller.ts +72 -0
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.dto.ts +144 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.errors.ts +19 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.external-decision.spec.ts +350 -0
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +774 -0
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/humanApproval.module.ts +46 -0
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/legacy-approval-config-migration.ts +227 -0
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/outbox-retry.util.ts +14 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +151 -0
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.dto.ts +88 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/runtime-token.guard.ts +43 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +21 -1
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.controller.ts +77 -0
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.dto.ts +98 -0
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.ts +277 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-secret-cipher.spec.ts +14 -0
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-secret-cipher.ts +59 -0
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integrationConnection.module.ts +10 -0
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/actor-context.util.ts +27 -0
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/providers/user-group.provider.ts +208 -0
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/providers/user.provider.ts +168 -0
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.controller.spec.ts +157 -0
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.controller.ts +176 -0
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.dto.ts +21 -0
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.errors.ts +78 -0
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.registry.spec.ts +100 -0
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.registry.ts +115 -0
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.types.ts +97 -0
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subjectProvider.module.ts +34 -0
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.spec.ts +89 -1
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.ts +4 -0
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.controller.ts +119 -0
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.dto.ts +91 -0
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.errors.ts +34 -0
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.service.spec.ts +161 -0
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.service.ts +390 -0
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/userGroup.module.ts +10 -0
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.spec.ts +17 -0
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.ts +8 -2
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/parameter-binding.ts +93 -0
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.spec.ts +158 -0
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.ts +155 -0
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +363 -0
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +354 -0
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.types.ts +43 -0
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.spec.ts +174 -0
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.ts +149 -0
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-dsl-comparison.ts +43 -0
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +1 -1
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +4 -0
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +70 -28
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +128 -0
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +12 -1
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.module.ts +18 -3
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +369 -22
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +319 -90
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.spec.ts +79 -0
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.ts +62 -0
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/schema.types.ts +10 -0
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.spec.ts +124 -0
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.ts +236 -0
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.spec.ts +49 -0
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.ts +69 -0
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/workflowConfig.module.ts +20 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/node-instance-config.util.spec.ts +15 -0
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/node-instance-config.util.ts +25 -0
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.ts +103 -11
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.dto.ts +98 -0
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.module.ts +3 -0
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +72 -62
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.ts +148 -11
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +13 -9
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +5 -2
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/authProvider.ts +2 -2
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/BulkActions.tsx +0 -5
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/SearchBar.tsx +26 -18
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/eventList/index.tsx +2 -2
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logButton/index.tsx +24 -17
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logList/index.tsx +7 -18
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/modalDiffViewer/index.tsx +2 -2
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +288 -33
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/themeStyles.ts +97 -0
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/SettingDrawer.tsx +251 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +47 -19
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +18 -9
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/menuRenderer.tsx +155 -0
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +123 -129
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +16 -0
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +2 -1
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +98 -3
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +101 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +8 -0
  151. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +51 -0
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/form.tsx +1 -1
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +1 -1
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +40 -1
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/show.tsx +5 -5
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +16 -1
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useListPageState.ts +10 -7
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +4 -2
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +26 -2
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/workflow.json +556 -0
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +26 -2
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json +556 -0
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +152 -2
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +6 -1
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/show.tsx +41 -9
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/edit.tsx +1 -1
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/list.tsx +10 -8
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/show.tsx +3 -3
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.css +1 -1
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +1 -1
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +3 -6
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.css +3 -0
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.tsx +45 -13
  174. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasComponentLibrary.tsx +45 -22
  175. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +168 -101
  176. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +248 -74
  177. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +33 -18
  178. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CodeFloatWindow.tsx +16 -10
  179. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/PublishModal.tsx +1 -1
  180. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +31 -0
  181. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +15 -0
  182. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/BarChartDataSourceModal.tsx +16 -11
  183. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/CanvasAiModal.tsx +25 -21
  184. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/ExportModal.tsx +6 -1
  185. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/LineChartDataSourceModal.tsx +9 -10
  186. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartConfigModal.tsx +4 -7
  187. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartDataSourceModal.tsx +23 -9
  188. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/NumCardDataSourceModal.tsx +16 -11
  189. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/PromptModal.tsx +2 -5
  190. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/RadarChartDataSourceModal.tsx +16 -11
  191. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableConfigModal.tsx +2 -9
  192. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableDataSourceModal.tsx +23 -12
  193. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/canvasModalProps.ts +2 -17
  194. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.test.ts +149 -0
  195. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.ts +111 -17
  196. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/types.ts +1 -0
  197. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardLayout.test.ts +83 -0
  198. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardLayout.ts +118 -0
  199. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardName.test.ts +26 -0
  200. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas-page/index.tsx +9 -1
  201. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/edit.tsx +1 -1
  202. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/list.tsx +10 -8
  203. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/show.tsx +3 -6
  204. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.tsx +71 -0
  205. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/inbox.tsx +216 -0
  206. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +6 -1
  207. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permissionReadme/index.tsx +8 -8
  208. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +1 -1
  209. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +5 -5
  210. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +1 -1
  211. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +1 -1
  212. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.test.tsx +84 -0
  213. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.tsx +141 -0
  214. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/approval-channel.types.ts +16 -0
  215. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/index.tsx +208 -0
  216. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CreateNodeInstanceDrawer.tsx +154 -0
  217. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +194 -5
  218. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DeletableEdge.tsx +76 -0
  219. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.tsx +1 -1
  220. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +176 -22
  221. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.test.tsx +62 -0
  222. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.tsx +94 -5
  223. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExportModal.tsx +15 -10
  224. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +251 -70
  225. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ImportModal.tsx +18 -24
  226. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/InstanceRequiredDialog.tsx +106 -0
  227. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.test.tsx +45 -0
  228. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.tsx +43 -0
  229. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NewNodeDefaults.test.tsx +279 -0
  230. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeEditModal.tsx +6 -7
  231. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.test.tsx +335 -0
  232. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +433 -237
  233. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ParameterBindingEditor.tsx +179 -0
  234. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.tsx +18 -16
  235. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +20 -16
  236. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/VersionPanel.tsx +6 -4
  237. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.test.tsx +68 -0
  238. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.tsx +367 -0
  239. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connection.types.ts +21 -0
  240. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.tsx +171 -0
  241. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +38 -22
  242. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useNodeInstanceLibrary.ts +41 -0
  243. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +6 -0
  244. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +27 -20
  245. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +8 -11
  246. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +6 -1
  247. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +56 -23
  248. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/create.tsx +21 -6
  249. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/edit.tsx +17 -20
  250. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/index.tsx +6 -1
  251. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaField.tsx +311 -0
  252. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.test.tsx +218 -0
  253. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.tsx +83 -0
  254. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/default-widgets.tsx +135 -0
  255. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/schema-defaults.ts +36 -0
  256. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/schema.types.ts +32 -0
  257. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.test.tsx +23 -0
  258. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.tsx +52 -0
  259. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +9 -13
  260. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRequestTriggerConfigEditor.tsx +39 -0
  261. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.test.tsx +20 -0
  262. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.tsx +72 -0
  263. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.test.tsx +47 -0
  264. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.tsx +185 -0
  265. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.test.tsx +102 -0
  266. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.tsx +150 -0
  267. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.tsx +103 -0
  268. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.test.tsx +93 -0
  269. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.tsx +196 -0
  270. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalWaitConfigEditor.tsx +303 -0
  271. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.test.tsx +189 -0
  272. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.tsx +706 -0
  273. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.test.tsx +86 -0
  274. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.tsx +458 -0
  275. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.test.tsx +53 -0
  276. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +91 -0
  277. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.test.tsx +61 -0
  278. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.tsx +266 -0
  279. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitApprovalResultConfigEditor.tsx +104 -0
  280. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitExternalResultConfigEditor.tsx +98 -0
  281. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupCreateModal.tsx +70 -0
  282. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupEditModal.tsx +138 -0
  283. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.test.ts +25 -0
  284. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.ts +42 -0
  285. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/subject-provider.api.ts +95 -0
  286. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +15 -11
  287. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +49 -8
  288. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types/parameter-binding.ts +49 -0
  289. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +31 -2
  290. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.test.ts +208 -0
  291. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.ts +246 -0
  292. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/newNodeConfig.ts +73 -0
  293. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.test.ts +34 -0
  294. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.ts +18 -0
  295. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.ts +66 -0
  296. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.test.ts +39 -0
  297. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.ts +48 -0
  298. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.test.ts +51 -0
  299. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.ts +32 -0
  300. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +1 -1
  301. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +10 -8
  302. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +3 -3
  303. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd-theme-vars.css +93 -0
  304. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.css +8 -8
  305. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/fc.css +4 -4
  306. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +20 -5
  307. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-drawer.module.css +3 -3
  308. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-page.module.css +3 -3
  309. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/theme-styles.css +81 -0
  310. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/test/setup.ts +5 -0
  311. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +1 -7
  312. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vitest.config.ts +12 -0
  313. package/package.json +1 -1
  314. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/DynamicConfigForm.tsx +0 -154
@@ -1,8 +1,10 @@
1
1
  import { NotFoundException, UnauthorizedException } from '@nestjs/common';
2
2
  import { Test, TestingModule } from '@nestjs/testing';
3
3
  import { PrismaService } from 'nestjs-prisma';
4
+ import { HumanApprovalService } from '../humanApproval/human-approval.service';
4
5
  import { TemporalService } from './temporal.service';
5
6
  import { signWebhookPayload } from './webhook-signature.util';
7
+ import { WorkflowCompilerService } from './workflow-compiler.service';
6
8
  import { WorkflowService } from './workflow.service';
7
9
 
8
10
  describe('WorkflowService — cron lifecycle hooks', () => {
@@ -30,15 +32,34 @@ describe('WorkflowService — cron lifecycle hooks', () => {
30
32
  { type: 'http_request', outputs: [] },
31
33
  { type: 'if_else', outputs: ['true', 'false'] },
32
34
  { type: 'switch', outputs: null },
35
+ { type: 'approval', outputs: ['true', 'false'] },
36
+ { type: 'custom_branch', outputs: ['success', 'failure'] },
33
37
  ]),
34
38
  },
39
+ externalInteraction: {
40
+ findMany: jest.fn().mockResolvedValue([]),
41
+ deleteMany: jest.fn(),
42
+ },
43
+ externalInteractionEvent: { deleteMany: jest.fn() },
44
+ externalInteractionSignalOutbox: { deleteMany: jest.fn() },
35
45
  $transaction: jest.fn(async (cb: any) =>
36
46
  cb({
37
47
  workflowVersion: {
38
48
  findFirst: prisma.workflowVersion.findFirst,
39
- create: prisma.workflowVersion.create,
49
+ create: async (args: any) => ({
50
+ ...(await prisma.workflowVersion.create(args)),
51
+ dsl: args.data.dsl,
52
+ }),
53
+ },
54
+ workflow: {
55
+ update: prisma.workflow.update,
56
+ delete: prisma.workflow.delete,
40
57
  },
41
- workflow: { update: prisma.workflow.update },
58
+ externalInteraction: prisma.externalInteraction,
59
+ externalInteractionEvent: prisma.externalInteractionEvent,
60
+ externalInteractionSignalOutbox:
61
+ prisma.externalInteractionSignalOutbox,
62
+ audit: { create: jest.fn() },
42
63
  }),
43
64
  ),
44
65
  };
@@ -54,12 +75,116 @@ describe('WorkflowService — cron lifecycle hooks', () => {
54
75
  WorkflowService,
55
76
  { provide: PrismaService, useValue: prisma },
56
77
  { provide: TemporalService, useValue: temporal },
78
+ { provide: HumanApprovalService, useValue: {} },
79
+ {
80
+ provide: WorkflowCompilerService,
81
+ useValue: { compile: jest.fn(async (dsl: any) => dsl) },
82
+ },
57
83
  ],
58
84
  }).compile();
59
85
 
60
86
  service = module.get<WorkflowService>(WorkflowService);
61
87
  });
62
88
 
89
+ describe('draft publication state', () => {
90
+ const savedDsl = {
91
+ nodes: [
92
+ {
93
+ id: 'start',
94
+ type: 'manual_trigger',
95
+ label: '开始',
96
+ position: { x: 120, y: 80 },
97
+ config: { inputSchema: {} },
98
+ },
99
+ ],
100
+ edges: [],
101
+ };
102
+ const publishedDsl = {
103
+ nodes: [
104
+ {
105
+ id: 'start',
106
+ type: 'manual_trigger',
107
+ label: '开始',
108
+ position: { y: 80, x: 120 },
109
+ config: { inputSchema: {} },
110
+ runtimeKey: 'manual_trigger',
111
+ source: {
112
+ instanceId: '9',
113
+ instanceCode: 'START_TEMPLATE',
114
+ schemaVersion: 1,
115
+ configHash: 'published-hash',
116
+ },
117
+ },
118
+ ],
119
+ edges: [],
120
+ };
121
+
122
+ it('keeps a saved workflow published when its DSL matches the latest version', async () => {
123
+ prisma.workflow.findUnique.mockResolvedValueOnce({
124
+ id: BigInt(42),
125
+ versions: [{ dsl: publishedDsl }],
126
+ });
127
+ prisma.workflow.update.mockImplementationOnce(({ data }: any) =>
128
+ Promise.resolve(data),
129
+ );
130
+
131
+ const result = await service.saveDraft(BigInt(42), savedDsl);
132
+
133
+ expect(result).toMatchObject({ dsl: savedDsl, status: 'PUBLISHED' });
134
+ });
135
+
136
+ it('marks a saved workflow as draft when a node configuration changed', async () => {
137
+ prisma.workflow.findUnique.mockResolvedValueOnce({
138
+ id: BigInt(42),
139
+ versions: [{ dsl: publishedDsl }],
140
+ });
141
+ prisma.workflow.update.mockImplementationOnce(({ data }: any) =>
142
+ Promise.resolve(data),
143
+ );
144
+ const changedDsl = {
145
+ ...savedDsl,
146
+ nodes: [
147
+ {
148
+ ...savedDsl.nodes[0],
149
+ label: '新的开始节点',
150
+ },
151
+ ],
152
+ };
153
+
154
+ const result = await service.saveDraft(BigInt(42), changedDsl);
155
+
156
+ expect(result).toMatchObject({ dsl: changedDsl, status: 'DRAFT' });
157
+ });
158
+
159
+ it('does not create a version when the saved DSL is already published', async () => {
160
+ prisma.workflow.findUnique.mockResolvedValueOnce({
161
+ id: BigInt(42),
162
+ dsl: savedDsl,
163
+ status: 'DRAFT',
164
+ versions: [{ version: 1, dsl: publishedDsl }],
165
+ });
166
+ prisma.workflowVersion.findFirst.mockResolvedValue({
167
+ version: 1,
168
+ dsl: publishedDsl,
169
+ });
170
+ prisma.workflowVersion.create.mockResolvedValueOnce({
171
+ id: BigInt(2),
172
+ version: 2,
173
+ dsl: savedDsl,
174
+ });
175
+ prisma.workflow.update.mockResolvedValueOnce({});
176
+
177
+ await expect(
178
+ service.publish(BigInt(42), { changeSummary: 'duplicate' }, 'tester'),
179
+ ).rejects.toMatchObject({
180
+ response: expect.objectContaining({
181
+ code: 'WORKFLOW_DSL_UNCHANGED',
182
+ }),
183
+ });
184
+ expect(prisma.workflowVersion.create).not.toHaveBeenCalled();
185
+ });
186
+ });
187
+
63
188
  describe('publish — cron schedule sync', () => {
64
189
  const ID = BigInt(42);
65
190
  const mkWorkflow = (dsl: any) => ({ id: ID, dsl, status: 'DRAFT' });
@@ -136,6 +261,35 @@ describe('WorkflowService — cron lifecycle hooks', () => {
136
261
  ).rejects.toThrow(/requires a secret/);
137
262
  });
138
263
 
264
+ it('allows a direct webhook trigger to publish without an HMAC secret', async () => {
265
+ const dsl = {
266
+ nodes: [
267
+ {
268
+ id: 't1',
269
+ type: 'webhook_trigger',
270
+ config: {
271
+ path: 'myoa-callback',
272
+ method: 'POST',
273
+ verificationMode: 'NONE',
274
+ },
275
+ },
276
+ ],
277
+ edges: [],
278
+ };
279
+ prisma.workflow.findUnique.mockResolvedValueOnce(mkWorkflow(dsl));
280
+ prisma.workflow.findMany.mockResolvedValueOnce([]);
281
+ prisma.workflowVersion.findFirst.mockResolvedValueOnce(null);
282
+ prisma.workflowVersion.create.mockResolvedValueOnce({
283
+ id: BigInt(1),
284
+ version: 1,
285
+ });
286
+ prisma.workflow.update.mockResolvedValueOnce({});
287
+
288
+ await expect(
289
+ service.publish(ID, { changeSummary: 'init' }, 'tester'),
290
+ ).resolves.toBeDefined();
291
+ });
292
+
139
293
  it('rejects webhook path collision with another published workflow', async () => {
140
294
  const dsl = {
141
295
  nodes: [
@@ -152,15 +306,23 @@ describe('WorkflowService — cron lifecycle hooks', () => {
152
306
  {
153
307
  id: BigInt(999),
154
308
  name: 'other',
155
- dsl: {
156
- nodes: [
157
- {
158
- id: 't1',
159
- type: 'webhook_trigger',
160
- config: { path: 'order-paid', method: 'POST', secret: 'x' },
309
+ versions: [
310
+ {
311
+ dsl: {
312
+ nodes: [
313
+ {
314
+ id: 't1',
315
+ type: 'webhook_trigger',
316
+ config: {
317
+ path: 'order-paid',
318
+ method: 'POST',
319
+ secret: 'x',
320
+ },
321
+ },
322
+ ],
161
323
  },
162
- ],
163
- },
324
+ },
325
+ ],
164
326
  },
165
327
  ]);
166
328
 
@@ -185,15 +347,23 @@ describe('WorkflowService — cron lifecycle hooks', () => {
185
347
  {
186
348
  id: BigInt(999),
187
349
  name: 'other',
188
- dsl: {
189
- nodes: [
190
- {
191
- id: 't1',
192
- type: 'webhook_trigger',
193
- config: { path: 'order-paid', method: 'POST', secret: 'x' },
350
+ versions: [
351
+ {
352
+ dsl: {
353
+ nodes: [
354
+ {
355
+ id: 't1',
356
+ type: 'webhook_trigger',
357
+ config: {
358
+ path: 'order-paid',
359
+ method: 'POST',
360
+ secret: 'x',
361
+ },
362
+ },
363
+ ],
194
364
  },
195
- ],
196
- },
365
+ },
366
+ ],
197
367
  },
198
368
  ]);
199
369
  prisma.workflowVersion.findFirst.mockResolvedValueOnce(null);
@@ -208,6 +378,84 @@ describe('WorkflowService — cron lifecycle hooks', () => {
208
378
  ).resolves.toBeDefined();
209
379
  });
210
380
 
381
+ it('accepts approval branches declared by Workflow node metadata', async () => {
382
+ const dsl = {
383
+ nodes: [
384
+ { id: 't1', type: 'manual_trigger', config: {} },
385
+ { id: 'approval1', type: 'approval', config: {} },
386
+ { id: 'approved', type: 'code', config: {} },
387
+ { id: 'rejected', type: 'code', config: {} },
388
+ ],
389
+ edges: [
390
+ { id: 'e1', source: 't1', target: 'approval1' },
391
+ {
392
+ id: 'e2',
393
+ source: 'approval1',
394
+ target: 'approved',
395
+ sourceHandle: 'true',
396
+ },
397
+ {
398
+ id: 'e3',
399
+ source: 'approval1',
400
+ target: 'rejected',
401
+ sourceHandle: 'false',
402
+ },
403
+ ],
404
+ };
405
+ prisma.workflow.findUnique.mockResolvedValueOnce(mkWorkflow(dsl));
406
+ prisma.workflowVersion.findFirst.mockResolvedValueOnce(null);
407
+ prisma.workflowVersion.create.mockResolvedValueOnce({
408
+ id: BigInt(1),
409
+ version: 1,
410
+ });
411
+ prisma.workflow.update.mockResolvedValueOnce({});
412
+
413
+ await expect(
414
+ service.publish(ID, { changeSummary: 'init' }, 'tester'),
415
+ ).resolves.toBeDefined();
416
+ });
417
+
418
+ it('rejects an output handle not declared by Workflow node metadata', async () => {
419
+ const dsl = {
420
+ nodes: [
421
+ { id: 't1', type: 'manual_trigger', config: {} },
422
+ { id: 'branch1', type: 'custom_branch', config: {} },
423
+ { id: 'next', type: 'code', config: {} },
424
+ ],
425
+ edges: [
426
+ { id: 'e1', source: 't1', target: 'branch1' },
427
+ {
428
+ id: 'e2',
429
+ source: 'branch1',
430
+ target: 'next',
431
+ sourceHandle: 'unknown',
432
+ },
433
+ ],
434
+ };
435
+ prisma.workflow.findUnique.mockResolvedValueOnce(mkWorkflow(dsl));
436
+ prisma.workflowVersion.findFirst.mockResolvedValueOnce(null);
437
+ prisma.workflowVersion.create.mockResolvedValueOnce({
438
+ id: BigInt(1),
439
+ version: 1,
440
+ });
441
+ prisma.workflow.update.mockResolvedValueOnce({});
442
+
443
+ await expect(
444
+ service.publish(ID, { changeSummary: 'init' }, 'tester'),
445
+ ).rejects.toMatchObject({
446
+ status: 400,
447
+ response: expect.objectContaining({
448
+ code: 'DSL_HANDLE_VALIDATION',
449
+ errors: expect.arrayContaining([
450
+ expect.objectContaining({
451
+ edgeId: 'e2',
452
+ code: 'UNKNOWN_HANDLE',
453
+ }),
454
+ ]),
455
+ }),
456
+ });
457
+ });
458
+
211
459
  it('rejects with 400 BadRequestException when DSL has invalid sourceHandle', async () => {
212
460
  // if_else node has enumerated outputs ['true','false']; sending 'maybe'
213
461
  // must trigger the new sourceHandle validator and produce a 400 with a
@@ -280,6 +528,54 @@ describe('WorkflowService — cron lifecycle hooks', () => {
280
528
  describe('remove', () => {
281
529
  const ID = BigInt(42);
282
530
 
531
+ it('deletes external interaction history before deleting the workflow', async () => {
532
+ const rows = {
533
+ interactionEvents: 1,
534
+ signalOutboxes: 1,
535
+ interactions: 1,
536
+ workflowExists: true,
537
+ };
538
+ const deleteWorkflow = jest.fn(async () => {
539
+ if (rows.interactions > 0)
540
+ throw new Error('Foreign key constraint failed');
541
+ rows.workflowExists = false;
542
+ return { id: ID };
543
+ });
544
+ prisma.workflow.findUnique.mockResolvedValueOnce({ id: ID });
545
+ prisma.workflow.delete.mockImplementationOnce(deleteWorkflow);
546
+ prisma.$transaction.mockImplementationOnce(async (callback: any) =>
547
+ callback({
548
+ externalInteraction: {
549
+ findMany: jest.fn(async () => [{ id: BigInt(100) }]),
550
+ deleteMany: jest.fn(async () => {
551
+ if (rows.interactionEvents > 0 || rows.signalOutboxes > 0)
552
+ throw new Error('Foreign key constraint failed');
553
+ rows.interactions = 0;
554
+ }),
555
+ },
556
+ externalInteractionEvent: {
557
+ deleteMany: jest.fn(async () => {
558
+ rows.interactionEvents = 0;
559
+ }),
560
+ },
561
+ externalInteractionSignalOutbox: {
562
+ deleteMany: jest.fn(async () => {
563
+ rows.signalOutboxes = 0;
564
+ }),
565
+ },
566
+ workflow: { delete: deleteWorkflow },
567
+ }),
568
+ );
569
+
570
+ await expect(service.remove(ID)).resolves.toEqual({ id: ID });
571
+ expect(rows).toEqual({
572
+ interactionEvents: 0,
573
+ signalOutboxes: 0,
574
+ interactions: 0,
575
+ workflowExists: false,
576
+ });
577
+ });
578
+
283
579
  it('deletes cron schedule before deleting workflow', async () => {
284
580
  prisma.workflow.findUnique.mockResolvedValueOnce({ id: ID });
285
581
  prisma.workflow.delete.mockResolvedValueOnce({});
@@ -328,6 +624,11 @@ describe('WorkflowService — receiveWebhook', () => {
328
624
  WorkflowService,
329
625
  { provide: PrismaService, useValue: prisma },
330
626
  { provide: TemporalService, useValue: temporal },
627
+ { provide: HumanApprovalService, useValue: {} },
628
+ {
629
+ provide: WorkflowCompilerService,
630
+ useValue: { compile: jest.fn(async (dsl: any) => dsl) },
631
+ },
331
632
  ],
332
633
  }).compile();
333
634
 
@@ -342,7 +643,12 @@ describe('WorkflowService — receiveWebhook', () => {
342
643
 
343
644
  const nowSec = () => Math.floor(Date.now() / 1000).toString();
344
645
 
345
- const mkPublishedWorkflow = (id: number, secret = SECRET, path = PATH) => ({
646
+ const mkPublishedWorkflow = (
647
+ id: number,
648
+ secret = SECRET,
649
+ path = PATH,
650
+ verificationMode?: 'HMAC' | 'NONE',
651
+ ) => ({
346
652
  id: BigInt(id),
347
653
  status: 'PUBLISHED',
348
654
  isEnabled: true,
@@ -356,7 +662,12 @@ describe('WorkflowService — receiveWebhook', () => {
356
662
  {
357
663
  id: 't1',
358
664
  type: 'webhook_trigger',
359
- config: { path, method: METHOD, secret },
665
+ config: {
666
+ path,
667
+ method: METHOD,
668
+ secret,
669
+ ...(verificationMode && { verificationMode }),
670
+ },
360
671
  },
361
672
  ],
362
673
  edges: [],
@@ -379,11 +690,17 @@ describe('WorkflowService — receiveWebhook', () => {
379
690
  },
380
691
  ],
381
692
  }));
693
+ prisma.workflowVersion.findFirst.mockImplementation(({ where }: any) => ({
694
+ id: where.id,
695
+ version: 1,
696
+ dsl: { nodes: [], edges: [] },
697
+ }));
382
698
  prisma.workflowInstance.create.mockResolvedValueOnce({ id: BigInt(7777) });
383
699
  prisma.workflowInstance.update.mockResolvedValueOnce({});
384
700
  };
385
701
 
386
702
  it('returns 401 (UnauthorizedException) when timestamp is missing', async () => {
703
+ prisma.workflow.findMany.mockResolvedValueOnce([mkPublishedWorkflow(1)]);
387
704
  const sig = signWebhookPayload(SECRET, nowSec(), RAW);
388
705
  await expect(
389
706
  service.receiveWebhook({
@@ -400,6 +717,7 @@ describe('WorkflowService — receiveWebhook', () => {
400
717
  });
401
718
 
402
719
  it('returns 401 when timestamp is older than 5 minutes', async () => {
720
+ prisma.workflow.findMany.mockResolvedValueOnce([mkPublishedWorkflow(1)]);
403
721
  const oldTs = String(Math.floor(Date.now() / 1000) - 6 * 60);
404
722
  const sig = signWebhookPayload(SECRET, oldTs, RAW);
405
723
  await expect(
@@ -473,8 +791,37 @@ describe('WorkflowService — receiveWebhook', () => {
473
791
  expect(temporal.startWorkflow).toHaveBeenCalledTimes(1);
474
792
  const startArg = temporal.startWorkflow.mock.calls[0][0];
475
793
  expect(startArg.context).toMatchObject({
476
- body: { orderId: 42 },
477
- query: { foo: 'bar' },
794
+ workflow: {
795
+ body: { orderId: 42 },
796
+ query: { foo: 'bar' },
797
+ },
798
+ nodes: {},
799
+ });
800
+ });
801
+
802
+ it('starts a direct webhook without signature headers', async () => {
803
+ prisma.workflow.findMany.mockResolvedValueOnce([
804
+ mkPublishedWorkflow(1, '', PATH, 'NONE'),
805
+ ]);
806
+ mkExecuteSetup();
807
+
808
+ const result = await service.receiveWebhook({
809
+ path: PATH,
810
+ method: METHOD,
811
+ signatureHeader: undefined,
812
+ timestampHeader: undefined,
813
+ rawBody: RAW,
814
+ body: { id: 'myoa-work-item-1' },
815
+ headers: { 'content-type': 'text/json' },
816
+ query: {},
817
+ });
818
+
819
+ expect(result.instanceIds).toEqual(['7777']);
820
+ expect(temporal.startWorkflow).toHaveBeenCalledTimes(1);
821
+ expect(temporal.startWorkflow.mock.calls[0][0].context).toMatchObject({
822
+ workflow: {
823
+ body: { id: 'myoa-work-item-1' },
824
+ },
478
825
  });
479
826
  });
480
827