@nest-omni/core 4.1.3-11 → 4.1.3-12

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 (175) hide show
  1. package/audit/audit.module.js +17 -0
  2. package/audit/controllers/audit.controller.d.ts +64 -0
  3. package/audit/controllers/audit.controller.js +50 -0
  4. package/audit/decorators/audit-action.decorator.d.ts +74 -0
  5. package/audit/decorators/audit-action.decorator.js +42 -0
  6. package/audit/decorators/entity-audit.decorator.d.ts +10 -1
  7. package/audit/decorators/entity-audit.decorator.js +34 -16
  8. package/audit/decorators/index.d.ts +1 -0
  9. package/audit/decorators/index.js +1 -0
  10. package/audit/entities/audit-action-summary.entity.d.ts +23 -0
  11. package/audit/entities/audit-action-summary.entity.js +101 -0
  12. package/audit/entities/entity-audit-log.entity.d.ts +3 -0
  13. package/audit/entities/entity-audit-log.entity.js +25 -2
  14. package/audit/entities/entity-transaction.entity.d.ts +3 -4
  15. package/audit/entities/entity-transaction.entity.js +10 -3
  16. package/audit/entities/index.d.ts +1 -0
  17. package/audit/entities/index.js +1 -0
  18. package/audit/entities/manual-operation-log.entity.js +8 -1
  19. package/audit/enums/audit.enums.d.ts +1 -10
  20. package/audit/enums/audit.enums.js +7 -17
  21. package/audit/index.d.ts +2 -1
  22. package/audit/index.js +5 -1
  23. package/audit/interceptors/audit-action.interceptor.d.ts +38 -0
  24. package/audit/interceptors/audit-action.interceptor.js +215 -0
  25. package/audit/interceptors/index.d.ts +1 -0
  26. package/audit/interceptors/index.js +1 -0
  27. package/audit/interfaces/audit.interfaces.d.ts +10 -5
  28. package/audit/services/audit-action.service.d.ts +141 -0
  29. package/audit/services/audit-action.service.js +244 -0
  30. package/audit/services/audit-context.service.d.ts +82 -0
  31. package/audit/services/audit-context.service.js +170 -0
  32. package/audit/services/entity-audit.service.d.ts +104 -3
  33. package/audit/services/entity-audit.service.js +306 -9
  34. package/audit/services/index.d.ts +1 -0
  35. package/audit/services/index.js +1 -0
  36. package/audit/services/manual-audit-log.service.d.ts +24 -23
  37. package/audit/services/manual-audit-log.service.js +32 -53
  38. package/audit/services/operation-description.service.d.ts +13 -3
  39. package/audit/services/operation-description.service.js +161 -24
  40. package/audit/services/transaction-audit.service.js +3 -3
  41. package/audit/subscribers/entity-audit.subscriber.d.ts +4 -0
  42. package/audit/subscribers/entity-audit.subscriber.js +47 -0
  43. package/file-upload/controllers/file-access.controller.d.ts +23 -0
  44. package/file-upload/controllers/file-access.controller.js +128 -0
  45. package/file-upload/decorators/csv-data.decorator.d.ts +44 -0
  46. package/file-upload/decorators/csv-data.decorator.js +131 -0
  47. package/file-upload/decorators/excel-data.decorator.d.ts +44 -0
  48. package/file-upload/decorators/excel-data.decorator.js +125 -0
  49. package/file-upload/decorators/file-upload.decorator.d.ts +83 -0
  50. package/file-upload/decorators/file-upload.decorator.js +172 -0
  51. package/file-upload/decorators/index.d.ts +4 -0
  52. package/file-upload/decorators/index.js +20 -0
  53. package/file-upload/decorators/process.decorator.d.ts +40 -0
  54. package/file-upload/decorators/process.decorator.js +52 -0
  55. package/file-upload/dto/create-file.dto.d.ts +24 -0
  56. package/file-upload/dto/create-file.dto.js +112 -0
  57. package/file-upload/dto/find-files.dto.d.ts +15 -0
  58. package/file-upload/dto/find-files.dto.js +76 -0
  59. package/file-upload/dto/index.d.ts +4 -0
  60. package/file-upload/dto/index.js +20 -0
  61. package/file-upload/dto/pagination.dto.d.ts +7 -0
  62. package/file-upload/dto/pagination.dto.js +39 -0
  63. package/file-upload/dto/update-file.dto.d.ts +16 -0
  64. package/file-upload/dto/update-file.dto.js +71 -0
  65. package/file-upload/entities/file-metadata.entity.d.ts +22 -0
  66. package/file-upload/entities/file-metadata.entity.js +84 -0
  67. package/file-upload/entities/file.entity.d.ts +129 -0
  68. package/file-upload/entities/file.entity.js +384 -0
  69. package/file-upload/entities/index.d.ts +2 -0
  70. package/file-upload/entities/index.js +18 -0
  71. package/file-upload/enums/file-type.enum.d.ts +72 -0
  72. package/file-upload/enums/file-type.enum.js +212 -0
  73. package/file-upload/exceptions/file-upload.exception.d.ts +57 -0
  74. package/file-upload/exceptions/file-upload.exception.js +120 -0
  75. package/file-upload/exceptions/index.d.ts +1 -0
  76. package/file-upload/exceptions/index.js +17 -0
  77. package/file-upload/file-upload.module.d.ts +89 -0
  78. package/file-upload/file-upload.module.js +264 -0
  79. package/file-upload/index.d.ts +26 -0
  80. package/file-upload/index.js +59 -0
  81. package/file-upload/interceptors/file-upload.interceptor.d.ts +48 -0
  82. package/file-upload/interceptors/file-upload.interceptor.js +434 -0
  83. package/file-upload/interceptors/index.d.ts +1 -0
  84. package/file-upload/interceptors/index.js +17 -0
  85. package/file-upload/interfaces/custom-file-type.interface.d.ts +72 -0
  86. package/file-upload/interfaces/custom-file-type.interface.js +2 -0
  87. package/file-upload/interfaces/file-buffer.interface.d.ts +72 -0
  88. package/file-upload/interfaces/file-buffer.interface.js +2 -0
  89. package/file-upload/interfaces/file-entity.interface.d.ts +142 -0
  90. package/file-upload/interfaces/file-entity.interface.js +28 -0
  91. package/file-upload/interfaces/file-metadata.interface.d.ts +21 -0
  92. package/file-upload/interfaces/file-metadata.interface.js +2 -0
  93. package/file-upload/interfaces/file-upload-options.interface.d.ts +117 -0
  94. package/file-upload/interfaces/file-upload-options.interface.js +2 -0
  95. package/file-upload/interfaces/index.d.ts +7 -0
  96. package/file-upload/interfaces/index.js +24 -0
  97. package/file-upload/interfaces/storage-provider.interface.d.ts +239 -0
  98. package/file-upload/interfaces/storage-provider.interface.js +2 -0
  99. package/file-upload/interfaces/upload-options.interface.d.ts +19 -0
  100. package/file-upload/interfaces/upload-options.interface.js +2 -0
  101. package/file-upload/providers/index.d.ts +2 -0
  102. package/file-upload/providers/index.js +18 -0
  103. package/file-upload/providers/local-storage.provider.d.ts +98 -0
  104. package/file-upload/providers/local-storage.provider.js +484 -0
  105. package/file-upload/providers/s3-storage.provider.d.ts +87 -0
  106. package/file-upload/providers/s3-storage.provider.js +455 -0
  107. package/file-upload/services/file-signature-validator.service.d.ts +118 -0
  108. package/file-upload/services/file-signature-validator.service.js +376 -0
  109. package/file-upload/services/file.service.d.ts +190 -0
  110. package/file-upload/services/file.service.js +609 -0
  111. package/file-upload/services/index.d.ts +4 -0
  112. package/file-upload/services/index.js +20 -0
  113. package/file-upload/services/malicious-file-detector.service.d.ts +274 -0
  114. package/file-upload/services/malicious-file-detector.service.js +1035 -0
  115. package/file-upload/services/mime-registry.service.d.ts +47 -0
  116. package/file-upload/services/mime-registry.service.js +167 -0
  117. package/file-upload/utils/checksum.util.d.ts +28 -0
  118. package/file-upload/utils/checksum.util.js +65 -0
  119. package/file-upload/utils/dynamic-import.util.d.ts +50 -0
  120. package/file-upload/utils/dynamic-import.util.js +144 -0
  121. package/file-upload/utils/filename.util.d.ts +59 -0
  122. package/file-upload/utils/filename.util.js +184 -0
  123. package/file-upload/utils/filepath.util.d.ts +70 -0
  124. package/file-upload/utils/filepath.util.js +152 -0
  125. package/file-upload/utils/index.d.ts +4 -0
  126. package/file-upload/utils/index.js +20 -0
  127. package/index.d.ts +3 -1
  128. package/index.js +4 -1
  129. package/package.json +4 -5
  130. package/setup/bootstrap.setup.d.ts +1 -0
  131. package/setup/bootstrap.setup.js +1 -0
  132. package/shared/index.d.ts +1 -1
  133. package/shared/index.js +1 -1
  134. package/shared/{serviceRegistryModule.js → service-registry.module.js} +0 -12
  135. package/shared/services/index.d.ts +0 -1
  136. package/shared/services/index.js +0 -1
  137. package/transaction/__tests__/mocks.d.ts +9 -0
  138. package/transaction/__tests__/mocks.js +33 -0
  139. package/transaction/base-service-transaction.d.ts +99 -0
  140. package/transaction/base-service-transaction.js +286 -0
  141. package/transaction/cls-compatibility.service.d.ts +55 -0
  142. package/transaction/cls-compatibility.service.js +127 -0
  143. package/transaction/data-source-registry.d.ts +91 -0
  144. package/transaction/data-source-registry.js +349 -0
  145. package/transaction/database-adapter.d.ts +44 -0
  146. package/transaction/database-adapter.js +240 -0
  147. package/transaction/decorators/entity-datasource.decorator.d.ts +62 -0
  148. package/transaction/decorators/entity-datasource.decorator.js +105 -0
  149. package/transaction/index.d.ts +14 -0
  150. package/transaction/index.js +57 -0
  151. package/transaction/logging-transactional.interceptor.d.ts +18 -0
  152. package/transaction/logging-transactional.interceptor.js +163 -0
  153. package/transaction/transaction-context.service.d.ts +137 -0
  154. package/transaction/transaction-context.service.js +411 -0
  155. package/transaction/transaction-manager.d.ts +230 -0
  156. package/transaction/transaction-manager.js +1001 -0
  157. package/transaction/transaction-synchronization.d.ts +171 -0
  158. package/transaction/transaction-synchronization.js +380 -0
  159. package/transaction/transaction.errors.d.ts +91 -0
  160. package/transaction/transaction.errors.js +206 -0
  161. package/transaction/transaction.module.d.ts +30 -0
  162. package/transaction/transaction.module.js +98 -0
  163. package/transaction/transactional.decorator.d.ts +82 -0
  164. package/transaction/transactional.decorator.js +319 -0
  165. package/transaction/typeorm-module-wrapper.d.ts +96 -0
  166. package/transaction/typeorm-module-wrapper.js +197 -0
  167. package/validators/file-mimetype.validator.d.ts +0 -2
  168. package/validators/file-mimetype.validator.js +4 -6
  169. package/validators/is-exists.validator.d.ts +2 -5
  170. package/validators/is-exists.validator.js +4 -6
  171. package/validators/is-unique.validator.d.ts +2 -5
  172. package/validators/is-unique.validator.js +6 -11
  173. package/shared/services/validator.service.d.ts +0 -3
  174. package/shared/services/validator.service.js +0 -20
  175. /package/shared/{serviceRegistryModule.d.ts → service-registry.module.d.ts} +0 -0
@@ -81,6 +81,13 @@ let AuditModule = AuditModule_1 = class AuditModule {
81
81
  },
82
82
  inject: [(0, typeorm_1.getDataSourceToken)(auditConnectionName)],
83
83
  },
84
+ {
85
+ provide: (0, typeorm_1.getRepositoryToken)(entities_1.AuditActionSummaryEntity),
86
+ useFactory: (dataSource) => {
87
+ return dataSource.getRepository(entities_1.AuditActionSummaryEntity);
88
+ },
89
+ inject: [(0, typeorm_1.getDataSourceToken)(auditConnectionName)],
90
+ },
84
91
  {
85
92
  provide: 'AUDIT_ENTITY_MANAGER',
86
93
  useFactory: (dataSource) => {
@@ -98,6 +105,7 @@ let AuditModule = AuditModule_1 = class AuditModule {
98
105
  entities_1.EntityTransactionEntity,
99
106
  entities_1.OperationTemplateEntity,
100
107
  entities_1.ManualOperationLogEntity,
108
+ entities_1.AuditActionSummaryEntity,
101
109
  ], auditConnectionName),
102
110
  nestjs_cls_1.ClsModule.forRoot({
103
111
  global: true,
@@ -125,7 +133,9 @@ let AuditModule = AuditModule_1 = class AuditModule {
125
133
  services_1.EntityAuditService,
126
134
  services_1.TransactionAuditService,
127
135
  services_1.OperationDescriptionService,
136
+ services_1.AuditActionService,
128
137
  interceptors_1.AuditInterceptor,
138
+ interceptors_1.AuditActionInterceptor,
129
139
  ...subscriberProviders,
130
140
  ],
131
141
  exports: [
@@ -135,7 +145,10 @@ let AuditModule = AuditModule_1 = class AuditModule {
135
145
  services_1.EntityAuditService,
136
146
  services_1.TransactionAuditService,
137
147
  services_1.OperationDescriptionService,
148
+ services_1.AuditActionService,
138
149
  interceptors_1.AuditInterceptor,
150
+ interceptors_1.AuditActionInterceptor,
151
+ (0, typeorm_1.getRepositoryToken)(entities_1.AuditActionSummaryEntity),
139
152
  ],
140
153
  };
141
154
  }
@@ -248,7 +261,9 @@ let AuditModule = AuditModule_1 = class AuditModule {
248
261
  services_1.EntityAuditService,
249
262
  services_1.TransactionAuditService,
250
263
  services_1.OperationDescriptionService,
264
+ services_1.AuditActionService,
251
265
  interceptors_1.AuditInterceptor,
266
+ interceptors_1.AuditActionInterceptor,
252
267
  ],
253
268
  exports: [
254
269
  services_1.AuditContextService,
@@ -257,7 +272,9 @@ let AuditModule = AuditModule_1 = class AuditModule {
257
272
  services_1.EntityAuditService,
258
273
  services_1.TransactionAuditService,
259
274
  services_1.OperationDescriptionService,
275
+ services_1.AuditActionService,
260
276
  interceptors_1.AuditInterceptor,
277
+ interceptors_1.AuditActionInterceptor,
261
278
  ],
262
279
  };
263
280
  }
@@ -41,4 +41,68 @@ export declare class AuditController {
41
41
  * 回滚审计事务
42
42
  */
43
43
  rollbackTransaction(transactionId: string): Promise<void>;
44
+ /**
45
+ * 查询审计动作汇总记录
46
+ */
47
+ getAuditActions(userId?: string, username?: string, actionName?: string, success?: string, startTime?: string, endTime?: string, page?: number, limit?: number): Promise<PageDto<import("../entities").AuditActionSummaryEntity>>;
48
+ /**
49
+ * 查询单个审计动作的详细信息
50
+ */
51
+ getAuditActionDetail(actionId: string): Promise<{
52
+ summary: {
53
+ id: string;
54
+ actionName: string;
55
+ operationTemplateKey: string;
56
+ description: string;
57
+ descriptionParams: Record<string, any>;
58
+ success: boolean;
59
+ errorMessage: string;
60
+ duration: number;
61
+ userId: string;
62
+ username: string;
63
+ requestId: string;
64
+ requestIp: string;
65
+ userAgent: string;
66
+ entityChangesCount: number;
67
+ entityTypes: string[];
68
+ operationStats: Record<string, number>;
69
+ createdAt: Date;
70
+ metadata: Record<string, any>;
71
+ };
72
+ entityChanges: EntityAuditLogEntity[];
73
+ detailedChanges: {
74
+ id: string;
75
+ entityType: string;
76
+ entityId: string;
77
+ operation: import("..").AuditOperation;
78
+ operationLabel: string;
79
+ description: string;
80
+ sequenceInAction: number;
81
+ createdAt: Date;
82
+ oldValue: Record<string, any>;
83
+ newValue: Record<string, any>;
84
+ fieldChanges: {
85
+ field: string;
86
+ fieldLabel: string;
87
+ oldValue: any;
88
+ newValue: any;
89
+ changeType: "added" | "removed" | "modified" | "unchanged";
90
+ displayOldValue?: string;
91
+ displayNewValue?: string;
92
+ }[];
93
+ changedFieldsCount: number;
94
+ changedFields: string[];
95
+ }[];
96
+ statistics: {
97
+ totalChanges: number;
98
+ totalFieldChanges: number;
99
+ byEntityType: Record<string, number>;
100
+ byOperation: Record<string, number>;
101
+ operationSequence: {
102
+ sequence: number;
103
+ entityType: string;
104
+ operation: import("..").AuditOperation;
105
+ }[];
106
+ };
107
+ }>;
44
108
  }
@@ -93,6 +93,31 @@ let AuditController = class AuditController {
93
93
  return this.transactionAuditService.rollbackTransaction(transactionId);
94
94
  });
95
95
  }
96
+ /**
97
+ * 查询审计动作汇总记录
98
+ */
99
+ getAuditActions(userId_1, username_1, actionName_1, success_1, startTime_1, endTime_1) {
100
+ return __awaiter(this, arguments, void 0, function* (userId, username, actionName, success, startTime, endTime, page = 1, limit = 20) {
101
+ return this.entityAuditService.getAuditActions({
102
+ userId,
103
+ username,
104
+ actionName,
105
+ success: success ? success === 'true' : undefined,
106
+ startTime: startTime ? new Date(startTime) : undefined,
107
+ endTime: endTime ? new Date(endTime) : undefined,
108
+ page,
109
+ limit,
110
+ });
111
+ });
112
+ }
113
+ /**
114
+ * 查询单个审计动作的详细信息
115
+ */
116
+ getAuditActionDetail(actionId) {
117
+ return __awaiter(this, void 0, void 0, function* () {
118
+ return this.entityAuditService.getAuditActionDetail(actionId);
119
+ });
120
+ }
96
121
  };
97
122
  exports.AuditController = AuditController;
98
123
  __decorate([
@@ -158,6 +183,31 @@ __decorate([
158
183
  __metadata("design:paramtypes", [String]),
159
184
  __metadata("design:returntype", Promise)
160
185
  ], AuditController.prototype, "rollbackTransaction", null);
186
+ __decorate([
187
+ (0, common_1.Get)('actions'),
188
+ (0, swagger_1.ApiOperation)({ summary: '查询审计动作汇总记录' }),
189
+ (0, swagger_1.ApiResponse)({ status: 200, description: '返回审计动作汇总列表' }),
190
+ __param(0, (0, common_1.Query)('userId')),
191
+ __param(1, (0, common_1.Query)('username')),
192
+ __param(2, (0, common_1.Query)('actionName')),
193
+ __param(3, (0, common_1.Query)('success')),
194
+ __param(4, (0, common_1.Query)('startTime')),
195
+ __param(5, (0, common_1.Query)('endTime')),
196
+ __param(6, (0, common_1.Query)('page')),
197
+ __param(7, (0, common_1.Query)('limit')),
198
+ __metadata("design:type", Function),
199
+ __metadata("design:paramtypes", [String, String, String, String, String, String, Number, Number]),
200
+ __metadata("design:returntype", Promise)
201
+ ], AuditController.prototype, "getAuditActions", null);
202
+ __decorate([
203
+ (0, common_1.Get)('actions/:actionId'),
204
+ (0, swagger_1.ApiOperation)({ summary: '查询审计动作详细信息' }),
205
+ (0, swagger_1.ApiResponse)({ status: 200, description: '返回审计动作详细信息' }),
206
+ __param(0, (0, common_1.Param)('actionId')),
207
+ __metadata("design:type", Function),
208
+ __metadata("design:paramtypes", [String]),
209
+ __metadata("design:returntype", Promise)
210
+ ], AuditController.prototype, "getAuditActionDetail", null);
161
211
  exports.AuditController = AuditController = __decorate([
162
212
  (0, common_1.Controller)('audit'),
163
213
  (0, swagger_1.ApiTags)('audit'),
@@ -0,0 +1,74 @@
1
+ import { AuditParamsContext } from '../services/audit-context.service';
2
+ export declare const AUDIT_ACTION_METADATA = "AUDIT_ACTION_METADATA";
3
+ /**
4
+ * 审计动作选项
5
+ */
6
+ export interface AuditActionOptions {
7
+ /**
8
+ * 操作模板键(可选)
9
+ * @example 'order.create'
10
+ */
11
+ templateKey?: string;
12
+ /**
13
+ * 参数构建器,用于从请求和实体变更中提取描述参数
14
+ * @param context - 包含 req, result, error, entityChanges 的上下文
15
+ * @returns 描述参数对象
16
+ *
17
+ * @example
18
+ * paramsBuilder: (context) => {
19
+ * const order = context.findEntity('Order', 'CREATE');
20
+ * const items = context.findEntities('OrderItem', 'CREATE');
21
+ * return {
22
+ * 'order.sn': order?.newValue.orderSn,
23
+ * 'product.count': items.length,
24
+ * 'receiver': order?.newValue.receiverName,
25
+ * };
26
+ * }
27
+ */
28
+ paramsBuilder?: (context: AuditParamsContext) => Record<string, any>;
29
+ /**
30
+ * 是否启用审计(默认 true)
31
+ */
32
+ enabled?: boolean;
33
+ /**
34
+ * 扩展元数据
35
+ */
36
+ metadata?: Record<string, any>;
37
+ }
38
+ /**
39
+ * 审计动作装饰器元数据
40
+ */
41
+ export interface AuditActionMetadata {
42
+ actionName: string;
43
+ options: AuditActionOptions;
44
+ }
45
+ /**
46
+ * 审计动作装饰器
47
+ * 用于在控制器方法上标记审计动作,自动收集该请求中的所有实体变更
48
+ *
49
+ * @param actionName - 操作名称,如 'createOrder', 'cancelOrder'
50
+ * @param options - 审计动作选项
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * @Post()
55
+ * @AuditAction('createOrder', {
56
+ * templateKey: 'order.create',
57
+ * paramsBuilder: (context) => {
58
+ * const order = context.findEntity('Order', 'CREATE');
59
+ * const items = context.findEntities('OrderItem', 'CREATE');
60
+ * return {
61
+ * 'order.sn': order?.newValue.orderSn,
62
+ * 'product.count': items.length,
63
+ * 'product.names': items.map(i => i.metadata?.productName).join('、'),
64
+ * 'receiver': order?.newValue.receiverName,
65
+ * 'totalAmount': order?.newValue.totalAmount,
66
+ * };
67
+ * }
68
+ * })
69
+ * async createOrder(@Body() dto: CreateOrderDto) {
70
+ * return await this.orderService.create(dto);
71
+ * }
72
+ * ```
73
+ */
74
+ export declare function AuditAction(actionName: string, options?: AuditActionOptions): MethodDecorator;
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AUDIT_ACTION_METADATA = void 0;
4
+ exports.AuditAction = AuditAction;
5
+ const common_1 = require("@nestjs/common");
6
+ exports.AUDIT_ACTION_METADATA = 'AUDIT_ACTION_METADATA';
7
+ /**
8
+ * 审计动作装饰器
9
+ * 用于在控制器方法上标记审计动作,自动收集该请求中的所有实体变更
10
+ *
11
+ * @param actionName - 操作名称,如 'createOrder', 'cancelOrder'
12
+ * @param options - 审计动作选项
13
+ *
14
+ * @example
15
+ * ```typescript
16
+ * @Post()
17
+ * @AuditAction('createOrder', {
18
+ * templateKey: 'order.create',
19
+ * paramsBuilder: (context) => {
20
+ * const order = context.findEntity('Order', 'CREATE');
21
+ * const items = context.findEntities('OrderItem', 'CREATE');
22
+ * return {
23
+ * 'order.sn': order?.newValue.orderSn,
24
+ * 'product.count': items.length,
25
+ * 'product.names': items.map(i => i.metadata?.productName).join('、'),
26
+ * 'receiver': order?.newValue.receiverName,
27
+ * 'totalAmount': order?.newValue.totalAmount,
28
+ * };
29
+ * }
30
+ * })
31
+ * async createOrder(@Body() dto: CreateOrderDto) {
32
+ * return await this.orderService.create(dto);
33
+ * }
34
+ * ```
35
+ */
36
+ function AuditAction(actionName, options = {}) {
37
+ const metadata = {
38
+ actionName,
39
+ options: Object.assign({ enabled: true }, options),
40
+ };
41
+ return (0, common_1.SetMetadata)(exports.AUDIT_ACTION_METADATA, metadata);
42
+ }
@@ -5,7 +5,7 @@ export declare const FIELD_AUDIT_OPTIONS: unique symbol;
5
5
  * 实体审计装饰器
6
6
  *
7
7
  * @description
8
- * 支持基础审计配置。
8
+ * 支持基础审计配置和多语言标签。
9
9
  * 字段标签和值标签请使用 @AuditField({ label: { zh: '姓名', en: 'Name' } })
10
10
  *
11
11
  * @param options 审计配置选项
@@ -14,6 +14,7 @@ export declare const FIELD_AUDIT_OPTIONS: unique symbol;
14
14
  * // 基础用法
15
15
  * @AuditEntity({
16
16
  * enabled: true,
17
+ * label: { zh: '订单', en: 'Order' },
17
18
  * excludeFields: ['password'],
18
19
  * maskFields: ['email']
19
20
  * })
@@ -22,6 +23,7 @@ export declare const FIELD_AUDIT_OPTIONS: unique symbol;
22
23
  * // 指定模板键
23
24
  * @AuditEntity({
24
25
  * enabled: true,
26
+ * label: { zh: '用户', en: 'User' },
25
27
  * templateKey: 'user',
26
28
  * })
27
29
  */
@@ -78,3 +80,10 @@ export declare function getFieldLabel(target: any, fieldName: string, language?:
78
80
  * @returns 值的标签
79
81
  */
80
82
  export declare function getFieldValueLabel(target: any, fieldName: string, value: any, language?: string): string;
83
+ /**
84
+ * 获取实体的标签(支持多语言)
85
+ * @param target 目标类
86
+ * @param language 语言代码(默认:zh)
87
+ * @returns 实体标签
88
+ */
89
+ export declare function getEntityLabel(target: any, language?: string): string;
@@ -7,6 +7,7 @@ exports.getEntityAuditConfig = getEntityAuditConfig;
7
7
  exports.getFieldAuditConfig = getFieldAuditConfig;
8
8
  exports.getFieldLabel = getFieldLabel;
9
9
  exports.getFieldValueLabel = getFieldValueLabel;
10
+ exports.getEntityLabel = getEntityLabel;
10
11
  // 元数据键
11
12
  exports.ENTITY_AUDIT_OPTIONS = Symbol('ENTITY_AUDIT_OPTIONS');
12
13
  exports.FIELD_AUDIT_OPTIONS = Symbol('FIELD_AUDIT_OPTIONS');
@@ -14,7 +15,7 @@ exports.FIELD_AUDIT_OPTIONS = Symbol('FIELD_AUDIT_OPTIONS');
14
15
  * 实体审计装饰器
15
16
  *
16
17
  * @description
17
- * 支持基础审计配置。
18
+ * 支持基础审计配置和多语言标签。
18
19
  * 字段标签和值标签请使用 @AuditField({ label: { zh: '姓名', en: 'Name' } })
19
20
  *
20
21
  * @param options 审计配置选项
@@ -23,6 +24,7 @@ exports.FIELD_AUDIT_OPTIONS = Symbol('FIELD_AUDIT_OPTIONS');
23
24
  * // 基础用法
24
25
  * @AuditEntity({
25
26
  * enabled: true,
27
+ * label: { zh: '订单', en: 'Order' },
26
28
  * excludeFields: ['password'],
27
29
  * maskFields: ['email']
28
30
  * })
@@ -31,31 +33,27 @@ exports.FIELD_AUDIT_OPTIONS = Symbol('FIELD_AUDIT_OPTIONS');
31
33
  * // 指定模板键
32
34
  * @AuditEntity({
33
35
  * enabled: true,
36
+ * label: { zh: '用户', en: 'User' },
34
37
  * templateKey: 'user',
35
38
  * })
36
39
  */
37
40
  function AuditEntity(options) {
38
41
  return (target) => {
39
- // 处理兼容性:sensitiveFields 别名
40
- const mergedOptions = Object.assign(Object.assign({}, options), {
41
- // 合并 sensitiveFields 到 maskFields
42
- maskFields: [
43
- ...((options === null || options === void 0 ? void 0 : options.maskFields) || []),
44
- ...((options === null || options === void 0 ? void 0 : options.sensitiveFields) || []),
45
- ] });
46
- // 去重
47
- if (mergedOptions.maskFields && mergedOptions.maskFields.length > 0) {
48
- mergedOptions.maskFields = [...new Set(mergedOptions.maskFields)];
42
+ // 存储审计元数据
43
+ const auditOptions = Object.assign({}, options);
44
+ // 去重 maskFields
45
+ if (auditOptions.maskFields && auditOptions.maskFields.length > 0) {
46
+ auditOptions.maskFields = [...new Set(auditOptions.maskFields)];
49
47
  }
50
48
  // 存储基础审计元数据
51
- Reflect.defineMetadata(exports.ENTITY_AUDIT_OPTIONS, mergedOptions, target);
49
+ Reflect.defineMetadata(exports.ENTITY_AUDIT_OPTIONS, auditOptions, target);
52
50
  // 如果有 templateKey,同时存储到 entity-log 元数据(兼容性)
53
- if (mergedOptions.templateKey) {
51
+ if (auditOptions.templateKey) {
54
52
  Reflect.defineMetadata('entity-log:enabled', true, target);
55
53
  Reflect.defineMetadata('entity-log:options', {
56
- templateKey: mergedOptions.templateKey,
57
- excludeFields: mergedOptions.excludeFields,
58
- sensitiveFields: mergedOptions.maskFields,
54
+ templateKey: auditOptions.templateKey,
55
+ excludeFields: auditOptions.excludeFields,
56
+ sensitiveFields: auditOptions.maskFields,
59
57
  }, target);
60
58
  }
61
59
  };
@@ -149,3 +147,23 @@ function getFieldValueLabel(target, fieldName, value, language = 'zh') {
149
147
  // 如果是对象,返回指定语言的值
150
148
  return labelMap[language] || labelMap['zh'] || value;
151
149
  }
150
+ /**
151
+ * 获取实体的标签(支持多语言)
152
+ * @param target 目标类
153
+ * @param language 语言代码(默认:zh)
154
+ * @returns 实体标签
155
+ */
156
+ function getEntityLabel(target, language = 'zh') {
157
+ const config = getEntityAuditConfig(target);
158
+ const label = config.label;
159
+ if (!label) {
160
+ // 如果没有配置标签,返回类名
161
+ return target.name || 'Entity';
162
+ }
163
+ // 如果是字符串,直接返回
164
+ if (typeof label === 'string') {
165
+ return label;
166
+ }
167
+ // 如果是对象,返回指定语言的值
168
+ return label[language] || label['zh'] || target.name || 'Entity';
169
+ }
@@ -1,3 +1,4 @@
1
1
  export * from './entity-audit.decorator';
2
2
  export * from './audit-controller.decorator';
3
3
  export * from './audit-operation.decorator';
4
+ export * from './audit-action.decorator';
@@ -17,3 +17,4 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./entity-audit.decorator"), exports);
18
18
  __exportStar(require("./audit-controller.decorator"), exports);
19
19
  __exportStar(require("./audit-operation.decorator"), exports);
20
+ __exportStar(require("./audit-action.decorator"), exports);
@@ -0,0 +1,23 @@
1
+ import { AbstractUuidPrimaryEntity } from '../../common/abstract.entity';
2
+ /**
3
+ * 审计动作汇总实体
4
+ * 记录一次 API 调用的审计摘要信息
5
+ */
6
+ export declare class AuditActionSummaryEntity extends AbstractUuidPrimaryEntity {
7
+ actionName: string;
8
+ operationTemplateKey: string;
9
+ descriptionParams: Record<string, any>;
10
+ description: string;
11
+ requestId: string;
12
+ userId: string;
13
+ username: string;
14
+ requestIp: string;
15
+ userAgent: string;
16
+ entityChangesCount: number;
17
+ entityTypes: string[];
18
+ operationStats: Record<string, number>;
19
+ success: boolean;
20
+ errorMessage: string;
21
+ duration: number;
22
+ metadata: Record<string, any>;
23
+ }
@@ -0,0 +1,101 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.AuditActionSummaryEntity = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ const abstract_entity_1 = require("../../common/abstract.entity");
15
+ /**
16
+ * 审计动作汇总实体
17
+ * 记录一次 API 调用的审计摘要信息
18
+ */
19
+ let AuditActionSummaryEntity = class AuditActionSummaryEntity extends abstract_entity_1.AbstractUuidPrimaryEntity {
20
+ };
21
+ exports.AuditActionSummaryEntity = AuditActionSummaryEntity;
22
+ __decorate([
23
+ (0, typeorm_1.Column)({ comment: '操作名称,如 createOrder, cancelOrder' }),
24
+ __metadata("design:type", String)
25
+ ], AuditActionSummaryEntity.prototype, "actionName", void 0);
26
+ __decorate([
27
+ (0, typeorm_1.Column)({ nullable: true, comment: '操作模板键,用于多语言支持' }),
28
+ __metadata("design:type", String)
29
+ ], AuditActionSummaryEntity.prototype, "operationTemplateKey", void 0);
30
+ __decorate([
31
+ (0, typeorm_1.Column)({ type: 'json', nullable: true, comment: '描述参数,用于填充模板' }),
32
+ __metadata("design:type", Object)
33
+ ], AuditActionSummaryEntity.prototype, "descriptionParams", void 0);
34
+ __decorate([
35
+ (0, typeorm_1.Column)({ type: 'text', nullable: true, comment: '操作描述文本(根据模板生成)' }),
36
+ __metadata("design:type", String)
37
+ ], AuditActionSummaryEntity.prototype, "description", void 0);
38
+ __decorate([
39
+ (0, typeorm_1.Column)({ comment: '请求ID' }),
40
+ __metadata("design:type", String)
41
+ ], AuditActionSummaryEntity.prototype, "requestId", void 0);
42
+ __decorate([
43
+ (0, typeorm_1.Column)({ nullable: true, comment: '用户ID' }),
44
+ __metadata("design:type", String)
45
+ ], AuditActionSummaryEntity.prototype, "userId", void 0);
46
+ __decorate([
47
+ (0, typeorm_1.Column)({ nullable: true, comment: '用户名' }),
48
+ __metadata("design:type", String)
49
+ ], AuditActionSummaryEntity.prototype, "username", void 0);
50
+ __decorate([
51
+ (0, typeorm_1.Column)({ nullable: true, comment: '请求IP' }),
52
+ __metadata("design:type", String)
53
+ ], AuditActionSummaryEntity.prototype, "requestIp", void 0);
54
+ __decorate([
55
+ (0, typeorm_1.Column)({ type: 'text', nullable: true, comment: '用户代理' }),
56
+ __metadata("design:type", String)
57
+ ], AuditActionSummaryEntity.prototype, "userAgent", void 0);
58
+ __decorate([
59
+ (0, typeorm_1.Column)({ type: 'int', default: 0, comment: '涉及的实体变更数量' }),
60
+ __metadata("design:type", Number)
61
+ ], AuditActionSummaryEntity.prototype, "entityChangesCount", void 0);
62
+ __decorate([
63
+ (0, typeorm_1.Column)({ type: 'json', nullable: true, comment: '涉及的实体类型列表' }),
64
+ __metadata("design:type", Array)
65
+ ], AuditActionSummaryEntity.prototype, "entityTypes", void 0);
66
+ __decorate([
67
+ (0, typeorm_1.Column)({ type: 'json', nullable: true, comment: '操作统计: {CREATE: 3, UPDATE: 2}' }),
68
+ __metadata("design:type", Object)
69
+ ], AuditActionSummaryEntity.prototype, "operationStats", void 0);
70
+ __decorate([
71
+ (0, typeorm_1.Column)({ type: 'boolean', default: true, comment: '操作是否成功' }),
72
+ __metadata("design:type", Boolean)
73
+ ], AuditActionSummaryEntity.prototype, "success", void 0);
74
+ __decorate([
75
+ (0, typeorm_1.Column)({ type: 'text', nullable: true, comment: '错误信息(如果失败)' }),
76
+ __metadata("design:type", String)
77
+ ], AuditActionSummaryEntity.prototype, "errorMessage", void 0);
78
+ __decorate([
79
+ (0, typeorm_1.Column)({ type: 'int', default: 0, comment: '操作耗时(毫秒)' }),
80
+ __metadata("design:type", Number)
81
+ ], AuditActionSummaryEntity.prototype, "duration", void 0);
82
+ __decorate([
83
+ (0, typeorm_1.Column)({ type: 'json', nullable: true, comment: '扩展元数据' }),
84
+ __metadata("design:type", Object)
85
+ ], AuditActionSummaryEntity.prototype, "metadata", void 0);
86
+ exports.AuditActionSummaryEntity = AuditActionSummaryEntity = __decorate([
87
+ (0, typeorm_1.Entity)('audit_action_summary')
88
+ // 单字段索引
89
+ ,
90
+ (0, typeorm_1.Index)('idx_action_name', ['actionName']),
91
+ (0, typeorm_1.Index)('idx_request_id', ['requestId']),
92
+ (0, typeorm_1.Index)('idx_user', ['userId']),
93
+ (0, typeorm_1.Index)('idx_created_at', ['createdAt']),
94
+ (0, typeorm_1.Index)('idx_success', ['success'])
95
+ // 复合索引 - 优化常见查询
96
+ ,
97
+ (0, typeorm_1.Index)('idx_action_user', ['actionName', 'userId']),
98
+ (0, typeorm_1.Index)('idx_user_time', ['userId', 'createdAt']),
99
+ (0, typeorm_1.Index)('idx_success_time', ['success', 'createdAt']),
100
+ (0, typeorm_1.Index)('idx_action_success_time', ['actionName', 'success', 'createdAt'])
101
+ ], AuditActionSummaryEntity);
@@ -19,6 +19,9 @@ export declare class EntityAuditLogEntity extends AbstractUuidPrimaryEntity {
19
19
  userAgent: string;
20
20
  description: string;
21
21
  hashChain: Record<string, any>;
22
+ auditActionId: string;
23
+ auditActionName: string;
24
+ sequenceInAction: number;
22
25
  operationTemplateKey: string;
23
26
  descriptionParams: Record<string, any>;
24
27
  changeDetails: ChangeDetail[];
@@ -75,6 +75,18 @@ __decorate([
75
75
  (0, typeorm_1.Column)({ type: 'json', nullable: true, comment: '哈希链' }),
76
76
  __metadata("design:type", Object)
77
77
  ], EntityAuditLogEntity.prototype, "hashChain", void 0);
78
+ __decorate([
79
+ (0, typeorm_1.Column)({ nullable: true, comment: '审计动作ID,用于关联同一业务操作的多个实体变化' }),
80
+ __metadata("design:type", String)
81
+ ], EntityAuditLogEntity.prototype, "auditActionId", void 0);
82
+ __decorate([
83
+ (0, typeorm_1.Column)({ nullable: true, comment: '审计动作名称,如 createOrder、updateUser' }),
84
+ __metadata("design:type", String)
85
+ ], EntityAuditLogEntity.prototype, "auditActionName", void 0);
86
+ __decorate([
87
+ (0, typeorm_1.Column)({ type: 'int', default: 0, comment: '在审计动作内的序号' }),
88
+ __metadata("design:type", Number)
89
+ ], EntityAuditLogEntity.prototype, "sequenceInAction", void 0);
78
90
  __decorate([
79
91
  (0, typeorm_1.Column)({ nullable: true, comment: '操作模板键,用于动态生成描述' }),
80
92
  __metadata("design:type", String)
@@ -104,10 +116,21 @@ __decorate([
104
116
  __metadata("design:type", Array)
105
117
  ], EntityAuditLogEntity.prototype, "rollbackActions", void 0);
106
118
  exports.EntityAuditLogEntity = EntityAuditLogEntity = __decorate([
107
- (0, typeorm_1.Entity)('entity_audit_log'),
119
+ (0, typeorm_1.Entity)('entity_audit_log')
120
+ // 单字段索引
121
+ ,
108
122
  (0, typeorm_1.Index)('idx_entity_relation', ['entityType', 'entityId']),
109
123
  (0, typeorm_1.Index)('idx_operation', ['operation']),
110
124
  (0, typeorm_1.Index)('idx_user', ['userId']),
111
125
  (0, typeorm_1.Index)('idx_created_at', ['createdAt']),
112
- (0, typeorm_1.Index)('idx_template_key', ['operationTemplateKey'])
126
+ (0, typeorm_1.Index)('idx_template_key', ['operationTemplateKey']),
127
+ (0, typeorm_1.Index)('idx_request_id', ['requestId']),
128
+ (0, typeorm_1.Index)('idx_audit_action', ['auditActionId'])
129
+ // 复合索引 - 优化常见查询
130
+ ,
131
+ (0, typeorm_1.Index)('idx_entity_operation', ['entityType', 'entityId', 'operation']),
132
+ (0, typeorm_1.Index)('idx_entity_time', ['entityType', 'entityId', 'createdAt']),
133
+ (0, typeorm_1.Index)('idx_user_time', ['userId', 'createdAt']),
134
+ (0, typeorm_1.Index)('idx_request_time', ['requestId', 'createdAt']),
135
+ (0, typeorm_1.Index)('idx_action_sequence', ['auditActionId', 'sequenceInAction'])
113
136
  ], EntityAuditLogEntity);
@@ -1,12 +1,11 @@
1
1
  import { AbstractUuidPrimaryEntity } from '../../common/abstract.entity';
2
- import { AuditOperation, TransactionStatus } from '../enums';
3
- import { ManualOperationLogEntity } from './manual-operation-log.entity';
2
+ import { AuditOperation, AuditTransactionStatus } from '../enums';
4
3
  /**
5
4
  * 实体事务
6
5
  */
7
6
  export declare class EntityTransactionEntity extends AbstractUuidPrimaryEntity {
8
7
  description: string;
9
- status: TransactionStatus;
8
+ status: AuditTransactionStatus;
10
9
  entities: Array<{
11
10
  entityType: string;
12
11
  entityId: string;
@@ -20,5 +19,5 @@ export declare class EntityTransactionEntity extends AbstractUuidPrimaryEntity {
20
19
  requestIp: string;
21
20
  metadata: Record<string, any>;
22
21
  completedAt: Date;
23
- manualOperations: ManualOperationLogEntity[];
22
+ manualOperations: any[];
24
23
  }