@gadmin2n/schematics 0.0.72 → 0.0.74

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 (173) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.js +2 -0
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/job.prisma +62 -0
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +0 -21
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/workflow.prisma +171 -0
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/AgendaJob.ts +60 -0
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/Event.ts +1 -1
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowEventOutbox.ts +62 -0
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowNodeInstance.ts +62 -0
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/config/ui/WorkflowNodeType.ts +62 -0
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/server/.env +5 -0
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +5 -4
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/server/prisma.config.ts +14 -7
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/index.ts +4 -0
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permissions.ts +49 -3
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflow-node-types.ts +746 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/workflows.ts +786 -0
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.controller.ts +6 -0
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.service.ts +79 -0
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agendaJob/agendaJob.controller.spec.ts +20 -0
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agendaJob/agendaJob.controller.ts +145 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agendaJob/agendaJob.module.ts +10 -0
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/{canvas/canvas.service.spec.ts → agendaJob/agendaJob.service.spec.ts} +71 -65
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agendaJob/agendaJob.service.ts +83 -0
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/index.ts +2 -1
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.module.ts +9 -0
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/temporal.service.ts +100 -0
  28. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-execution.dto.ts +19 -0
  29. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.dto.ts +43 -0
  30. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-export.service.ts +317 -0
  31. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-node-type.controller.ts +16 -0
  32. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow-node-type.service.ts +13 -0
  33. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.controller.ts +220 -0
  34. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.dto.ts +82 -0
  35. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.module.ts +16 -0
  36. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflow/workflow.service.ts +505 -0
  37. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.spec.ts +22 -0
  38. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.controller.ts +147 -0
  39. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.module.ts +10 -0
  40. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.spec.ts +356 -0
  41. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowEventOutbox/workflowEventOutbox.service.ts +110 -0
  42. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.spec.ts +22 -0
  43. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.controller.ts +216 -0
  44. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.module.ts +10 -0
  45. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.spec.ts +356 -0
  46. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeInstance/workflowNodeInstance.service.ts +168 -0
  47. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.controller.spec.ts +22 -0
  48. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.controller.ts +199 -0
  49. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.module.ts +10 -0
  50. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.service.spec.ts +348 -0
  51. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/workflowNodeType/workflowNodeType.service.ts +106 -0
  52. package/dist/lib/application/files/gadmin2-game-angle-demo/server/yarn.lock +579 -1082
  53. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/README.md +278 -0
  54. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/config/development-sql.yaml +5 -0
  55. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/docker-compose.yml +25 -0
  56. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/package.json +13 -0
  57. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/sql/create-event-trigger.sql +87 -0
  58. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/.env +7 -0
  59. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/SANDBOX.md +122 -0
  60. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/package-lock.json +4285 -0
  61. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/package.json +28 -0
  62. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/__tests__/activities/code-execute.test.ts +44 -0
  63. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/__tests__/activities/http-request.test.ts +87 -0
  64. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/__tests__/helpers.test.ts +225 -0
  65. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/__tests__/node-type-consistency.test.ts +101 -0
  66. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/code-execute.ts +51 -0
  67. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/db-execute.ts +85 -0
  68. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/db-query.ts +35 -0
  69. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/http-request.ts +54 -0
  70. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/index.ts +6 -0
  71. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/reporting.ts +62 -0
  72. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/activities/send-notification.ts +47 -0
  73. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/config.ts +13 -0
  74. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/condition.ts +101 -0
  75. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/context.ts +58 -0
  76. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/graph.ts +184 -0
  77. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/helpers.ts +133 -0
  78. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/node-types.ts +57 -0
  79. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/dsl/types.ts +77 -0
  80. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/index.ts +36 -0
  81. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/outbox-poller.ts +226 -0
  82. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/src/workflows/dsl-workflow.ts +411 -0
  83. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/tsconfig.json +19 -0
  84. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/vitest.config.ts +8 -0
  85. package/dist/lib/application/files/gadmin2-game-angle-demo/temporal/worker/yarn.lock +1905 -0
  86. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package-lock.json +17555 -0
  87. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +5 -2
  88. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/App.tsx +1 -0
  89. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/sider.tsx +5 -1
  90. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/layout/title.tsx +1 -1
  91. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +63 -0
  92. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +91 -2
  93. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/list.tsx +48 -2
  94. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/helpers/show.tsx +43 -2
  95. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +14 -9
  96. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +14 -9
  97. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +309 -56
  98. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/show.tsx +1 -3
  99. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/create.tsx +108 -0
  100. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/edit.tsx +124 -0
  101. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/index.tsx +4 -0
  102. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/list.tsx +245 -0
  103. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agendaJob/show.tsx +70 -0
  104. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasListPage.tsx +0 -1
  105. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +160 -2
  106. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +120 -148
  107. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CodeFloatWindow.tsx +74 -181
  108. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/LivePreview.tsx +15 -13
  109. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasConfigRegistry.tsx +2 -2
  110. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +338 -3
  111. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasDefaults.ts +18 -17
  112. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/BarChartDataSourceModal.tsx +10 -4
  113. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/LineChartDataSourceModal.tsx +10 -4
  114. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/{ChartViewerConfigModal.tsx → MultiChartConfigModal.tsx} +30 -18
  115. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/MultiChartDataSourceModal.tsx +427 -0
  116. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/NumCardDataSourceModal.tsx +10 -4
  117. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/PromptModal.tsx +6 -14
  118. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/RadarChartDataSourceModal.tsx +10 -4
  119. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/TableDataSourceModal.tsx +10 -4
  120. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/components/canvasModalProps.ts +24 -0
  121. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/demos.ts +45 -63
  122. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/CustomNode.tsx +99 -0
  123. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ExportModal.tsx +87 -0
  124. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/FlowRenderer.tsx +322 -0
  125. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/ImportModal.tsx +175 -0
  126. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodeEditModal.tsx +60 -0
  127. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/NodePropertyPanel.tsx +1150 -0
  128. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/RunWorkflowModal.tsx +101 -0
  129. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/StatusCards.tsx +198 -0
  130. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/components/VersionPanel.tsx +81 -0
  131. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/editor.tsx +566 -0
  132. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/hooks/useWorkflowAgent.ts +224 -0
  133. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/index.tsx +524 -0
  134. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instance-detail.tsx +343 -0
  135. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/instances.tsx +243 -0
  136. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/CreateNodeInstanceModal.tsx +363 -0
  137. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/DynamicConfigForm.tsx +154 -0
  138. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/components/NodeInstanceForm.tsx +176 -0
  139. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/create.tsx +77 -0
  140. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/edit.tsx +112 -0
  141. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/index.tsx +305 -0
  142. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/node-instances/show.tsx +282 -0
  143. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/show.tsx +469 -0
  144. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflow/types.ts +92 -0
  145. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/create.tsx +111 -0
  146. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/edit.tsx +127 -0
  147. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/index.tsx +4 -0
  148. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/list.tsx +254 -0
  149. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/workflowEventOutbox/show.tsx +74 -0
  150. package/dist/lib/application/files/gadmin2-game-angle-demo/web/yarn.lock +1501 -1199
  151. package/package.json +1 -1
  152. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.controller.spec.ts +0 -22
  153. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/BarChart/index.tsx +0 -896
  154. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartSwitcher/index.tsx +0 -219
  155. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/ChartViewer/index.tsx +0 -159
  156. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Filter/index.tsx +0 -192
  157. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/LineChart/index.tsx +0 -1034
  158. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/NumCard.module.css +0 -8
  159. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/index.tsx +0 -509
  160. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumLineCard/index.tsx +0 -66
  161. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/PieChart/index.tsx +0 -552
  162. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/RadarChart/index.tsx +0 -263
  163. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Section/index.tsx +0 -35
  164. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/Table/index.tsx +0 -207
  165. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/TreemapChart/index.tsx +0 -382
  166. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/WorldMap/index.tsx +0 -135
  167. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/chart-constants.ts +0 -53
  168. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/InfoIcon.tsx +0 -8
  169. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/icon/index.ts +0 -1
  170. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/config.ts +0 -31
  171. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/nameMap.json +0 -9
  172. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/map/world.geo.json +0 -39349
  173. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/metric-info-tooltip/index.tsx +0 -19
@@ -0,0 +1,356 @@
1
+ /// <reference types="jest" />
2
+ import { ConfigService } from '@nestjs/config';
3
+ import { Test, TestingModule } from '@nestjs/testing';
4
+ import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
5
+
6
+ // Mock nestjs-prisma 模块
7
+ jest.mock('nestjs-prisma', () => ({
8
+ PrismaService: jest.fn(),
9
+ }));
10
+
11
+ import { PrismaService } from 'nestjs-prisma';
12
+ import { WorkflowNodeInstanceService } from './workflowNodeInstance.service';
13
+
14
+ // Mock PrismaService
15
+ const mockPrismaService = {
16
+ workflowNodeInstance: {
17
+ create: jest.fn(),
18
+ createMany: jest.fn(),
19
+ findMany: jest.fn(),
20
+ findUnique: jest.fn(),
21
+ update: jest.fn(),
22
+ updateMany: jest.fn(),
23
+ delete: jest.fn(),
24
+ deleteMany: jest.fn(),
25
+ count: jest.fn(),
26
+ groupBy: jest.fn(),
27
+ aggregate: jest.fn(),
28
+ },
29
+ };
30
+
31
+ // Mock Logger
32
+ const mockLogger = {
33
+ child: jest.fn().mockReturnThis(),
34
+ info: jest.fn(),
35
+ error: jest.fn(),
36
+ warn: jest.fn(),
37
+ debug: jest.fn(),
38
+ };
39
+
40
+ // Mock ConfigService
41
+ const mockConfigService = {
42
+ get: jest.fn(),
43
+ };
44
+
45
+ describe('WorkflowNodeInstanceService', () => {
46
+ let service: WorkflowNodeInstanceService;
47
+ let prisma: typeof mockPrismaService;
48
+
49
+ beforeEach(async () => {
50
+ // 每个测试前重置所有 mock
51
+ jest.clearAllMocks();
52
+
53
+ const module: TestingModule = await Test.createTestingModule({
54
+ providers: [
55
+ WorkflowNodeInstanceService,
56
+ { provide: PrismaService, useValue: mockPrismaService },
57
+ { provide: ConfigService, useValue: mockConfigService },
58
+ { provide: WINSTON_MODULE_PROVIDER, useValue: mockLogger },
59
+ ],
60
+ }).compile();
61
+
62
+ service = module.get<WorkflowNodeInstanceService>(
63
+ WorkflowNodeInstanceService,
64
+ );
65
+ prisma = mockPrismaService;
66
+ });
67
+
68
+ it('should be defined', () => {
69
+ expect(service).toBeDefined();
70
+ });
71
+
72
+ describe('createOne', () => {
73
+ it('should create a single workflowNodeInstance record', async () => {
74
+ const createArgs = {
75
+ data: {
76
+ name: 'test_name',
77
+ description: 'test_description',
78
+ config: {},
79
+ isEnabled: true,
80
+ creator: 'test_creator',
81
+ },
82
+ };
83
+ const expectedResult = { id: BigInt(1), ...createArgs.data };
84
+
85
+ prisma.workflowNodeInstance.create.mockResolvedValue(expectedResult);
86
+
87
+ const result = await service.createOne(createArgs);
88
+
89
+ expect(prisma.workflowNodeInstance.create).toHaveBeenCalledWith(
90
+ createArgs,
91
+ );
92
+ expect(prisma.workflowNodeInstance.create).toHaveBeenCalledTimes(1);
93
+ expect(result).toEqual(expectedResult);
94
+ });
95
+
96
+ it('should throw error when create fails', async () => {
97
+ const createArgs = {
98
+ data: {
99
+ name: 'test_name',
100
+ description: 'test_description',
101
+ config: {},
102
+ isEnabled: true,
103
+ creator: 'test_creator',
104
+ },
105
+ };
106
+ const error = new Error('Database connection failed');
107
+
108
+ prisma.workflowNodeInstance.create.mockRejectedValue(error);
109
+
110
+ await expect(service.createOne(createArgs)).rejects.toThrow(
111
+ 'Database connection failed',
112
+ );
113
+ });
114
+ });
115
+
116
+ describe('createMany', () => {
117
+ it('should create multiple workflowNodeInstance records with skipDuplicates', async () => {
118
+ const data = [
119
+ {
120
+ name: 'test_name',
121
+ description: 'test_description',
122
+ config: {},
123
+ isEnabled: true,
124
+ creator: 'test_creator',
125
+ },
126
+ {
127
+ name: 'test_name',
128
+ description: 'test_description',
129
+ config: {},
130
+ isEnabled: true,
131
+ creator: 'test_creator',
132
+ },
133
+ ];
134
+ const expectedResult = { count: 2 };
135
+
136
+ prisma.workflowNodeInstance.createMany.mockResolvedValue(expectedResult);
137
+
138
+ const result = await service.createMany(data);
139
+
140
+ expect(prisma.workflowNodeInstance.createMany).toHaveBeenCalledWith({
141
+ data,
142
+ skipDuplicates: true,
143
+ });
144
+ expect(result).toEqual(expectedResult);
145
+ });
146
+ });
147
+
148
+ describe('findMany', () => {
149
+ it('should return entities with itemCount', async () => {
150
+ const findArgs = {
151
+ where: {},
152
+ take: 10,
153
+ skip: 0,
154
+ };
155
+ const mockEntities = [{ id: BigInt(1) }, { id: BigInt(1) }];
156
+
157
+ prisma.workflowNodeInstance.count.mockResolvedValue(2);
158
+ prisma.workflowNodeInstance.findMany.mockResolvedValue(mockEntities);
159
+
160
+ const result = await service.findMany(findArgs);
161
+
162
+ expect(prisma.workflowNodeInstance.count).toHaveBeenCalledWith({
163
+ where: findArgs.where,
164
+ });
165
+ expect(prisma.workflowNodeInstance.findMany).toHaveBeenCalledWith(
166
+ findArgs,
167
+ );
168
+ expect(result).toEqual({
169
+ itemCount: 2,
170
+ entities: mockEntities,
171
+ });
172
+ });
173
+
174
+ it('should return empty result when no records found', async () => {
175
+ const findArgs = { where: {} };
176
+
177
+ prisma.workflowNodeInstance.count.mockResolvedValue(0);
178
+ prisma.workflowNodeInstance.findMany.mockResolvedValue([]);
179
+
180
+ const result = await service.findMany(findArgs);
181
+
182
+ expect(result).toEqual({ itemCount: 0, entities: [] });
183
+ });
184
+ });
185
+
186
+ describe('findUnique', () => {
187
+ it('should find a single workflowNodeInstance record by id', async () => {
188
+ const id = BigInt(1);
189
+ const select = { id: true };
190
+ const expectedResult = { id: BigInt(1) };
191
+
192
+ prisma.workflowNodeInstance.findUnique.mockResolvedValue(expectedResult);
193
+
194
+ const result = await service.findUnique(id, select);
195
+
196
+ expect(prisma.workflowNodeInstance.findUnique).toHaveBeenCalledWith({
197
+ where: { id },
198
+ select,
199
+ });
200
+ expect(result).toEqual(expectedResult);
201
+ });
202
+
203
+ it('should return null when record not found', async () => {
204
+ prisma.workflowNodeInstance.findUnique.mockResolvedValue(null);
205
+
206
+ const result = await service.findUnique(BigInt(1), { id: true });
207
+
208
+ expect(result).toBeNull();
209
+ });
210
+ });
211
+
212
+ describe('updateUnique', () => {
213
+ it('should update a single workflowNodeInstance record', async () => {
214
+ const id = BigInt(1);
215
+ const data = {
216
+ name: 'test_name',
217
+ description: 'test_description',
218
+ config: {},
219
+ isEnabled: true,
220
+ creator: 'test_creator',
221
+ };
222
+ const expectedResult = { id: BigInt(1), ...data };
223
+
224
+ prisma.workflowNodeInstance.update.mockResolvedValue(expectedResult);
225
+
226
+ const result = await service.updateUnique(id, data);
227
+
228
+ expect(prisma.workflowNodeInstance.update).toHaveBeenCalledWith({
229
+ where: { id },
230
+ data,
231
+ });
232
+ expect(result).toEqual(expectedResult);
233
+ });
234
+ });
235
+
236
+ describe('updateMany', () => {
237
+ it('should update multiple workflowNodeInstance records', async () => {
238
+ const updateArgs = {
239
+ where: {},
240
+ data: {
241
+ name: 'test_name',
242
+ description: 'test_description',
243
+ config: {},
244
+ isEnabled: true,
245
+ creator: 'test_creator',
246
+ },
247
+ };
248
+ const expectedResult = { count: 5 };
249
+
250
+ prisma.workflowNodeInstance.updateMany.mockResolvedValue(expectedResult);
251
+
252
+ const result = await service.updateMany(updateArgs);
253
+
254
+ expect(prisma.workflowNodeInstance.updateMany).toHaveBeenCalledWith(
255
+ updateArgs,
256
+ );
257
+ expect(result).toEqual(expectedResult);
258
+ });
259
+ });
260
+
261
+ describe('deleteUnique', () => {
262
+ it('should delete a single workflowNodeInstance record and return count', async () => {
263
+ const id = BigInt(1);
264
+
265
+ prisma.workflowNodeInstance.delete.mockResolvedValue({ id: BigInt(1) });
266
+
267
+ const result = await service.deleteUnique(id);
268
+
269
+ expect(prisma.workflowNodeInstance.delete).toHaveBeenCalledWith({
270
+ where: { id },
271
+ });
272
+ expect(result).toEqual({ count: 1 });
273
+ });
274
+ });
275
+
276
+ describe('deleteMany', () => {
277
+ it('should delete multiple workflowNodeInstance records', async () => {
278
+ const deleteArgs = { where: {} };
279
+ const expectedResult = { count: 3 };
280
+
281
+ prisma.workflowNodeInstance.deleteMany.mockResolvedValue(expectedResult);
282
+
283
+ const result = await service.deleteMany(deleteArgs);
284
+
285
+ expect(prisma.workflowNodeInstance.deleteMany).toHaveBeenCalledWith(
286
+ deleteArgs,
287
+ );
288
+ expect(result).toEqual(expectedResult);
289
+ });
290
+ });
291
+
292
+ describe('count', () => {
293
+ it('should count workflowNodeInstance records with filter', async () => {
294
+ const countArgs = { where: {} };
295
+
296
+ prisma.workflowNodeInstance.count.mockResolvedValue(10);
297
+
298
+ const result = await service.count(countArgs);
299
+
300
+ expect(prisma.workflowNodeInstance.count).toHaveBeenCalledWith(countArgs);
301
+ expect(result).toBe(10);
302
+ });
303
+
304
+ it('should count all records when no filter provided', async () => {
305
+ prisma.workflowNodeInstance.count.mockResolvedValue(100);
306
+
307
+ const result = await service.count();
308
+
309
+ expect(prisma.workflowNodeInstance.count).toHaveBeenCalledWith(undefined);
310
+ expect(result).toBe(100);
311
+ });
312
+ });
313
+
314
+ describe('groupBy', () => {
315
+ it('should group workflowNodeInstance records by specified field', async () => {
316
+ const groupByArgs = {
317
+ by: ['id'],
318
+ _count: { id: true },
319
+ };
320
+ const expectedResult = [{ id: BigInt(1), _count: { id: 50 } }];
321
+
322
+ prisma.workflowNodeInstance.groupBy.mockResolvedValue(expectedResult);
323
+
324
+ const result = await service.groupBy(groupByArgs as any);
325
+
326
+ expect(prisma.workflowNodeInstance.groupBy).toHaveBeenCalledWith(
327
+ groupByArgs,
328
+ );
329
+ expect(result).toEqual(expectedResult);
330
+ });
331
+ });
332
+
333
+ describe('aggregate', () => {
334
+ it('should aggregate workflowNodeInstance records', async () => {
335
+ const aggregateArgs = {
336
+ _count: true,
337
+ _max: { id: true },
338
+ _min: { id: true },
339
+ } as const;
340
+ const expectedResult = {
341
+ _count: 100,
342
+ _max: { id: BigInt(1) },
343
+ _min: { id: BigInt(1) },
344
+ };
345
+
346
+ prisma.workflowNodeInstance.aggregate.mockResolvedValue(expectedResult);
347
+
348
+ const result = await service.aggregate(aggregateArgs);
349
+
350
+ expect(prisma.workflowNodeInstance.aggregate).toHaveBeenCalledWith(
351
+ aggregateArgs,
352
+ );
353
+ expect(result).toEqual(expectedResult);
354
+ });
355
+ });
356
+ });
@@ -0,0 +1,168 @@
1
+ import { Inject, Injectable } from '@nestjs/common';
2
+ import { Prisma, WorkflowNodeInstance } from '@prisma/client';
3
+ import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
4
+ import { PrismaService } from 'nestjs-prisma';
5
+ import { Logger } from 'winston';
6
+
7
+ import { ConfigService } from '@nestjs/config';
8
+
9
+ @Injectable()
10
+ export class WorkflowNodeInstanceService {
11
+ constructor(
12
+ private prisma: PrismaService,
13
+ private readonly config: ConfigService,
14
+ @Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger,
15
+ ) {}
16
+
17
+ async createOne(
18
+ workflowNodeInstanceCreateArgs: Prisma.WorkflowNodeInstanceCreateArgs,
19
+ ) {
20
+ return await this.prisma.workflowNodeInstance.create(
21
+ workflowNodeInstanceCreateArgs,
22
+ );
23
+ }
24
+
25
+ async createMany(data: Prisma.WorkflowNodeInstanceCreateManyArgs['data']) {
26
+ return await this.prisma.workflowNodeInstance.createMany({
27
+ data,
28
+ skipDuplicates: true,
29
+ });
30
+ }
31
+
32
+ async findMany(
33
+ workflowNodeInstanceFindManyArgs: Prisma.WorkflowNodeInstanceFindManyArgs,
34
+ ): Promise<{ itemCount: number; entities: WorkflowNodeInstance[] }> {
35
+ const itemCount = await this.prisma.workflowNodeInstance.count({
36
+ where: workflowNodeInstanceFindManyArgs.where,
37
+ });
38
+ const entities = await this.prisma.workflowNodeInstance.findMany(
39
+ workflowNodeInstanceFindManyArgs,
40
+ );
41
+ return { itemCount, entities };
42
+ }
43
+
44
+ async findUnique(
45
+ id: number,
46
+ select: Prisma.WorkflowNodeInstanceFindUniqueArgs['select'],
47
+ ) {
48
+ return await this.prisma.workflowNodeInstance.findUnique({
49
+ where: { id: id },
50
+ select,
51
+ });
52
+ }
53
+
54
+ async updateMany(
55
+ workflowNodeInstanceUpdateManyArgs: Prisma.WorkflowNodeInstanceUpdateManyArgs,
56
+ ) {
57
+ return await this.prisma.workflowNodeInstance.updateMany(
58
+ workflowNodeInstanceUpdateManyArgs,
59
+ );
60
+ }
61
+
62
+ async updateUnique(
63
+ id: number,
64
+ data: Prisma.WorkflowNodeInstanceUpdateManyArgs['data'],
65
+ ) {
66
+ return await this.prisma.workflowNodeInstance.update({
67
+ where: { id: id },
68
+ data,
69
+ });
70
+ }
71
+
72
+ async deleteMany(
73
+ workflowNodeInstanceDeleteManyArgs: Prisma.WorkflowNodeInstanceDeleteManyArgs,
74
+ ) {
75
+ return await this.prisma.workflowNodeInstance.deleteMany(
76
+ workflowNodeInstanceDeleteManyArgs,
77
+ );
78
+ }
79
+
80
+ async deleteUnique(id: number) {
81
+ await this.prisma.workflowNodeInstance.delete({
82
+ where: { id: id },
83
+ });
84
+ return { count: 1 };
85
+ }
86
+
87
+ async count(
88
+ workflowNodeInstanceCountArgs?: Prisma.WorkflowNodeInstanceCountArgs,
89
+ ) {
90
+ return await this.prisma.workflowNodeInstance.count(
91
+ workflowNodeInstanceCountArgs,
92
+ );
93
+ }
94
+
95
+ async groupBy(
96
+ workflowNodeInstanceGroupByArgs: Prisma.WorkflowNodeInstanceGroupByArgs,
97
+ ) {
98
+ return await this.prisma.workflowNodeInstance.groupBy(
99
+ workflowNodeInstanceGroupByArgs as any,
100
+ );
101
+ }
102
+
103
+ async aggregate(
104
+ workflowNodeInstanceAggregateArgs: Prisma.WorkflowNodeInstanceAggregateArgs,
105
+ ) {
106
+ return await this.prisma.workflowNodeInstance.aggregate(
107
+ workflowNodeInstanceAggregateArgs,
108
+ );
109
+ }
110
+
111
+ async findReferences(instanceId: number): Promise<
112
+ {
113
+ workflowId: string;
114
+ workflowName: string;
115
+ versionId: string;
116
+ version: number;
117
+ nodeId: string;
118
+ nodeLabel: string;
119
+ }[]
120
+ > {
121
+ // Get the latest version per workflow
122
+ const workflows = await this.prisma.workflow.findMany({
123
+ select: {
124
+ id: true,
125
+ name: true,
126
+ versions: {
127
+ orderBy: { version: 'desc' },
128
+ take: 1,
129
+ select: { id: true, version: true, dsl: true },
130
+ },
131
+ },
132
+ });
133
+
134
+ const results: {
135
+ workflowId: string;
136
+ workflowName: string;
137
+ versionId: string;
138
+ version: number;
139
+ nodeId: string;
140
+ nodeLabel: string;
141
+ }[] = [];
142
+
143
+ const targetId = String(instanceId);
144
+
145
+ for (const wf of workflows) {
146
+ const latestVersion = wf.versions[0];
147
+ if (!latestVersion) continue;
148
+
149
+ const dsl = latestVersion.dsl as any;
150
+ if (!dsl?.nodes || !Array.isArray(dsl.nodes)) continue;
151
+
152
+ for (const node of dsl.nodes) {
153
+ if (node.instanceRef?.instanceId === targetId) {
154
+ results.push({
155
+ workflowId: String(wf.id),
156
+ workflowName: wf.name,
157
+ versionId: String(latestVersion.id),
158
+ version: latestVersion.version,
159
+ nodeId: node.id,
160
+ nodeLabel: node.label || node.type,
161
+ });
162
+ }
163
+ }
164
+ }
165
+
166
+ return results;
167
+ }
168
+ }
@@ -0,0 +1,22 @@
1
+ import { Test, TestingModule } from '@nestjs/testing';
2
+ import { WorkflowNodeTypeController } from './workflowNodeType.controller';
3
+ import { WorkflowNodeTypeService } from './workflowNodeType.service';
4
+
5
+ describe('WorkflowNodeTypeController', () => {
6
+ let controller: WorkflowNodeTypeController;
7
+
8
+ beforeEach(async () => {
9
+ const module: TestingModule = await Test.createTestingModule({
10
+ controllers: [WorkflowNodeTypeController],
11
+ providers: [WorkflowNodeTypeService],
12
+ }).compile();
13
+
14
+ controller = module.get<WorkflowNodeTypeController>(
15
+ WorkflowNodeTypeController,
16
+ );
17
+ });
18
+
19
+ it('should be defined', () => {
20
+ expect(controller).toBeDefined();
21
+ });
22
+ });