@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.
Files changed (329) 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/config/ui/Event.ts +1 -1
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/gitignore +6 -5
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/readme.md +10 -3
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/server/migrate-between-pg-schemas.js +6 -4
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +5 -2
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +12 -3
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/gen-jwt.ts +8 -1
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/scripts/migrate-human-approval-configs.ts +86 -0
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +710 -121
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow.seed.ts +125 -10
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/config/index.ts +28 -0
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/json-body-parser.spec.ts +61 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/json-body-parser.ts +7 -0
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.spec.ts +54 -0
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/lib/structured-all-exceptions.filter.ts +86 -0
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/main.ts +9 -3
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.controller.ts +89 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.dto.ts +68 -0
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.spec.ts +177 -0
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approval-channel.service.ts +283 -0
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/approvalChannel/approvalChannel.module.ts +10 -0
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.spec.ts +42 -0
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-executor.ts +108 -0
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.controller.ts +101 -0
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/code-runtime.dto.ts +29 -0
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/codeRuntime/codeRuntime.module.ts +21 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-handler.registry.ts +30 -0
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-handler.ts +15 -0
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.spec.ts +105 -0
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.controller.ts +96 -0
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-runtime.dto.ts +78 -0
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.spec.ts +56 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-signal-outbox.service.ts +111 -0
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-token.spec.ts +23 -0
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction-token.ts +18 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.spec.ts +240 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.service.ts +339 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-interaction.types.ts +74 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/external-wait.handler.ts +47 -0
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/externalInteraction.module.ts +41 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.spec.ts +70 -0
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/human-approval.handler.ts +76 -0
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.controller.ts +12 -0
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.spec.ts +227 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/externalInteraction/workflow-callback-url.service.ts +121 -0
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.controller.ts +160 -0
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.dto.ts +41 -0
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.spec.ts +171 -0
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/http-request-runtime.util.ts +245 -0
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/httpRequest/httpRequest.module.ts +22 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule-evaluator.spec.ts +68 -0
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule-evaluator.ts +126 -0
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-rule.types.ts +34 -0
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-signal-outbox.service.ts +115 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.spec.ts +45 -0
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/approval-subject-source.util.ts +59 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.controller.ts +72 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.dto.ts +144 -0
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.errors.ts +19 -0
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.external-decision.spec.ts +350 -0
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/human-approval.service.ts +774 -0
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/humanApproval.module.ts +46 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/legacy-approval-config-migration.ts +227 -0
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/outbox-retry.util.ts +14 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.controller.ts +151 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/human-approval-runtime.dto.ts +88 -0
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/humanApproval/runtime/runtime-token.guard.ts +43 -0
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +21 -1
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.controller.ts +77 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.dto.ts +98 -0
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-connection.service.ts +277 -0
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-secret-cipher.spec.ts +14 -0
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integration-secret-cipher.ts +59 -0
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/integrationConnection/integrationConnection.module.ts +10 -0
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/actor-context.util.ts +27 -0
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/providers/user-group.provider.ts +208 -0
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/providers/user.provider.ts +168 -0
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.controller.spec.ts +157 -0
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.controller.ts +176 -0
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.dto.ts +21 -0
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.errors.ts +78 -0
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.registry.spec.ts +100 -0
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.registry.ts +115 -0
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subject-provider.types.ts +97 -0
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/subjectProvider/subjectProvider.module.ts +34 -0
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.spec.ts +89 -1
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/temporalTenantConfig/temporalTenantConfig.controller.ts +4 -0
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.controller.ts +119 -0
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.dto.ts +91 -0
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.errors.ts +34 -0
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.service.spec.ts +161 -0
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/user-group.service.ts +390 -0
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/userGroup/userGroup.module.ts +10 -0
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.spec.ts +17 -0
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/dsl-validate.util.ts +8 -2
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/parameter-binding.ts +93 -0
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.spec.ts +34 -1
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +26 -0
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.spec.ts +158 -0
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-callable.ts +155 -0
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.spec.ts +512 -0
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.service.ts +368 -0
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-compiler.types.ts +43 -0
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.spec.ts +174 -0
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-data-edge.util.ts +149 -0
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-dsl-comparison.ts +43 -0
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +1 -1
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +4 -0
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +70 -28
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-handle-validator.ts +128 -0
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.spec.ts +85 -0
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-http-response.ts +157 -0
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.spec.ts +59 -0
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +27 -5
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.module.ts +18 -3
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.spec.ts +493 -21
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +426 -90
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.spec.ts +79 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/node-config-validator.service.ts +62 -0
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/schema.types.ts +10 -0
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.spec.ts +124 -0
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/subject-config-validator.service.ts +236 -0
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.spec.ts +49 -0
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/widget-catalog.service.ts +69 -0
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowConfig/workflowConfig.module.ts +20 -0
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/node-instance-config.util.spec.ts +15 -0
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/node-instance-config.util.ts +25 -0
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.ts +103 -11
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.dto.ts +98 -0
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.module.ts +3 -0
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +72 -62
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.ts +148 -11
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +13 -9
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +5 -2
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/authProvider.ts +2 -2
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/BulkActions.tsx +0 -5
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/PageHeader.tsx +46 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/SearchBar.tsx +26 -18
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/eventList/index.tsx +2 -2
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logButton/index.tsx +24 -17
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/logList/index.tsx +7 -18
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/auditLog/components/modalDiffViewer/index.tsx +2 -2
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/index.tsx +288 -33
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/contexts/color-mode/themeStyles.ts +97 -0
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/index.ts +1 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/SettingDrawer.tsx +251 -0
  151. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/header.tsx +47 -19
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/layout.tsx +18 -9
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/menuRenderer.tsx +155 -0
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +123 -129
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.test.ts +10 -0
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +18 -0
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/constants/layout.ts +32 -3
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddDataModal.tsx +98 -3
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/AddPageModal.tsx +101 -0
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +8 -0
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/style.css +51 -0
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/form.tsx +1 -1
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +1 -1
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/login.ts +40 -1
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/show.tsx +5 -5
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useDynamicResources.tsx +16 -1
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/hooks/useListPageState.ts +10 -7
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/i18n.ts +4 -2
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +26 -2
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/workflow.json +575 -0
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +26 -2
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/workflow.json +575 -0
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/plugins/devShellPlugin.ts +152 -2
  174. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +9 -15
  175. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/show.tsx +41 -9
  176. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/edit.tsx +1 -1
  177. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/list.tsx +10 -8
  178. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/show.tsx +3 -3
  179. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/components/action-cell.css +1 -1
  180. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/edit.tsx +1 -1
  181. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/list.tsx +141 -138
  182. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/audit/show.tsx +3 -6
  183. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.css +3 -0
  184. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasCell.tsx +45 -13
  185. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasComponentLibrary.tsx +45 -22
  186. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +175 -119
  187. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +248 -74
  188. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +33 -18
  189. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CodeFloatWindow.tsx +16 -10
  190. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/PublishModal.tsx +1 -1
  191. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +31 -0
  192. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +15 -0
  193. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/BarChartDataSourceModal.tsx +16 -11
  194. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/CanvasAiModal.tsx +25 -21
  195. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/ExportModal.tsx +6 -1
  196. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/LineChartDataSourceModal.tsx +9 -10
  197. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartConfigModal.tsx +4 -7
  198. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartDataSourceModal.tsx +23 -9
  199. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/NumCardDataSourceModal.tsx +16 -11
  200. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/PromptModal.tsx +2 -5
  201. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/RadarChartDataSourceModal.tsx +16 -11
  202. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableConfigModal.tsx +2 -9
  203. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableDataSourceModal.tsx +23 -12
  204. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/canvasModalProps.ts +2 -17
  205. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.test.ts +149 -0
  206. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/sectionCompactor.ts +111 -17
  207. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/types.ts +1 -0
  208. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardLayout.test.ts +83 -0
  209. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardLayout.ts +118 -0
  210. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/whiteboardName.test.ts +26 -0
  211. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas-page/index.tsx +9 -1
  212. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/edit.tsx +1 -1
  213. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/list.tsx +10 -8
  214. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/game/show.tsx +3 -6
  215. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/DecisionModal.tsx +71 -0
  216. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/human-approval/inbox.tsx +209 -0
  217. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/Components/AssignRolesModal.tsx +6 -1
  218. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/page/list.tsx +47 -150
  219. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/permissionReadme/index.tsx +21 -20
  220. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/Components/modal.tsx +1 -1
  221. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/resource/list.tsx +115 -118
  222. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/Components/modal.tsx +1 -1
  223. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/role/list.tsx +61 -64
  224. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/components/show-drawer.tsx +1 -1
  225. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/user/list.tsx +187 -200
  226. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.test.tsx +84 -0
  227. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/ApprovalChannelModal.tsx +141 -0
  228. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/approval-channel.types.ts +16 -0
  229. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/approval-channels/index.tsx +210 -0
  230. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CreateNodeInstanceDrawer.tsx +154 -0
  231. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +194 -5
  232. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DeletableEdge.tsx +76 -0
  233. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/DslView.tsx +1 -1
  234. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/EnhancedFlowRenderer.tsx +176 -22
  235. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.test.tsx +62 -0
  236. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExecutionStatusNode.tsx +94 -5
  237. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExportModal.tsx +15 -10
  238. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +251 -70
  239. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ImportModal.tsx +18 -24
  240. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/InstanceRequiredDialog.tsx +106 -0
  241. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.test.tsx +45 -0
  242. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/LookupConnectionDialog.tsx +43 -0
  243. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NewNodeDefaults.test.tsx +283 -0
  244. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeEditModal.tsx +6 -7
  245. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.test.tsx +335 -0
  246. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +433 -237
  247. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ParameterBindingEditor.tsx +179 -0
  248. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.tsx +18 -16
  249. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +20 -16
  250. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/VersionPanel.tsx +6 -4
  251. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.test.tsx +68 -0
  252. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/ConnectionModal.tsx +367 -0
  253. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/connection.types.ts +21 -0
  254. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/connections/index.tsx +180 -0
  255. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +38 -22
  256. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useNodeInstanceLibrary.ts +41 -0
  257. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +6 -0
  258. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +29 -35
  259. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +8 -11
  260. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +4 -3
  261. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +56 -23
  262. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/create.tsx +21 -6
  263. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/edit.tsx +17 -20
  264. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/index.tsx +9 -17
  265. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaField.tsx +311 -0
  266. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.test.tsx +218 -0
  267. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/SchemaForm.tsx +83 -0
  268. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/default-widgets.tsx +135 -0
  269. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/schema-defaults.ts +36 -0
  270. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/schema.types.ts +32 -0
  271. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.test.tsx +23 -0
  272. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/schema-form/widget-registry.tsx +52 -0
  273. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +9 -13
  274. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRequestTriggerConfigEditor.tsx +39 -0
  275. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.test.tsx +20 -0
  276. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApprovalRuleEditor.tsx +72 -0
  277. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.test.tsx +47 -0
  278. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ApproverSourceEditor.tsx +185 -0
  279. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.test.tsx +102 -0
  280. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CallableInputParametersEditor.tsx +150 -0
  281. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/CodeConfigEditor.tsx +103 -0
  282. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.test.tsx +135 -0
  283. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalRequestConfigEditor.tsx +273 -0
  284. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ExternalWaitConfigEditor.tsx +303 -0
  285. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.test.tsx +189 -0
  286. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HttpRequestConfigEditor.tsx +706 -0
  287. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.test.tsx +86 -0
  288. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/HumanApprovalConfigEditor.tsx +458 -0
  289. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.test.tsx +81 -0
  290. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/ReturnResultConfigEditor.tsx +281 -0
  291. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.test.tsx +61 -0
  292. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubjectPicker.tsx +266 -0
  293. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitApprovalResultConfigEditor.tsx +104 -0
  294. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/SubmitExternalResultConfigEditor.tsx +98 -0
  295. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupCreateModal.tsx +70 -0
  296. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/UserGroupEditModal.tsx +138 -0
  297. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.test.ts +25 -0
  298. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/approver-source.ts +42 -0
  299. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/widgets/subject-provider.api.ts +95 -0
  300. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +15 -11
  301. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.test.tsx +152 -0
  302. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/temporal-tenant/index.tsx +438 -141
  303. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types/parameter-binding.ts +49 -0
  304. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +31 -2
  305. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.test.ts +208 -0
  306. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/lookupConnection.ts +246 -0
  307. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/newNodeConfig.ts +77 -0
  308. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.test.ts +34 -0
  309. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/removeWorkflowEdges.ts +18 -0
  310. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveLookupPorts.ts +66 -0
  311. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.test.ts +39 -0
  312. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveOutputs.ts +48 -0
  313. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.test.ts +51 -0
  314. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/utils/resolveWorkflowDisplay.ts +32 -0
  315. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +1 -1
  316. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +10 -8
  317. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +3 -3
  318. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd-theme-vars.css +93 -0
  319. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/antd.css +8 -8
  320. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/fc.css +4 -4
  321. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/index.css +40 -5
  322. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-drawer.module.css +3 -3
  323. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/show-page.module.css +3 -3
  324. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/styles/theme-styles.css +81 -0
  325. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/test/setup.ts +5 -0
  326. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vite.config.ts +1 -7
  327. package/dist/lib/application/files/gadmin2-game-angle-demo/web/vitest.config.ts +12 -0
  328. package/package.json +1 -1
  329. 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
+ }),
40
53
  },
41
- workflow: { update: prisma.workflow.update },
54
+ workflow: {
55
+ update: prisma.workflow.update,
56
+ delete: prisma.workflow.delete,
57
+ },
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({});
@@ -321,6 +617,7 @@ describe('WorkflowService — receiveWebhook', () => {
321
617
  };
322
618
  temporal = {
323
619
  startWorkflow: jest.fn(async () => ({ temporalRunId: 'run-1' })),
620
+ waitForWorkflowResult: jest.fn(),
324
621
  };
325
622
 
326
623
  const module: TestingModule = await Test.createTestingModule({
@@ -328,6 +625,11 @@ describe('WorkflowService — receiveWebhook', () => {
328
625
  WorkflowService,
329
626
  { provide: PrismaService, useValue: prisma },
330
627
  { provide: TemporalService, useValue: temporal },
628
+ { provide: HumanApprovalService, useValue: {} },
629
+ {
630
+ provide: WorkflowCompilerService,
631
+ useValue: { compile: jest.fn(async (dsl: any) => dsl) },
632
+ },
331
633
  ],
332
634
  }).compile();
333
635
 
@@ -342,7 +644,14 @@ describe('WorkflowService — receiveWebhook', () => {
342
644
 
343
645
  const nowSec = () => Math.floor(Date.now() / 1000).toString();
344
646
 
345
- const mkPublishedWorkflow = (id: number, secret = SECRET, path = PATH) => ({
647
+ const mkPublishedWorkflow = (
648
+ id: number,
649
+ secret = SECRET,
650
+ path = PATH,
651
+ verificationMode?: 'HMAC' | 'NONE',
652
+ responseMode?: 'IMMEDIATE' | 'WAIT_FOR_RESULT',
653
+ responseTimeoutSeconds?: number,
654
+ ) => ({
346
655
  id: BigInt(id),
347
656
  status: 'PUBLISHED',
348
657
  isEnabled: true,
@@ -356,7 +665,14 @@ describe('WorkflowService — receiveWebhook', () => {
356
665
  {
357
666
  id: 't1',
358
667
  type: 'webhook_trigger',
359
- config: { path, method: METHOD, secret },
668
+ config: {
669
+ path,
670
+ method: METHOD,
671
+ secret,
672
+ ...(verificationMode && { verificationMode }),
673
+ ...(responseMode && { responseMode }),
674
+ ...(responseTimeoutSeconds && { responseTimeoutSeconds }),
675
+ },
360
676
  },
361
677
  ],
362
678
  edges: [],
@@ -379,11 +695,17 @@ describe('WorkflowService — receiveWebhook', () => {
379
695
  },
380
696
  ],
381
697
  }));
698
+ prisma.workflowVersion.findFirst.mockImplementation(({ where }: any) => ({
699
+ id: where.id,
700
+ version: 1,
701
+ dsl: { nodes: [], edges: [] },
702
+ }));
382
703
  prisma.workflowInstance.create.mockResolvedValueOnce({ id: BigInt(7777) });
383
704
  prisma.workflowInstance.update.mockResolvedValueOnce({});
384
705
  };
385
706
 
386
707
  it('returns 401 (UnauthorizedException) when timestamp is missing', async () => {
708
+ prisma.workflow.findMany.mockResolvedValueOnce([mkPublishedWorkflow(1)]);
387
709
  const sig = signWebhookPayload(SECRET, nowSec(), RAW);
388
710
  await expect(
389
711
  service.receiveWebhook({
@@ -400,6 +722,7 @@ describe('WorkflowService — receiveWebhook', () => {
400
722
  });
401
723
 
402
724
  it('returns 401 when timestamp is older than 5 minutes', async () => {
725
+ prisma.workflow.findMany.mockResolvedValueOnce([mkPublishedWorkflow(1)]);
403
726
  const oldTs = String(Math.floor(Date.now() / 1000) - 6 * 60);
404
727
  const sig = signWebhookPayload(SECRET, oldTs, RAW);
405
728
  await expect(
@@ -473,8 +796,157 @@ describe('WorkflowService — receiveWebhook', () => {
473
796
  expect(temporal.startWorkflow).toHaveBeenCalledTimes(1);
474
797
  const startArg = temporal.startWorkflow.mock.calls[0][0];
475
798
  expect(startArg.context).toMatchObject({
799
+ workflow: {
800
+ body: { orderId: 42 },
801
+ query: { foo: 'bar' },
802
+ },
803
+ nodes: {},
804
+ });
805
+ });
806
+
807
+ it('starts a direct webhook without signature headers', async () => {
808
+ prisma.workflow.findMany.mockResolvedValueOnce([
809
+ mkPublishedWorkflow(1, '', PATH, 'NONE'),
810
+ ]);
811
+ mkExecuteSetup();
812
+
813
+ const result = await service.receiveWebhook({
814
+ path: PATH,
815
+ method: METHOD,
816
+ signatureHeader: undefined,
817
+ timestampHeader: undefined,
818
+ rawBody: RAW,
819
+ body: { id: 'myoa-work-item-1' },
820
+ headers: { 'content-type': 'text/json' },
821
+ query: {},
822
+ });
823
+
824
+ expect(result.instanceIds).toEqual(['7777']);
825
+ expect(temporal.startWorkflow).toHaveBeenCalledTimes(1);
826
+ expect(temporal.startWorkflow.mock.calls[0][0].context).toMatchObject({
827
+ workflow: {
828
+ body: { id: 'myoa-work-item-1' },
829
+ },
830
+ });
831
+ });
832
+
833
+ it('waits for the Workflow return result when the trigger uses function mode', async () => {
834
+ prisma.workflow.findMany.mockResolvedValueOnce([
835
+ mkPublishedWorkflow(1, '', PATH, 'NONE', 'WAIT_FOR_RESULT', 45),
836
+ ]);
837
+ mkExecuteSetup();
838
+ temporal.waitForWorkflowResult.mockResolvedValueOnce({
839
+ kind: 'COMPLETED',
840
+ result: {
841
+ status: 'COMPLETED',
842
+ output: {
843
+ ticketId: 'T-42',
844
+ accepted: true,
845
+ },
846
+ httpResponse: {
847
+ statusCode: 201,
848
+ headers: {
849
+ 'x-workflow-result': 'created',
850
+ },
851
+ },
852
+ },
853
+ });
854
+
855
+ const result = await service.receiveWebhook({
856
+ path: PATH,
857
+ method: METHOD,
858
+ signatureHeader: undefined,
859
+ timestampHeader: undefined,
860
+ rawBody: RAW,
476
861
  body: { orderId: 42 },
477
- query: { foo: 'bar' },
862
+ headers: {},
863
+ query: {},
864
+ });
865
+
866
+ expect(result).toEqual({
867
+ instanceIds: ['7777'],
868
+ response: {
869
+ statusCode: 201,
870
+ headers: {
871
+ 'x-workflow-result': 'created',
872
+ },
873
+ body: {
874
+ ticketId: 'T-42',
875
+ accepted: true,
876
+ },
877
+ },
878
+ });
879
+ expect(temporal.waitForWorkflowResult).toHaveBeenCalledWith(
880
+ 'run-1',
881
+ 45_000,
882
+ );
883
+ });
884
+
885
+ it('returns a gateway timeout without cancelling a still-running Workflow', async () => {
886
+ prisma.workflow.findMany.mockResolvedValueOnce([
887
+ mkPublishedWorkflow(1, '', PATH, 'NONE', 'WAIT_FOR_RESULT', 60),
888
+ ]);
889
+ mkExecuteSetup();
890
+ temporal.waitForWorkflowResult.mockResolvedValueOnce({
891
+ kind: 'TIMED_OUT',
892
+ });
893
+
894
+ const result = await service.receiveWebhook({
895
+ path: PATH,
896
+ method: METHOD,
897
+ signatureHeader: undefined,
898
+ timestampHeader: undefined,
899
+ rawBody: RAW,
900
+ body: {},
901
+ headers: {},
902
+ query: {},
903
+ });
904
+
905
+ expect(result).toEqual({
906
+ instanceIds: ['7777'],
907
+ response: {
908
+ statusCode: 504,
909
+ headers: {},
910
+ body: {
911
+ code: 'WORKFLOW_RESPONSE_TIMEOUT',
912
+ message: 'Workflow did not return a result within 60 seconds',
913
+ instanceId: '7777',
914
+ },
915
+ },
916
+ });
917
+ });
918
+
919
+ it('returns an internal error response when the Workflow execution fails', async () => {
920
+ prisma.workflow.findMany.mockResolvedValueOnce([
921
+ mkPublishedWorkflow(1, '', PATH, 'NONE', 'WAIT_FOR_RESULT'),
922
+ ]);
923
+ mkExecuteSetup();
924
+ temporal.waitForWorkflowResult.mockRejectedValueOnce(
925
+ new Error('private Temporal failure'),
926
+ );
927
+
928
+ const result = await service.receiveWebhook({
929
+ path: PATH,
930
+ method: METHOD,
931
+ signatureHeader: undefined,
932
+ timestampHeader: undefined,
933
+ rawBody: RAW,
934
+ body: {},
935
+ headers: {},
936
+ query: {},
937
+ });
938
+
939
+ expect(result).toEqual({
940
+ instanceIds: ['7777'],
941
+ response: {
942
+ statusCode: 500,
943
+ headers: {},
944
+ body: {
945
+ code: 'WORKFLOW_EXECUTION_FAILED',
946
+ message: 'Workflow execution failed',
947
+ instanceId: '7777',
948
+ },
949
+ },
478
950
  });
479
951
  });
480
952