@gadmin2n/schematics 0.0.72 → 0.0.75

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,199 @@
1
+ import {
2
+ ACAttrFilter,
3
+ ACGuard,
4
+ ApiPaginatedResponse,
5
+ diskStorage,
6
+ PageDto,
7
+ PageMetaDto,
8
+ PageOptionsDto,
9
+ pick,
10
+ UserType,
11
+ } from '@gadmin2n/nest-common';
12
+ import {
13
+ Body,
14
+ Controller,
15
+ Delete,
16
+ Inject,
17
+ NotFoundException,
18
+ Param,
19
+ ParseIntPipe,
20
+ Patch,
21
+ Post,
22
+ Req,
23
+ UploadedFile,
24
+ UseGuards,
25
+ UseInterceptors,
26
+ } from '@nestjs/common';
27
+ import {
28
+ ApiCreatedResponse,
29
+ ApiNotFoundResponse,
30
+ ApiOkResponse,
31
+ ApiTags,
32
+ } from '@nestjs/swagger';
33
+ import { Prisma } from '@prisma/client';
34
+ import { UseRoles } from 'nest-access-control';
35
+ import { WINSTON_MODULE_PROVIDER } from 'nest-winston';
36
+ import { Logger } from 'winston';
37
+ import { CreateWorkflowNodeTypeDto } from '../../generated/workflowNodeType/dto/create-workflowNodeType.dto';
38
+ import { UpdateWorkflowNodeTypeDto } from '../../generated/workflowNodeType/dto/update-workflowNodeType.dto';
39
+ import {
40
+ EffectedCount,
41
+ UploudResponse,
42
+ WorkflowNodeTypeFindManyArgs,
43
+ WorkflowNodeTypeWhereSelect,
44
+ } from '../../generated/workflowNodeType/dto/workflowNodeType-types.dto';
45
+ import { WorkflowNodeTypeEntity } from '../../generated/workflowNodeType/entities/workflowNodeType.entity';
46
+ import { WorkflowNodeTypeService } from './workflowNodeType.service';
47
+
48
+ import { ConfigService } from '@nestjs/config';
49
+ import { FileInterceptor } from '@nestjs/platform-express';
50
+
51
+ @UseGuards(ACGuard)
52
+ @Controller('workflowNodeType')
53
+ @ApiTags('workflowNodeType')
54
+ export class WorkflowNodeTypeController {
55
+ constructor(
56
+ private readonly workflowNodeTypeService: WorkflowNodeTypeService,
57
+ private readonly config: ConfigService,
58
+ @Inject(WINSTON_MODULE_PROVIDER) private readonly logger: Logger,
59
+ ) {}
60
+
61
+ @Post('createOne')
62
+ @UseRoles({
63
+ resource: 'workflowNodeType',
64
+ action: 'create',
65
+ possession: 'any',
66
+ })
67
+ @ApiCreatedResponse({ type: WorkflowNodeTypeEntity })
68
+ async createOne(
69
+ @Body() body: CreateWorkflowNodeTypeDto,
70
+ @ACAttrFilter() acAttrFilter,
71
+ @Req() request: Request & { user: UserType },
72
+ ) {
73
+ body.creator = request.user.username;
74
+ return new WorkflowNodeTypeEntity(
75
+ await this.workflowNodeTypeService.createOne({
76
+ data: acAttrFilter(body),
77
+ }),
78
+ );
79
+ }
80
+
81
+ @Post('findMany')
82
+ @UseRoles({
83
+ resource: 'workflowNodeType',
84
+ action: 'read',
85
+ possession: 'any',
86
+ })
87
+ @ApiPaginatedResponse(WorkflowNodeTypeEntity)
88
+ async findMany(
89
+ @Body() body: WorkflowNodeTypeFindManyArgs,
90
+ @ACAttrFilter() acAttrFilter,
91
+ ): Promise<PageDto<WorkflowNodeTypeEntity>> {
92
+ const { itemCount, entities } = await this.workflowNodeTypeService.findMany(
93
+ body as Prisma.WorkflowNodeTypeFindManyArgs,
94
+ );
95
+ const { skip = 0, take = 10 } = body as Prisma.WorkflowNodeTypeFindManyArgs;
96
+ const pageOptionsDto: PageOptionsDto = { skip, take };
97
+ const pageMetaDto = new PageMetaDto({ itemCount, pageOptionsDto });
98
+
99
+ return new PageDto(
100
+ entities.map((item) => new WorkflowNodeTypeEntity(acAttrFilter(item))),
101
+ pageMetaDto,
102
+ );
103
+ }
104
+
105
+ @Post('/findUnique/:id')
106
+ @UseRoles({
107
+ resource: 'workflowNodeType',
108
+ action: 'read',
109
+ possession: 'any',
110
+ })
111
+ @ApiOkResponse({ type: WorkflowNodeTypeEntity })
112
+ @ApiNotFoundResponse({ description: 'Cannot found this record.' })
113
+ async findUnique(
114
+ @Param('id', ParseIntPipe) id: number,
115
+ @Body() body: WorkflowNodeTypeWhereSelect,
116
+ @ACAttrFilter() acAttrFilter,
117
+ ) {
118
+ const item = await this.workflowNodeTypeService.findUnique(id, body);
119
+ if (!item) {
120
+ throw new NotFoundException();
121
+ }
122
+ return new WorkflowNodeTypeEntity(acAttrFilter(item));
123
+ }
124
+
125
+ @Patch('updateUnique/:id')
126
+ @UseRoles({
127
+ resource: 'workflowNodeType',
128
+ action: 'update',
129
+ possession: 'any',
130
+ })
131
+ @ApiOkResponse({ type: WorkflowNodeTypeEntity })
132
+ @ApiNotFoundResponse({ description: 'Cannot found this record.' })
133
+ async updateUnique(
134
+ @Param('id', ParseIntPipe) id: number,
135
+ @Body() body: UpdateWorkflowNodeTypeDto,
136
+ @ACAttrFilter() acAttrFilter,
137
+ ) {
138
+ /*
139
+ const origin = (await this.workflowNodeTypeService.findUnique(id, {
140
+ id: true,
141
+ // 这里需要根据实际情况填写
142
+ })) as WorkflowNodeTypeEntity | null;
143
+ if (!origin) {
144
+ throw new NotFoundException();
145
+ }
146
+ // 需要兼容从列表页change_value入口进来的情况,这里进来的是只有少量字段的数据
147
+ const newBody = {
148
+ ...origin,
149
+ ...body,
150
+ };
151
+
152
+ // 其他个性化逻辑
153
+ */
154
+
155
+ const item = await this.workflowNodeTypeService.updateUnique(
156
+ id,
157
+ acAttrFilter(body),
158
+ );
159
+ return new WorkflowNodeTypeEntity(acAttrFilter(item));
160
+ }
161
+
162
+ @Delete('deleteUnique/:id')
163
+ @UseRoles({
164
+ resource: 'workflowNodeType',
165
+ action: 'delete',
166
+ possession: 'any',
167
+ })
168
+ @ApiOkResponse({ type: EffectedCount })
169
+ @ApiNotFoundResponse({ description: 'Cannot found this record.' })
170
+ async deleteUnique(@Param('id', ParseIntPipe) id: number) {
171
+ const res = await this.workflowNodeTypeService.deleteUnique(id);
172
+ if (!res.count) {
173
+ throw new NotFoundException();
174
+ }
175
+ return res;
176
+ }
177
+
178
+ @Post('upload')
179
+ @UseRoles({
180
+ resource: 'workflowNodeType',
181
+ action: 'create',
182
+ possession: 'any',
183
+ })
184
+ @ApiCreatedResponse({ type: UploudResponse })
185
+ @UseInterceptors(FileInterceptor('file'))
186
+ async uploadFile(@UploadedFile() file: Express.Multer.File) {
187
+ const fileName = await diskStorage(
188
+ file,
189
+ this.config.get('media')['rootDir'] + '/workflowNodeType/',
190
+ );
191
+
192
+ return {
193
+ ...pick(file, ['mimetype', 'originalname', 'size']),
194
+ url:
195
+ this.config.get('media')['address'] + '/workflowNodeType/' + fileName,
196
+ name: fileName,
197
+ };
198
+ }
199
+ }
@@ -0,0 +1,10 @@
1
+ import { Module } from '@nestjs/common';
2
+ import { WorkflowNodeTypeController } from './workflowNodeType.controller';
3
+ import { WorkflowNodeTypeService } from './workflowNodeType.service';
4
+
5
+ @Module({
6
+ controllers: [WorkflowNodeTypeController],
7
+ providers: [WorkflowNodeTypeService],
8
+ exports: [WorkflowNodeTypeService],
9
+ })
10
+ export class WorkflowNodeTypeModule {}
@@ -0,0 +1,348 @@
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 { WorkflowNodeTypeService } from './workflowNodeType.service';
13
+
14
+ // Mock PrismaService
15
+ const mockPrismaService = {
16
+ workflowNodeType: {
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('WorkflowNodeTypeService', () => {
46
+ let service: WorkflowNodeTypeService;
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
+ WorkflowNodeTypeService,
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<WorkflowNodeTypeService>(WorkflowNodeTypeService);
63
+ prisma = mockPrismaService;
64
+ });
65
+
66
+ it('should be defined', () => {
67
+ expect(service).toBeDefined();
68
+ });
69
+
70
+ describe('createOne', () => {
71
+ it('should create a single workflowNodeType record', async () => {
72
+ const createArgs = {
73
+ data: {
74
+ type: 'test_type',
75
+ category: 'ENUM_VALUE',
76
+ label: 'test_label',
77
+ icon: 'test_icon',
78
+ description: 'test_description',
79
+ },
80
+ };
81
+ const expectedResult = { id: BigInt(1), ...createArgs.data };
82
+
83
+ prisma.workflowNodeType.create.mockResolvedValue(expectedResult);
84
+
85
+ const result = await service.createOne(createArgs);
86
+
87
+ expect(prisma.workflowNodeType.create).toHaveBeenCalledWith(createArgs);
88
+ expect(prisma.workflowNodeType.create).toHaveBeenCalledTimes(1);
89
+ expect(result).toEqual(expectedResult);
90
+ });
91
+
92
+ it('should throw error when create fails', async () => {
93
+ const createArgs = {
94
+ data: {
95
+ type: 'test_type',
96
+ category: 'ENUM_VALUE',
97
+ label: 'test_label',
98
+ icon: 'test_icon',
99
+ description: 'test_description',
100
+ },
101
+ };
102
+ const error = new Error('Database connection failed');
103
+
104
+ prisma.workflowNodeType.create.mockRejectedValue(error);
105
+
106
+ await expect(service.createOne(createArgs)).rejects.toThrow(
107
+ 'Database connection failed',
108
+ );
109
+ });
110
+ });
111
+
112
+ describe('createMany', () => {
113
+ it('should create multiple workflowNodeType records with skipDuplicates', async () => {
114
+ const data = [
115
+ {
116
+ type: 'test_type',
117
+ category: 'ENUM_VALUE',
118
+ label: 'test_label',
119
+ icon: 'test_icon',
120
+ description: 'test_description',
121
+ },
122
+ {
123
+ type: 'test_type',
124
+ category: 'ENUM_VALUE',
125
+ label: 'test_label',
126
+ icon: 'test_icon',
127
+ description: 'test_description',
128
+ },
129
+ ];
130
+ const expectedResult = { count: 2 };
131
+
132
+ prisma.workflowNodeType.createMany.mockResolvedValue(expectedResult);
133
+
134
+ const result = await service.createMany(data);
135
+
136
+ expect(prisma.workflowNodeType.createMany).toHaveBeenCalledWith({
137
+ data,
138
+ skipDuplicates: true,
139
+ });
140
+ expect(result).toEqual(expectedResult);
141
+ });
142
+ });
143
+
144
+ describe('findMany', () => {
145
+ it('should return entities with itemCount', async () => {
146
+ const findArgs = {
147
+ where: {},
148
+ take: 10,
149
+ skip: 0,
150
+ };
151
+ const mockEntities = [{ id: BigInt(1) }, { id: BigInt(1) }];
152
+
153
+ prisma.workflowNodeType.count.mockResolvedValue(2);
154
+ prisma.workflowNodeType.findMany.mockResolvedValue(mockEntities);
155
+
156
+ const result = await service.findMany(findArgs);
157
+
158
+ expect(prisma.workflowNodeType.count).toHaveBeenCalledWith({
159
+ where: findArgs.where,
160
+ });
161
+ expect(prisma.workflowNodeType.findMany).toHaveBeenCalledWith(findArgs);
162
+ expect(result).toEqual({
163
+ itemCount: 2,
164
+ entities: mockEntities,
165
+ });
166
+ });
167
+
168
+ it('should return empty result when no records found', async () => {
169
+ const findArgs = { where: {} };
170
+
171
+ prisma.workflowNodeType.count.mockResolvedValue(0);
172
+ prisma.workflowNodeType.findMany.mockResolvedValue([]);
173
+
174
+ const result = await service.findMany(findArgs);
175
+
176
+ expect(result).toEqual({ itemCount: 0, entities: [] });
177
+ });
178
+ });
179
+
180
+ describe('findUnique', () => {
181
+ it('should find a single workflowNodeType record by id', async () => {
182
+ const id = BigInt(1);
183
+ const select = { id: true };
184
+ const expectedResult = { id: BigInt(1) };
185
+
186
+ prisma.workflowNodeType.findUnique.mockResolvedValue(expectedResult);
187
+
188
+ const result = await service.findUnique(id, select);
189
+
190
+ expect(prisma.workflowNodeType.findUnique).toHaveBeenCalledWith({
191
+ where: { id },
192
+ select,
193
+ });
194
+ expect(result).toEqual(expectedResult);
195
+ });
196
+
197
+ it('should return null when record not found', async () => {
198
+ prisma.workflowNodeType.findUnique.mockResolvedValue(null);
199
+
200
+ const result = await service.findUnique(BigInt(1), { id: true });
201
+
202
+ expect(result).toBeNull();
203
+ });
204
+ });
205
+
206
+ describe('updateUnique', () => {
207
+ it('should update a single workflowNodeType record', async () => {
208
+ const id = BigInt(1);
209
+ const data = {
210
+ type: 'test_type',
211
+ category: 'ENUM_VALUE',
212
+ label: 'test_label',
213
+ icon: 'test_icon',
214
+ description: 'test_description',
215
+ };
216
+ const expectedResult = { id: BigInt(1), ...data };
217
+
218
+ prisma.workflowNodeType.update.mockResolvedValue(expectedResult);
219
+
220
+ const result = await service.updateUnique(id, data);
221
+
222
+ expect(prisma.workflowNodeType.update).toHaveBeenCalledWith({
223
+ where: { id },
224
+ data,
225
+ });
226
+ expect(result).toEqual(expectedResult);
227
+ });
228
+ });
229
+
230
+ describe('updateMany', () => {
231
+ it('should update multiple workflowNodeType records', async () => {
232
+ const updateArgs = {
233
+ where: {},
234
+ data: {
235
+ type: 'test_type',
236
+ category: 'ENUM_VALUE',
237
+ label: 'test_label',
238
+ icon: 'test_icon',
239
+ description: 'test_description',
240
+ },
241
+ };
242
+ const expectedResult = { count: 5 };
243
+
244
+ prisma.workflowNodeType.updateMany.mockResolvedValue(expectedResult);
245
+
246
+ const result = await service.updateMany(updateArgs);
247
+
248
+ expect(prisma.workflowNodeType.updateMany).toHaveBeenCalledWith(
249
+ updateArgs,
250
+ );
251
+ expect(result).toEqual(expectedResult);
252
+ });
253
+ });
254
+
255
+ describe('deleteUnique', () => {
256
+ it('should delete a single workflowNodeType record and return count', async () => {
257
+ const id = BigInt(1);
258
+
259
+ prisma.workflowNodeType.delete.mockResolvedValue({ id: BigInt(1) });
260
+
261
+ const result = await service.deleteUnique(id);
262
+
263
+ expect(prisma.workflowNodeType.delete).toHaveBeenCalledWith({
264
+ where: { id },
265
+ });
266
+ expect(result).toEqual({ count: 1 });
267
+ });
268
+ });
269
+
270
+ describe('deleteMany', () => {
271
+ it('should delete multiple workflowNodeType records', async () => {
272
+ const deleteArgs = { where: {} };
273
+ const expectedResult = { count: 3 };
274
+
275
+ prisma.workflowNodeType.deleteMany.mockResolvedValue(expectedResult);
276
+
277
+ const result = await service.deleteMany(deleteArgs);
278
+
279
+ expect(prisma.workflowNodeType.deleteMany).toHaveBeenCalledWith(
280
+ deleteArgs,
281
+ );
282
+ expect(result).toEqual(expectedResult);
283
+ });
284
+ });
285
+
286
+ describe('count', () => {
287
+ it('should count workflowNodeType records with filter', async () => {
288
+ const countArgs = { where: {} };
289
+
290
+ prisma.workflowNodeType.count.mockResolvedValue(10);
291
+
292
+ const result = await service.count(countArgs);
293
+
294
+ expect(prisma.workflowNodeType.count).toHaveBeenCalledWith(countArgs);
295
+ expect(result).toBe(10);
296
+ });
297
+
298
+ it('should count all records when no filter provided', async () => {
299
+ prisma.workflowNodeType.count.mockResolvedValue(100);
300
+
301
+ const result = await service.count();
302
+
303
+ expect(prisma.workflowNodeType.count).toHaveBeenCalledWith(undefined);
304
+ expect(result).toBe(100);
305
+ });
306
+ });
307
+
308
+ describe('groupBy', () => {
309
+ it('should group workflowNodeType records by specified field', async () => {
310
+ const groupByArgs = {
311
+ by: ['id'],
312
+ _count: { id: true },
313
+ };
314
+ const expectedResult = [{ id: BigInt(1), _count: { id: 50 } }];
315
+
316
+ prisma.workflowNodeType.groupBy.mockResolvedValue(expectedResult);
317
+
318
+ const result = await service.groupBy(groupByArgs as any);
319
+
320
+ expect(prisma.workflowNodeType.groupBy).toHaveBeenCalledWith(groupByArgs);
321
+ expect(result).toEqual(expectedResult);
322
+ });
323
+ });
324
+
325
+ describe('aggregate', () => {
326
+ it('should aggregate workflowNodeType records', async () => {
327
+ const aggregateArgs = {
328
+ _count: true,
329
+ _max: { id: true },
330
+ _min: { id: true },
331
+ } as const;
332
+ const expectedResult = {
333
+ _count: 100,
334
+ _max: { id: BigInt(1) },
335
+ _min: { id: BigInt(1) },
336
+ };
337
+
338
+ prisma.workflowNodeType.aggregate.mockResolvedValue(expectedResult);
339
+
340
+ const result = await service.aggregate(aggregateArgs);
341
+
342
+ expect(prisma.workflowNodeType.aggregate).toHaveBeenCalledWith(
343
+ aggregateArgs,
344
+ );
345
+ expect(result).toEqual(expectedResult);
346
+ });
347
+ });
348
+ });
@@ -0,0 +1,106 @@
1
+ import { Inject, Injectable } from '@nestjs/common';
2
+ import { Prisma, WorkflowNodeType } 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 WorkflowNodeTypeService {
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
+ workflowNodeTypeCreateArgs: Prisma.WorkflowNodeTypeCreateArgs,
19
+ ) {
20
+ return await this.prisma.workflowNodeType.create(
21
+ workflowNodeTypeCreateArgs,
22
+ );
23
+ }
24
+
25
+ async createMany(data: Prisma.WorkflowNodeTypeCreateManyArgs['data']) {
26
+ return await this.prisma.workflowNodeType.createMany({
27
+ data,
28
+ skipDuplicates: true,
29
+ });
30
+ }
31
+
32
+ async findMany(
33
+ workflowNodeTypeFindManyArgs: Prisma.WorkflowNodeTypeFindManyArgs,
34
+ ): Promise<{ itemCount: number; entities: WorkflowNodeType[] }> {
35
+ const itemCount = await this.prisma.workflowNodeType.count({
36
+ where: workflowNodeTypeFindManyArgs.where,
37
+ });
38
+ const entities = await this.prisma.workflowNodeType.findMany(
39
+ workflowNodeTypeFindManyArgs,
40
+ );
41
+ return { itemCount, entities };
42
+ }
43
+
44
+ async findUnique(
45
+ id: number,
46
+ select: Prisma.WorkflowNodeTypeFindUniqueArgs['select'],
47
+ ) {
48
+ return await this.prisma.workflowNodeType.findUnique({
49
+ where: { id: id },
50
+ select,
51
+ });
52
+ }
53
+
54
+ async updateMany(
55
+ workflowNodeTypeUpdateManyArgs: Prisma.WorkflowNodeTypeUpdateManyArgs,
56
+ ) {
57
+ return await this.prisma.workflowNodeType.updateMany(
58
+ workflowNodeTypeUpdateManyArgs,
59
+ );
60
+ }
61
+
62
+ async updateUnique(
63
+ id: number,
64
+ data: Prisma.WorkflowNodeTypeUpdateManyArgs['data'],
65
+ ) {
66
+ return await this.prisma.workflowNodeType.update({
67
+ where: { id: id },
68
+ data,
69
+ });
70
+ }
71
+
72
+ async deleteMany(
73
+ workflowNodeTypeDeleteManyArgs: Prisma.WorkflowNodeTypeDeleteManyArgs,
74
+ ) {
75
+ return await this.prisma.workflowNodeType.deleteMany(
76
+ workflowNodeTypeDeleteManyArgs,
77
+ );
78
+ }
79
+
80
+ async deleteUnique(id: number) {
81
+ await this.prisma.workflowNodeType.delete({
82
+ where: { id: id },
83
+ });
84
+ return { count: 1 };
85
+ }
86
+
87
+ async count(workflowNodeTypeCountArgs?: Prisma.WorkflowNodeTypeCountArgs) {
88
+ return await this.prisma.workflowNodeType.count(workflowNodeTypeCountArgs);
89
+ }
90
+
91
+ async groupBy(
92
+ workflowNodeTypeGroupByArgs: Prisma.WorkflowNodeTypeGroupByArgs,
93
+ ) {
94
+ return await this.prisma.workflowNodeType.groupBy(
95
+ workflowNodeTypeGroupByArgs as any,
96
+ );
97
+ }
98
+
99
+ async aggregate(
100
+ workflowNodeTypeAggregateArgs: Prisma.WorkflowNodeTypeAggregateArgs,
101
+ ) {
102
+ return await this.prisma.workflowNodeType.aggregate(
103
+ workflowNodeTypeAggregateArgs,
104
+ );
105
+ }
106
+ }