@gadmin2n/schematics 0.0.70 → 0.0.72

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 (28) hide show
  1. package/dist/lib/application/files/gadmin2-game-angle-demo/config/prisma/system.prisma +21 -0
  2. package/dist/lib/application/files/gadmin2-game-angle-demo/server/gadmin-cli.json +9 -1
  3. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package-lock.json +15579 -0
  4. package/dist/lib/application/files/gadmin2-game-angle-demo/server/package.json +5 -3
  5. package/dist/lib/application/files/gadmin2-game-angle-demo/server/seed/permissions.ts +16 -4
  6. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/app.module.ts +2 -0
  7. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.controller.ts +106 -0
  8. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.module.ts +10 -0
  9. package/dist/lib/application/files/gadmin2-game-angle-demo/server/src/modules/agenda/agenda.service.ts +569 -0
  10. package/dist/lib/application/files/gadmin2-game-angle-demo/server/yarn.lock +1159 -481
  11. package/dist/lib/application/files/gadmin2-game-angle-demo/web/.env +1 -0
  12. package/dist/lib/application/files/gadmin2-game-angle-demo/web/package.json +1 -1
  13. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/agentPanel/inspectorActions.ts +130 -3
  14. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumCard/index.tsx +5 -5
  15. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/components/canvas/NumLineCard/index.tsx +2 -2
  16. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/config/routeRegistry.tsx +15 -0
  17. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/DevShell.tsx +55 -43
  18. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/dev-shell/SkillMenu.tsx +1 -1
  19. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/en/common.json +2 -4
  20. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/locales/zh_CN/common.json +2 -4
  21. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/index.tsx +536 -0
  22. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/agenda/show.tsx +671 -0
  23. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasPage.tsx +9 -60
  24. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/CanvasToolbar.tsx +2 -2
  25. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/ComponentThumbnail.tsx +3 -1
  26. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/routes/canvas/canvasContextMenuRegistry.tsx +11 -11
  27. package/dist/lib/application/files/gadmin2-game-angle-demo/web/src/vite-env.d.ts +12 -0
  28. package/package.json +1 -1
@@ -34,8 +34,9 @@
34
34
  "prisma:studio": "dotenv -e .env.local -e .env -- prisma studio"
35
35
  },
36
36
  "dependencies": {
37
+ "@agendajs/postgres-backend": "^3.0.5",
37
38
  "@azure/identity": "^4.13.0",
38
- "@gadmin2n/nest-common": "^0.0.41",
39
+ "@gadmin2n/nest-common": "^0.0.42",
39
40
  "@nestjs/cache-manager": "^3.0.1",
40
41
  "@nestjs/common": "^10.4.15",
41
42
  "@nestjs/config": "^3.2.0",
@@ -56,6 +57,7 @@
56
57
  "@opentelemetry/semantic-conventions": "^1.39.0",
57
58
  "@prisma/client": "^6.19.0",
58
59
  "@prisma/instrumentation": "6.19.0",
60
+ "agenda": "^6.2.5",
59
61
  "axios": "^1.13.2",
60
62
  "cache-manager": "^6.4.3",
61
63
  "class-transformer": "^0.5.1",
@@ -85,8 +87,8 @@
85
87
  },
86
88
  "devDependencies": {
87
89
  "@faker-js/faker": "^10.4.0",
88
- "@gadmin2n/prisma-nest-generator": "^0.0.35",
89
- "@gadmin2n/prisma-react-generator": "^0.0.51",
90
+ "@gadmin2n/prisma-nest-generator": "^0.0.36",
91
+ "@gadmin2n/prisma-react-generator": "^0.0.52",
90
92
  "@nestjs/testing": "^10.4.15",
91
93
  "@types/cookie-parser": "^1.4.3",
92
94
  "@types/express": "^4.17.21",
@@ -74,6 +74,11 @@ export async function seedPermissions(prisma: PrismaClient) {
74
74
  pageCode: 'game',
75
75
  },
76
76
  { code: 'canvas', description: 'Canvas management', pageCode: 'canvas' },
77
+ {
78
+ code: 'agenda',
79
+ description: 'Agenda job management',
80
+ pageCode: 'agenda',
81
+ },
77
82
  ];
78
83
 
79
84
  const resources: { id: number; code: string }[] = [];
@@ -117,7 +122,7 @@ export async function seedPermissions(prisma: PrismaClient) {
117
122
  name: 'permission',
118
123
  zhName: '权限管理',
119
124
  enName: 'Permission Mgnt',
120
- sortOrder: 1010,
125
+ sortOrder: 1030,
121
126
  parentId: adminPage.id,
122
127
  });
123
128
  pages.push({ id: permissionPage.id, code: permissionPage.code });
@@ -175,21 +180,28 @@ export async function seedPermissions(prisma: PrismaClient) {
175
180
  name: 'canvas',
176
181
  zhName: 'Canvas',
177
182
  enName: 'Canvas',
178
- sortOrder: 1005,
183
+ sortOrder: 1010,
184
+ },
185
+ {
186
+ code: 'agenda',
187
+ name: 'agenda',
188
+ zhName: 'Cron Jobs',
189
+ enName: 'Cron Jobs',
190
+ sortOrder: 1020,
179
191
  },
180
192
  {
181
193
  code: 'game',
182
194
  name: 'game',
183
195
  zhName: '业务管理',
184
196
  enName: 'Business Mgnt',
185
- sortOrder: 1050,
197
+ sortOrder: 1040,
186
198
  },
187
199
  {
188
200
  code: 'audits',
189
201
  name: 'audits',
190
202
  zhName: '审计日志',
191
203
  enName: 'Audit Log',
192
- sortOrder: 1060,
204
+ sortOrder: 1050,
193
205
  },
194
206
  ];
195
207
 
@@ -18,6 +18,7 @@ import { ScheduleModule } from '@nestjs/schedule';
18
18
  import { ServeStaticModule } from '@nestjs/serve-static';
19
19
  import { join } from 'path';
20
20
  import { LogFormat } from './lib/logger';
21
+ import { AgendaModule } from './modules/agenda/agenda.module';
21
22
  import { RoleModule } from './modules/role/role.module';
22
23
  import { RoleService } from './modules/role/role.service';
23
24
  import { RolesRefresherService } from './modules/role/roles-refresher.service';
@@ -83,6 +84,7 @@ import { RolesRefresherService } from './modules/role/roles-refresher.service';
83
84
  }),
84
85
 
85
86
  ...modules,
87
+ AgendaModule,
86
88
  ],
87
89
 
88
90
  controllers: [AppController],
@@ -0,0 +1,106 @@
1
+ import { ACGuard } from '@gadmin2n/nest-common';
2
+ import {
3
+ Body,
4
+ Controller,
5
+ Get,
6
+ NotFoundException,
7
+ Param,
8
+ Post,
9
+ Query,
10
+ UseGuards,
11
+ } from '@nestjs/common';
12
+ import { ApiOkResponse, ApiTags } from '@nestjs/swagger';
13
+ import { AgendaService } from './agenda.service';
14
+
15
+ class JobIdsDto {
16
+ jobIds: string[];
17
+ }
18
+
19
+ class JobsQueryDto {
20
+ job?: string;
21
+ state?: string;
22
+ toggle?: string;
23
+ module?: string;
24
+ q?: string;
25
+ skip?: number;
26
+ limit?: number;
27
+ }
28
+
29
+ class JobLogsQueryDto {
30
+ jobName: string;
31
+ status?: string;
32
+ before?: string;
33
+ skip?: number;
34
+ limit?: number;
35
+ }
36
+
37
+ @UseGuards(ACGuard)
38
+ @Controller('agenda')
39
+ @ApiTags('agenda')
40
+ export class AgendaController {
41
+ constructor(private readonly agendaService: AgendaService) {}
42
+
43
+ @Get('jobs')
44
+ @ApiOkResponse({ description: 'List jobs with overview stats' })
45
+ async getJobs(@Query() query: JobsQueryDto) {
46
+ return this.agendaService.getJobs({
47
+ job: query.job,
48
+ state: query.state,
49
+ toggle: query.toggle,
50
+ module: query.module,
51
+ q: query.q,
52
+ skip: query.skip ? Number(query.skip) : 0,
53
+ limit: query.limit ? Number(query.limit) : 20,
54
+ });
55
+ }
56
+
57
+ @Post('requeue')
58
+ @ApiOkResponse({ description: 'Requeue jobs by IDs' })
59
+ async requeue(@Body() body: JobIdsDto) {
60
+ return this.agendaService.requeueByIds(body.jobIds);
61
+ }
62
+
63
+ @Post('retry')
64
+ @ApiOkResponse({ description: 'Retry failed jobs by IDs' })
65
+ async retry(@Body() body: JobIdsDto) {
66
+ return this.agendaService.retryByIds(body.jobIds);
67
+ }
68
+
69
+ @Post('delete')
70
+ @ApiOkResponse({ description: 'Delete jobs by IDs' })
71
+ async delete(@Body() body: JobIdsDto) {
72
+ return this.agendaService.deleteByIds(body.jobIds);
73
+ }
74
+
75
+ @Post('disable')
76
+ @ApiOkResponse({ description: 'Disable (pause) jobs by IDs' })
77
+ async disable(@Body() body: JobIdsDto) {
78
+ return this.agendaService.disableByIds(body.jobIds);
79
+ }
80
+
81
+ @Post('enable')
82
+ @ApiOkResponse({ description: 'Enable (resume) jobs by IDs' })
83
+ async enable(@Body() body: JobIdsDto) {
84
+ return this.agendaService.enableByIds(body.jobIds);
85
+ }
86
+
87
+ @Get('job/:jobName')
88
+ @ApiOkResponse({ description: 'Get single job detail with run statistics' })
89
+ async getJobDetail(@Param('jobName') jobName: string) {
90
+ const detail = await this.agendaService.getJobDetail(jobName);
91
+ if (!detail) throw new NotFoundException(`Job "${jobName}" not found`);
92
+ return detail;
93
+ }
94
+
95
+ @Get('logs')
96
+ @ApiOkResponse({ description: 'Get execution history logs for a job' })
97
+ async getLogs(@Query() query: JobLogsQueryDto) {
98
+ return this.agendaService.getJobLogs({
99
+ jobName: query.jobName,
100
+ status: query.status,
101
+ before: query.before,
102
+ skip: query.skip ? Number(query.skip) : 0,
103
+ limit: query.limit ? Number(query.limit) : 20,
104
+ });
105
+ }
106
+ }
@@ -0,0 +1,10 @@
1
+ import { Module } from '@nestjs/common';
2
+ import { AgendaController } from './agenda.controller';
3
+ import { AgendaService } from './agenda.service';
4
+
5
+ @Module({
6
+ controllers: [AgendaController],
7
+ providers: [AgendaService],
8
+ exports: [AgendaService],
9
+ })
10
+ export class AgendaModule {}