@nest-omni/core 4.1.3-1 → 4.1.3-3

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 (237) hide show
  1. package/audit/audit.module.d.ts +10 -0
  2. package/audit/audit.module.js +15 -0
  3. package/audit/controllers/audit.controller.d.ts +24 -0
  4. package/audit/controllers/audit.controller.js +24 -0
  5. package/audit/decorators/audit-controller.decorator.d.ts +8 -0
  6. package/audit/decorators/audit-controller.decorator.js +9 -0
  7. package/audit/decorators/audit-operation.decorator.d.ts +45 -0
  8. package/audit/decorators/audit-operation.decorator.js +49 -0
  9. package/audit/decorators/entity-audit.decorator.d.ts +8 -0
  10. package/audit/decorators/entity-audit.decorator.js +9 -0
  11. package/audit/dto/audit-log-query.dto.d.ts +3 -0
  12. package/audit/dto/audit-log-query.dto.js +3 -0
  13. package/audit/dto/begin-transaction.dto.d.ts +3 -0
  14. package/audit/dto/begin-transaction.dto.js +3 -0
  15. package/audit/dto/compare-entities.dto.d.ts +3 -0
  16. package/audit/dto/compare-entities.dto.js +3 -0
  17. package/audit/dto/pre-check-restore.dto.d.ts +3 -0
  18. package/audit/dto/pre-check-restore.dto.js +3 -0
  19. package/audit/dto/restore-entity.dto.d.ts +3 -0
  20. package/audit/dto/restore-entity.dto.js +3 -0
  21. package/audit/entities/entity-audit-log.entity.d.ts +3 -0
  22. package/audit/entities/entity-audit-log.entity.js +3 -0
  23. package/audit/entities/entity-transaction.entity.d.ts +3 -0
  24. package/audit/entities/entity-transaction.entity.js +3 -0
  25. package/audit/entities/manual-operation-log.entity.d.ts +4 -0
  26. package/audit/entities/manual-operation-log.entity.js +4 -0
  27. package/audit/entities/operation-template.entity.d.ts +4 -0
  28. package/audit/entities/operation-template.entity.js +4 -0
  29. package/audit/enums/audit.enums.d.ts +17 -2
  30. package/audit/enums/audit.enums.js +15 -0
  31. package/audit/index.js +10 -0
  32. package/audit/interceptors/audit.interceptor.d.ts +15 -0
  33. package/audit/interceptors/audit.interceptor.js +23 -1
  34. package/audit/interfaces/audit.interfaces.d.ts +42 -0
  35. package/audit/services/audit-context.service.d.ts +15 -0
  36. package/audit/services/audit-context.service.js +15 -0
  37. package/audit/services/audit-strategy.service.d.ts +6 -0
  38. package/audit/services/audit-strategy.service.js +13 -0
  39. package/audit/services/entity-audit.service.d.ts +57 -0
  40. package/audit/services/entity-audit.service.js +91 -0
  41. package/audit/services/manual-audit-log.service.d.ts +124 -0
  42. package/audit/services/manual-audit-log.service.js +138 -0
  43. package/audit/services/multi-database.service.d.ts +12 -0
  44. package/audit/services/multi-database.service.js +12 -0
  45. package/audit/services/operation-description.service.d.ts +59 -0
  46. package/audit/services/operation-description.service.js +76 -2
  47. package/audit/services/transaction-audit.service.d.ts +30 -0
  48. package/audit/services/transaction-audit.service.js +47 -0
  49. package/audit/subscribers/entity-audit.subscriber.d.ts +15 -0
  50. package/audit/subscribers/entity-audit.subscriber.js +29 -1
  51. package/cache/cache-metrics.service.d.ts +67 -0
  52. package/cache/cache-metrics.service.js +68 -4
  53. package/cache/cache-serialization.service.d.ts +31 -0
  54. package/cache/cache-serialization.service.js +25 -0
  55. package/cache/cache.constants.d.ts +9 -0
  56. package/cache/cache.constants.js +9 -0
  57. package/cache/cache.health.d.ts +26 -0
  58. package/cache/cache.health.js +30 -0
  59. package/cache/cache.module.d.ts +86 -0
  60. package/cache/cache.module.js +71 -0
  61. package/cache/cache.service.d.ts +140 -0
  62. package/cache/cache.service.js +157 -0
  63. package/cache/cache.warmup.service.d.ts +39 -0
  64. package/cache/cache.warmup.service.js +32 -0
  65. package/cache/decorators/cache-evict.decorator.d.ts +47 -0
  66. package/cache/decorators/cache-evict.decorator.js +56 -0
  67. package/cache/decorators/cache-put.decorator.d.ts +34 -0
  68. package/cache/decorators/cache-put.decorator.js +39 -0
  69. package/cache/decorators/cacheable.decorator.d.ts +40 -0
  70. package/cache/decorators/cacheable.decorator.js +55 -0
  71. package/cache/dependencies/callback.dependency.d.ts +33 -0
  72. package/cache/dependencies/callback.dependency.js +39 -1
  73. package/cache/dependencies/chain.dependency.d.ts +28 -0
  74. package/cache/dependencies/chain.dependency.js +34 -0
  75. package/cache/dependencies/db.dependency.d.ts +45 -0
  76. package/cache/dependencies/db.dependency.js +48 -1
  77. package/cache/dependencies/file.dependency.d.ts +32 -0
  78. package/cache/dependencies/file.dependency.js +34 -0
  79. package/cache/dependencies/tag.dependency.d.ts +36 -0
  80. package/cache/dependencies/tag.dependency.js +36 -0
  81. package/cache/dependencies/time.dependency.d.ts +43 -0
  82. package/cache/dependencies/time.dependency.js +43 -0
  83. package/cache/examples/basic-usage.d.ts +15 -0
  84. package/cache/examples/basic-usage.js +62 -8
  85. package/cache/index.js +9 -0
  86. package/cache/interfaces/cache-dependency.interface.d.ts +53 -0
  87. package/cache/interfaces/cache-options.interface.d.ts +81 -0
  88. package/cache/interfaces/cache-options.interface.js +6 -0
  89. package/cache/interfaces/cache-provider.interface.d.ts +78 -0
  90. package/cache/providers/base-cache.provider.d.ts +14 -0
  91. package/cache/providers/base-cache.provider.js +16 -0
  92. package/cache/providers/cls-cache.provider.d.ts +20 -0
  93. package/cache/providers/cls-cache.provider.js +28 -0
  94. package/cache/providers/memory-cache.provider.d.ts +23 -0
  95. package/cache/providers/memory-cache.provider.js +26 -0
  96. package/cache/providers/redis-cache.provider.d.ts +26 -0
  97. package/cache/providers/redis-cache.provider.js +29 -0
  98. package/cache/utils/dependency-manager.util.d.ts +52 -0
  99. package/cache/utils/dependency-manager.util.js +59 -0
  100. package/cache/utils/key-generator.util.d.ts +42 -0
  101. package/cache/utils/key-generator.util.js +53 -1
  102. package/common/abstract.entity.d.ts +14 -0
  103. package/common/abstract.entity.js +14 -0
  104. package/common/boilerplate.polyfill.d.ts +142 -4
  105. package/common/boilerplate.polyfill.js +24 -100
  106. package/common/dto/dto-container.d.ts +16 -0
  107. package/common/dto/dto-container.js +20 -0
  108. package/common/dto/dto-decorators.d.ts +18 -0
  109. package/common/dto/dto-decorators.js +14 -0
  110. package/common/dto/dto-extensions.d.ts +11 -0
  111. package/common/dto/dto-extensions.js +9 -0
  112. package/common/dto/dto-service-accessor.d.ts +17 -0
  113. package/common/dto/dto-service-accessor.js +18 -0
  114. package/common/dto/dto-transformer.d.ts +12 -0
  115. package/common/dto/dto-transformer.js +9 -0
  116. package/common/dto/index.js +2 -0
  117. package/common/examples/paginate-and-map.example.d.ts +6 -0
  118. package/common/examples/paginate-and-map.example.js +26 -0
  119. package/common/utils.d.ts +15 -0
  120. package/common/utils.js +15 -0
  121. package/constants/language-code.js +1 -0
  122. package/decorators/field.decorators.js +8 -1
  123. package/decorators/property.decorators.js +1 -0
  124. package/decorators/public-route.decorator.js +1 -0
  125. package/decorators/transform.decorators.d.ts +27 -0
  126. package/decorators/transform.decorators.js +29 -0
  127. package/decorators/translate.decorator.js +1 -0
  128. package/decorators/user.decorator.js +1 -0
  129. package/decorators/validator.decorators.d.ts +8 -18
  130. package/decorators/validator.decorators.js +22 -190
  131. package/filters/constraint-errors.js +1 -0
  132. package/helpers/common.helper.d.ts +13 -0
  133. package/helpers/common.helper.js +13 -0
  134. package/http-client/config/http-client.config.d.ts +15 -0
  135. package/http-client/config/http-client.config.js +25 -9
  136. package/http-client/decorators/http-client.decorators.d.ts +63 -0
  137. package/http-client/decorators/http-client.decorators.js +71 -3
  138. package/http-client/entities/http-log.entity.d.ts +229 -0
  139. package/http-client/entities/http-log.entity.js +6 -1
  140. package/http-client/errors/http-client.errors.d.ts +57 -0
  141. package/http-client/errors/http-client.errors.js +58 -0
  142. package/http-client/examples/advanced-usage.example.d.ts +41 -0
  143. package/http-client/examples/advanced-usage.example.js +68 -24
  144. package/http-client/examples/auth-with-waiting-lock.example.d.ts +31 -0
  145. package/http-client/examples/auth-with-waiting-lock.example.js +52 -5
  146. package/http-client/examples/basic-usage.example.d.ts +60 -0
  147. package/http-client/examples/basic-usage.example.js +60 -0
  148. package/http-client/examples/multi-api-configuration.example.d.ts +60 -0
  149. package/http-client/examples/multi-api-configuration.example.js +76 -5
  150. package/http-client/http-client.module.d.ts +13 -0
  151. package/http-client/http-client.module.js +19 -0
  152. package/http-client/index.js +8 -0
  153. package/http-client/interfaces/api-client-config.interface.d.ts +125 -0
  154. package/http-client/interfaces/api-client-config.interface.js +3 -0
  155. package/http-client/interfaces/http-client-config.interface.d.ts +60 -0
  156. package/http-client/services/api-client-registry.service.d.ts +57 -0
  157. package/http-client/services/api-client-registry.service.js +84 -1
  158. package/http-client/services/cache.service.d.ts +52 -0
  159. package/http-client/services/cache.service.js +72 -3
  160. package/http-client/services/circuit-breaker.service.d.ts +46 -0
  161. package/http-client/services/circuit-breaker.service.js +52 -0
  162. package/http-client/services/http-client.service.d.ts +67 -0
  163. package/http-client/services/http-client.service.js +105 -4
  164. package/http-client/services/http-log-query.service.d.ts +83 -0
  165. package/http-client/services/http-log-query.service.js +122 -1
  166. package/http-client/services/http-replay.service.d.ts +101 -0
  167. package/http-client/services/http-replay.service.js +86 -0
  168. package/http-client/services/log-cleanup.service.d.ts +63 -0
  169. package/http-client/services/log-cleanup.service.js +54 -2
  170. package/http-client/services/logging.service.d.ts +40 -0
  171. package/http-client/services/logging.service.js +53 -0
  172. package/http-client/utils/call-stack-extractor.util.d.ts +37 -0
  173. package/http-client/utils/call-stack-extractor.util.js +48 -0
  174. package/http-client/utils/context-extractor.util.d.ts +49 -0
  175. package/http-client/utils/context-extractor.util.js +52 -0
  176. package/http-client/utils/curl-generator.util.d.ts +21 -0
  177. package/http-client/utils/curl-generator.util.js +44 -3
  178. package/http-client/utils/request-id.util.d.ts +18 -0
  179. package/http-client/utils/request-id.util.js +20 -0
  180. package/http-client/utils/retry-recorder.util.d.ts +42 -0
  181. package/http-client/utils/retry-recorder.util.js +44 -0
  182. package/i18n/en_US/validation.json +2 -1
  183. package/i18n/zh_CN/validation.json +2 -1
  184. package/index.js +8 -0
  185. package/interceptors/translation-interceptor.service.js +5 -0
  186. package/package.json +1 -1
  187. package/providers/context.provider.js +2 -0
  188. package/providers/generator.provider.d.ts +4 -0
  189. package/providers/generator.provider.js +4 -0
  190. package/redis-lock/examples/lock-strategy.examples.d.ts +89 -0
  191. package/redis-lock/examples/lock-strategy.examples.js +130 -15
  192. package/redis-lock/index.js +3 -0
  193. package/redis-lock/redis-lock.decorator.d.ts +101 -0
  194. package/redis-lock/redis-lock.decorator.js +120 -0
  195. package/redis-lock/redis-lock.module.d.ts +60 -0
  196. package/redis-lock/redis-lock.module.js +46 -0
  197. package/redis-lock/redis-lock.service.d.ts +251 -0
  198. package/redis-lock/redis-lock.service.js +219 -3
  199. package/setup/bootstrap.setup.js +20 -0
  200. package/setup/mode.setup.d.ts +44 -0
  201. package/setup/mode.setup.js +44 -0
  202. package/setup/schedule.decorator.d.ts +226 -0
  203. package/setup/schedule.decorator.js +214 -1
  204. package/setup/worker.decorator.d.ts +86 -0
  205. package/setup/worker.decorator.js +88 -0
  206. package/shared/serviceRegistryModule.js +9 -1
  207. package/shared/services/api-config.service.d.ts +3 -0
  208. package/shared/services/api-config.service.js +20 -9
  209. package/validator-json/decorators.d.ts +17 -0
  210. package/validator-json/decorators.js +17 -2
  211. package/validator-json/default.d.ts +6 -0
  212. package/validator-json/default.js +30 -2
  213. package/validator-json/defaultConverters.js +1 -0
  214. package/validator-json/options.d.ts +23 -0
  215. package/validators/common-validators.d.ts +143 -0
  216. package/validators/common-validators.js +249 -0
  217. package/validators/custom-validate.examples.d.ts +96 -0
  218. package/validators/custom-validate.examples.js +400 -0
  219. package/validators/custom-validate.validator.d.ts +133 -0
  220. package/validators/custom-validate.validator.js +213 -0
  221. package/validators/index.d.ts +2 -0
  222. package/validators/index.js +2 -0
  223. package/validators/is-exists.validator.d.ts +18 -4
  224. package/validators/is-exists.validator.js +67 -6
  225. package/validators/is-unique.validator.d.ts +19 -4
  226. package/validators/is-unique.validator.js +67 -11
  227. package/validators/skip-empty.validator.d.ts +5 -0
  228. package/validators/skip-empty.validator.js +5 -0
  229. package/vault/interfaces/vault-options.interface.d.ts +9 -0
  230. package/vault/vault-config.loader.d.ts +30 -0
  231. package/vault/vault-config.loader.js +48 -1
  232. package/vault/vault-config.service.d.ts +53 -0
  233. package/vault/vault-config.service.js +57 -0
  234. package/vault/vault.module.d.ts +4 -0
  235. package/vault/vault.module.js +4 -0
  236. package/decorators/examples/validation-decorators.example.d.ts +0 -69
  237. package/decorators/examples/validation-decorators.example.js +0 -331
@@ -30,14 +30,67 @@ const entities_1 = require("../entities");
30
30
  const audit_context_service_1 = require("./audit-context.service");
31
31
  const enums_1 = require("../enums");
32
32
  const crypto_1 = require("crypto");
33
+ /**
34
+ * 手动审计日志服务
35
+ *
36
+ * 提供全局静态方法,在任意地方手动记录操作日志
37
+ */
33
38
  let ManualAuditLogService = ManualAuditLogService_1 = class ManualAuditLogService {
34
39
  constructor(manualLogRepository, transactionRepository, contextService, dataSource) {
35
40
  this.manualLogRepository = manualLogRepository;
36
41
  this.transactionRepository = transactionRepository;
37
42
  this.contextService = contextService;
38
43
  this.dataSource = dataSource;
44
+ // 设置静态实例
39
45
  ManualAuditLogService_1.instance = this;
40
46
  }
47
+ /**
48
+ * 全局静态方法:记录操作日志
49
+ *
50
+ * @description
51
+ * 支持三种记录模式:
52
+ * 1. 模板键模式:从数据库查找模板
53
+ * 2. 直接描述模式:直接传入字符串或多语言描述
54
+ * 3. 内联模板模式:传入多语言模板 + 参数
55
+ *
56
+ * @example
57
+ * // 模式1:模板键模式
58
+ * await ManualAuditLogService.log({
59
+ * templateKey: 'user.login',
60
+ * descriptionParams: {
61
+ * username: 'john.doe',
62
+ * loginTime: new Date().toISOString(),
63
+ * },
64
+ * });
65
+ *
66
+ * @example
67
+ * // 模式2:直接描述模式(字符串)
68
+ * await ManualAuditLogService.log({
69
+ * description: '用户登录系统',
70
+ * });
71
+ *
72
+ * @example
73
+ * // 模式2:直接描述模式(多语言)
74
+ * await ManualAuditLogService.log({
75
+ * description: {
76
+ * zh: '用户登录系统',
77
+ * en: 'User logged in',
78
+ * },
79
+ * });
80
+ *
81
+ * @example
82
+ * // 模式3:内联模板模式
83
+ * await ManualAuditLogService.log({
84
+ * descriptionTemplate: {
85
+ * zh: '用户 {username} 在 {time} 登录了系统',
86
+ * en: 'User {username} logged in at {time}',
87
+ * },
88
+ * descriptionParams: {
89
+ * username: 'john.doe',
90
+ * time: new Date().toISOString(),
91
+ * },
92
+ * });
93
+ */
41
94
  static log(options) {
42
95
  return __awaiter(this, void 0, void 0, function* () {
43
96
  if (!ManualAuditLogService_1.instance) {
@@ -46,30 +99,44 @@ let ManualAuditLogService = ManualAuditLogService_1 = class ManualAuditLogServic
46
99
  return ManualAuditLogService_1.instance.logOperation(options);
47
100
  });
48
101
  }
102
+ /**
103
+ * 实例方法:记录操作日志
104
+ */
49
105
  logOperation(options) {
50
106
  return __awaiter(this, void 0, void 0, function* () {
51
107
  const { templateKey, description, descriptionTemplate, descriptionParams, userId, username, requestIp, rollbackActions, transactionId, autoCreateTransaction = true, } = options;
108
+ // 验证参数:至少提供一种模式
52
109
  if (!templateKey && !description && !descriptionTemplate) {
53
110
  throw new Error('ManualAuditLogService.log() requires one of: templateKey, description, or descriptionTemplate');
54
111
  }
112
+ // 验证参数冲突
55
113
  const modeCount = [templateKey, description, descriptionTemplate].filter(Boolean).length;
56
114
  if (modeCount > 1) {
57
115
  throw new Error('ManualAuditLogService.log() accepts only one mode: use either templateKey, description, or descriptionTemplate');
58
116
  }
117
+ // 获取当前上下文(如果有)
59
118
  const context = yield this.contextService.getCurrentContext();
119
+ // 合并用户信息(优先使用传入的参数)
60
120
  const finalUserId = userId || context.userId || 'system';
61
121
  const finalUsername = username || context.username || 'system';
62
122
  const finalRequestIp = requestIp || context.requestIp || 'unknown';
123
+ // 生成或使用事务ID
63
124
  let finalTransactionId = transactionId || context.transactionId;
64
125
  if (!finalTransactionId && autoCreateTransaction) {
126
+ // 自动创建事务
65
127
  finalTransactionId = yield this.createTransaction(finalUserId, finalUsername);
66
128
  }
129
+ // 创建手动操作日志
67
130
  const manualLog = this.manualLogRepository.create({
68
131
  transactionId: finalTransactionId,
132
+ // 模式1: 模板键模式
69
133
  operationTemplateKey: templateKey || null,
70
134
  descriptionParams: descriptionParams || null,
135
+ // 模式2: 直接描���模式
71
136
  directDescription: description || null,
137
+ // 模式3: 内联模板模式
72
138
  inlineTemplate: descriptionTemplate || null,
139
+ // 通用字段
73
140
  userId: finalUserId,
74
141
  username: finalUsername,
75
142
  requestIp: finalRequestIp,
@@ -78,6 +145,30 @@ let ManualAuditLogService = ManualAuditLogService_1 = class ManualAuditLogServic
78
145
  return this.manualLogRepository.save(manualLog);
79
146
  });
80
147
  }
148
+ /**
149
+ * 静态方法:带事务记录
150
+ *
151
+ * @example
152
+ * ```typescript
153
+ * const txId = await ManualAuditLogService.beginTransaction('user-123', 'John Doe');
154
+ *
155
+ * await ManualAuditLogService.log({
156
+ * templateKey: 'order.create',
157
+ * descriptionParams: { orderId: 'order-1' },
158
+ * transactionId: txId,
159
+ * autoCreateTransaction: false,
160
+ * });
161
+ *
162
+ * await ManualAuditLogService.log({
163
+ * templateKey: 'payment.process',
164
+ * descriptionParams: { paymentId: 'pay-1' },
165
+ * transactionId: txId,
166
+ * autoCreateTransaction: false,
167
+ * });
168
+ *
169
+ * await ManualAuditLogService.commitTransaction(txId);
170
+ * ```
171
+ */
81
172
  static beginTransaction(userId, username) {
82
173
  return __awaiter(this, void 0, void 0, function* () {
83
174
  if (!ManualAuditLogService_1.instance) {
@@ -86,6 +177,9 @@ let ManualAuditLogService = ManualAuditLogService_1 = class ManualAuditLogServic
86
177
  return ManualAuditLogService_1.instance.createTransaction(userId, username);
87
178
  });
88
179
  }
180
+ /**
181
+ * 静态方法:提交事务
182
+ */
89
183
  static commitTransaction(transactionId) {
90
184
  return __awaiter(this, void 0, void 0, function* () {
91
185
  if (!ManualAuditLogService_1.instance) {
@@ -94,6 +188,9 @@ let ManualAuditLogService = ManualAuditLogService_1 = class ManualAuditLogServic
94
188
  yield ManualAuditLogService_1.instance.updateTransactionStatus(transactionId, enums_1.TransactionStatus.COMMITTED);
95
189
  });
96
190
  }
191
+ /**
192
+ * 静态方法:回滚事务
193
+ */
97
194
  static rollbackTransaction(transactionId) {
98
195
  return __awaiter(this, void 0, void 0, function* () {
99
196
  if (!ManualAuditLogService_1.instance) {
@@ -102,6 +199,9 @@ let ManualAuditLogService = ManualAuditLogService_1 = class ManualAuditLogServic
102
199
  yield ManualAuditLogService_1.instance.updateTransactionStatus(transactionId, enums_1.TransactionStatus.ROLLED_BACK);
103
200
  });
104
201
  }
202
+ /**
203
+ * 创建事务
204
+ */
105
205
  createTransaction(userId, username) {
106
206
  return __awaiter(this, void 0, void 0, function* () {
107
207
  const context = yield this.contextService.getCurrentContext();
@@ -117,19 +217,53 @@ let ManualAuditLogService = ManualAuditLogService_1 = class ManualAuditLogServic
117
217
  return saved.id;
118
218
  });
119
219
  }
220
+ /**
221
+ * 更新事务状态
222
+ */
120
223
  updateTransactionStatus(transactionId, status) {
121
224
  return __awaiter(this, void 0, void 0, function* () {
122
225
  yield this.transactionRepository.update({ id: transactionId }, { status });
123
226
  });
124
227
  }
228
+ /**
229
+ * 生成事务ID
230
+ */
125
231
  generateTransactionId() {
126
232
  return `txn-${Date.now()}-${(0, crypto_1.randomBytes)(8).toString('hex')}`;
127
233
  }
234
+ /**
235
+ * 批量记录操作日志
236
+ *
237
+ * @description
238
+ * 批量记录多个操作,支持所有三种记录模式
239
+ *
240
+ * @example
241
+ * ```typescript
242
+ * // 混合使用多种模式
243
+ * await ManualAuditLogService.logBatch([
244
+ * {
245
+ * templateKey: 'product.update',
246
+ * descriptionParams: { productId: 'p1', field: 'price' },
247
+ * },
248
+ * {
249
+ * description: '批量更新库存',
250
+ * },
251
+ * {
252
+ * descriptionTemplate: {
253
+ * zh: '更新产品 {productId} 的 {field}',
254
+ * en: 'Update {field} of product {productId}',
255
+ * },
256
+ * descriptionParams: { productId: 'p3', field: 'stock' },
257
+ * },
258
+ * ]);
259
+ * ```
260
+ */
128
261
  static logBatch(operations, sharedTransactionId) {
129
262
  return __awaiter(this, void 0, void 0, function* () {
130
263
  if (!ManualAuditLogService_1.instance) {
131
264
  throw new Error('ManualAuditLogService is not initialized');
132
265
  }
266
+ // 创建共享事务ID
133
267
  const transactionId = sharedTransactionId ||
134
268
  (yield ManualAuditLogService_1.instance.createTransaction());
135
269
  const results = [];
@@ -137,12 +271,16 @@ let ManualAuditLogService = ManualAuditLogService_1 = class ManualAuditLogServic
137
271
  const result = yield ManualAuditLogService_1.instance.logOperation(Object.assign(Object.assign({}, operation), { transactionId, autoCreateTransaction: false }));
138
272
  results.push(result);
139
273
  }
274
+ // 自动提交事务(如果是自动创建的)
140
275
  if (!sharedTransactionId) {
141
276
  yield ManualAuditLogService_1.instance.updateTransactionStatus(transactionId, enums_1.TransactionStatus.COMMITTED);
142
277
  }
143
278
  return results;
144
279
  });
145
280
  }
281
+ /**
282
+ * 查询操作日志
283
+ */
146
284
  static findLogs(options) {
147
285
  return __awaiter(this, void 0, void 0, function* () {
148
286
  if (!ManualAuditLogService_1.instance) {
@@ -1,10 +1,22 @@
1
1
  import { DataSource } from 'typeorm';
2
2
  import { ModuleRef } from '@nestjs/core';
3
+ /**
4
+ * 多数据库连接管理服务
5
+ */
3
6
  export declare class MultiDatabaseService {
4
7
  private readonly moduleRef;
5
8
  private readonly config?;
6
9
  constructor(moduleRef: ModuleRef, config?: any);
10
+ /**
11
+ * 获取指定连接的 DataSource
12
+ */
7
13
  getDataSource(connectionName?: string): Promise<DataSource>;
14
+ /**
15
+ * 获取所有监听的数据库连接
16
+ */
8
17
  getMonitoredConnections(): string[];
18
+ /**
19
+ * 获取审计日志存储的数据库连接
20
+ */
9
21
  getAuditConnection(): string;
10
22
  }
@@ -25,11 +25,17 @@ exports.MultiDatabaseService = void 0;
25
25
  const common_1 = require("@nestjs/common");
26
26
  const typeorm_1 = require("@nestjs/typeorm");
27
27
  const core_1 = require("@nestjs/core");
28
+ /**
29
+ * 多数据库连接管理服务
30
+ */
28
31
  let MultiDatabaseService = class MultiDatabaseService {
29
32
  constructor(moduleRef, config) {
30
33
  this.moduleRef = moduleRef;
31
34
  this.config = config;
32
35
  }
36
+ /**
37
+ * 获取指定连接的 DataSource
38
+ */
33
39
  getDataSource() {
34
40
  return __awaiter(this, arguments, void 0, function* (connectionName = 'default') {
35
41
  try {
@@ -41,10 +47,16 @@ let MultiDatabaseService = class MultiDatabaseService {
41
47
  }
42
48
  });
43
49
  }
50
+ /**
51
+ * 获取所有监听的数据库连接
52
+ */
44
53
  getMonitoredConnections() {
45
54
  var _a, _b;
46
55
  return ((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.connections) === null || _b === void 0 ? void 0 : _b.monitored) || ['default'];
47
56
  }
57
+ /**
58
+ * 获取审计日志存储的数据库连接
59
+ */
48
60
  getAuditConnection() {
49
61
  var _a, _b;
50
62
  return ((_b = (_a = this.config) === null || _a === void 0 ? void 0 : _a.connections) === null || _b === void 0 ? void 0 : _b.audit) || 'default';
@@ -1,6 +1,10 @@
1
1
  import { Repository } from 'typeorm';
2
2
  import { OperationTemplateEntity, EntityTransactionEntity, EntityAuditLogEntity, ManualOperationLogEntity } from '../entities';
3
3
  import { ChangeDetail, TransactionDescription } from '../interfaces';
4
+ /**
5
+ * 操作描述服务
6
+ * 负责根据模板和参数动态生成多语言描述
7
+ */
4
8
  export declare class OperationDescriptionService {
5
9
  private readonly templateRepository;
6
10
  private readonly transactionRepository;
@@ -8,14 +12,69 @@ export declare class OperationDescriptionService {
8
12
  private readonly manualOperationRepository;
9
13
  private templateCache;
10
14
  constructor(templateRepository: Repository<OperationTemplateEntity>, transactionRepository: Repository<EntityTransactionEntity>, auditLogRepository: Repository<EntityAuditLogEntity>, manualOperationRepository: Repository<ManualOperationLogEntity>);
15
+ /**
16
+ * 动态生成操作名称
17
+ * @param templateKey 模板键
18
+ * @param language 语言
19
+ * @returns 操作名称
20
+ */
11
21
  generateOperationName(templateKey: string, language?: string): Promise<string>;
22
+ /**
23
+ * 动态生成操作描述
24
+ * @param templateKey 模板键
25
+ * @param descriptionParams 描述参数
26
+ * @param language 语言
27
+ * @returns 描述文本
28
+ */
12
29
  generateDescription(templateKey: string, descriptionParams: Record<string, any>, language?: string): Promise<string>;
30
+ /**
31
+ * 动态生成变更详情
32
+ * @param changeDetails 变更详情列表
33
+ * @param language 语言
34
+ * @returns 格式化的变更详情
35
+ */
13
36
  generateChangeDetails(changeDetails: ChangeDetail[], language?: string): Promise<any[]>;
37
+ /**
38
+ * 获取事务描述(包含所有变更)
39
+ * @param transactionId 事务ID
40
+ * @param language 语言
41
+ * @returns 事务描述对象
42
+ */
14
43
  getTransactionDescription(transactionId: string, language?: string): Promise<TransactionDescription>;
44
+ /**
45
+ * 批量获取事务描述
46
+ * @param transactionIds 事务ID列表
47
+ * @param language 语言
48
+ * @returns 事务描述映射
49
+ */
15
50
  batchGetTransactionDescriptions(transactionIds: string[], language?: string): Promise<Record<string, TransactionDescription>>;
51
+ /**
52
+ * 填充模板
53
+ * @param template 模板字符串
54
+ * @param params 参数
55
+ * @returns 填充后的字符串
56
+ */
16
57
  private fillTemplate;
58
+ /**
59
+ * 格式化显示值
60
+ * @param value 原始值
61
+ * @param displayValue 显示值
62
+ * @returns 格式化后的值
63
+ */
17
64
  private formatDisplayValue;
65
+ /**
66
+ * 获取操作模板(带缓存)
67
+ * @param templateKey 模板键
68
+ * @returns 操作模板
69
+ */
18
70
  private getOperationTemplate;
71
+ /**
72
+ * 清除模板缓存
73
+ */
19
74
  clearTemplateCache(): void;
75
+ /**
76
+ * 预加载模板到缓存
77
+ * @param templateKeys 模板键列表
78
+ */
20
79
  preloadTemplates(templateKeys: string[]): Promise<void>;
21
80
  }
@@ -26,33 +26,57 @@ const common_1 = require("@nestjs/common");
26
26
  const typeorm_1 = require("@nestjs/typeorm");
27
27
  const typeorm_2 = require("typeorm");
28
28
  const entities_1 = require("../entities");
29
+ /**
30
+ * 操作描述服务
31
+ * 负责根据模板和参数动态生成多语言描述
32
+ */
29
33
  let OperationDescriptionService = class OperationDescriptionService {
30
34
  constructor(templateRepository, transactionRepository, auditLogRepository, manualOperationRepository) {
31
35
  this.templateRepository = templateRepository;
32
36
  this.transactionRepository = transactionRepository;
33
37
  this.auditLogRepository = auditLogRepository;
34
38
  this.manualOperationRepository = manualOperationRepository;
39
+ // 模板缓存
35
40
  this.templateCache = new Map();
36
41
  }
42
+ /**
43
+ * 动态生成操作名称
44
+ * @param templateKey 模板键
45
+ * @param language 语言
46
+ * @returns 操作名称
47
+ */
37
48
  generateOperationName(templateKey_1) {
38
49
  return __awaiter(this, arguments, void 0, function* (templateKey, language = 'zh') {
39
50
  const template = yield this.getOperationTemplate(templateKey);
40
51
  if (!template) {
41
- return templateKey;
52
+ return templateKey; // 如果没有模板,返回模板键
42
53
  }
43
54
  return template.nameTemplates[language] || template.nameTemplates['zh'] || templateKey;
44
55
  });
45
56
  }
57
+ /**
58
+ * 动态生成操作描述
59
+ * @param templateKey 模板键
60
+ * @param descriptionParams 描述参数
61
+ * @param language 语言
62
+ * @returns 描述文本
63
+ */
46
64
  generateDescription(templateKey_1, descriptionParams_1) {
47
65
  return __awaiter(this, arguments, void 0, function* (templateKey, descriptionParams, language = 'zh') {
48
66
  const template = yield this.getOperationTemplate(templateKey);
49
67
  if (!template) {
50
- return templateKey;
68
+ return templateKey; // 如果没有模板,返回模板键
51
69
  }
52
70
  const templateStr = template.descriptionTemplates[language] || template.descriptionTemplates['zh'] || templateKey;
53
71
  return this.fillTemplate(templateStr, descriptionParams);
54
72
  });
55
73
  }
74
+ /**
75
+ * 动态生成变更详情
76
+ * @param changeDetails 变更详情列表
77
+ * @param language 语言
78
+ * @returns 格式化的变更详情
79
+ */
56
80
  generateChangeDetails(changeDetails_1) {
57
81
  return __awaiter(this, arguments, void 0, function* (changeDetails, language = 'zh') {
58
82
  return changeDetails.map((detail) => {
@@ -67,22 +91,32 @@ let OperationDescriptionService = class OperationDescriptionService {
67
91
  });
68
92
  });
69
93
  }
94
+ /**
95
+ * 获取事务描述(包含所有变更)
96
+ * @param transactionId 事务ID
97
+ * @param language 语言
98
+ * @returns 事务描述对象
99
+ */
70
100
  getTransactionDescription(transactionId_1) {
71
101
  return __awaiter(this, arguments, void 0, function* (transactionId, language = 'zh') {
102
+ // 获取事务信息
72
103
  const transaction = yield this.transactionRepository.findOne({
73
104
  where: { id: transactionId },
74
105
  });
75
106
  if (!transaction) {
76
107
  throw new Error(`Transaction ${transactionId} not found`);
77
108
  }
109
+ // 获取事务的审计日志
78
110
  const auditLogs = yield this.auditLogRepository.find({
79
111
  where: { requestId: transactionId },
80
112
  order: { createdAt: 'ASC' },
81
113
  });
114
+ // 获取事务的手动操作记录
82
115
  const manualOperations = yield this.manualOperationRepository.find({
83
116
  where: { transactionId },
84
117
  order: { createdAt: 'ASC' },
85
118
  });
119
+ // 生成操作名称和描述
86
120
  let operationName;
87
121
  let description;
88
122
  if (transaction.operationTemplateKey) {
@@ -90,6 +124,7 @@ let OperationDescriptionService = class OperationDescriptionService {
90
124
  description = yield this.generateDescription(transaction.operationTemplateKey, transaction.descriptionParams || {}, language);
91
125
  }
92
126
  else {
127
+ // 如果没有事务级别的模板,使用第一个变更的模板
93
128
  const firstLog = auditLogs[0];
94
129
  if (firstLog && firstLog.operationTemplateKey) {
95
130
  operationName = yield this.generateOperationName(firstLog.operationTemplateKey, language);
@@ -100,7 +135,9 @@ let OperationDescriptionService = class OperationDescriptionService {
100
135
  description = transaction.description || 'Unknown operation';
101
136
  }
102
137
  }
138
+ // 生成变更详情
103
139
  const changes = [];
140
+ // 添加实体变更
104
141
  for (const log of auditLogs) {
105
142
  const changeDescription = log.operationTemplateKey
106
143
  ? yield this.generateDescription(log.operationTemplateKey, log.descriptionParams || {}, language)
@@ -117,6 +154,7 @@ let OperationDescriptionService = class OperationDescriptionService {
117
154
  createdAt: log.createdAt,
118
155
  });
119
156
  }
157
+ // 添加手动操作
120
158
  for (const manualOp of manualOperations) {
121
159
  const opName = yield this.generateOperationName(manualOp.operationTemplateKey, language);
122
160
  const opDescription = yield this.generateDescription(manualOp.operationTemplateKey, manualOp.descriptionParams, language);
@@ -127,6 +165,7 @@ let OperationDescriptionService = class OperationDescriptionService {
127
165
  createdAt: manualOp.createdAt,
128
166
  });
129
167
  }
168
+ // 按时间排序
130
169
  changes.sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime());
131
170
  return {
132
171
  operationName,
@@ -135,6 +174,12 @@ let OperationDescriptionService = class OperationDescriptionService {
135
174
  };
136
175
  });
137
176
  }
177
+ /**
178
+ * 批量获取事务描述
179
+ * @param transactionIds 事务ID列表
180
+ * @param language 语言
181
+ * @returns 事务描述映射
182
+ */
138
183
  batchGetTransactionDescriptions(transactionIds_1) {
139
184
  return __awaiter(this, arguments, void 0, function* (transactionIds, language = 'zh') {
140
185
  const results = {};
@@ -143,16 +188,24 @@ let OperationDescriptionService = class OperationDescriptionService {
143
188
  results[transactionId] = yield this.getTransactionDescription(transactionId, language);
144
189
  }
145
190
  catch (error) {
191
+ // 忽略错误,继续处理其他事务
146
192
  console.error(`Failed to get description for transaction ${transactionId}:`, error);
147
193
  }
148
194
  }
149
195
  return results;
150
196
  });
151
197
  }
198
+ /**
199
+ * 填充模板
200
+ * @param template 模板字符串
201
+ * @param params 参数
202
+ * @returns 填充后的字符串
203
+ */
152
204
  fillTemplate(template, params) {
153
205
  if (!template)
154
206
  return '';
155
207
  let result = template;
208
+ // 替换参数 {key} -> value
156
209
  for (const [key, value] of Object.entries(params || {})) {
157
210
  const placeholder = `{${key}}`;
158
211
  if (result.includes(placeholder)) {
@@ -161,6 +214,12 @@ let OperationDescriptionService = class OperationDescriptionService {
161
214
  }
162
215
  return result;
163
216
  }
217
+ /**
218
+ * 格式化显示值
219
+ * @param value 原始值
220
+ * @param displayValue 显示值
221
+ * @returns 格式化后的值
222
+ */
164
223
  formatDisplayValue(value, displayValue) {
165
224
  if (displayValue !== undefined) {
166
225
  return displayValue;
@@ -170,23 +229,38 @@ let OperationDescriptionService = class OperationDescriptionService {
170
229
  }
171
230
  return String(value);
172
231
  }
232
+ /**
233
+ * 获取操作模板(带缓存)
234
+ * @param templateKey 模板键
235
+ * @returns 操作模板
236
+ */
173
237
  getOperationTemplate(templateKey) {
174
238
  return __awaiter(this, void 0, void 0, function* () {
239
+ // 检查缓存
175
240
  if (this.templateCache.has(templateKey)) {
176
241
  return this.templateCache.get(templateKey);
177
242
  }
243
+ // 从数据库查询
178
244
  const template = yield this.templateRepository.findOne({
179
245
  where: { key: templateKey },
180
246
  });
181
247
  if (template) {
248
+ // 缓存模板
182
249
  this.templateCache.set(templateKey, template);
183
250
  }
184
251
  return template;
185
252
  });
186
253
  }
254
+ /**
255
+ * 清除模板缓存
256
+ */
187
257
  clearTemplateCache() {
188
258
  this.templateCache.clear();
189
259
  }
260
+ /**
261
+ * 预加载模板到缓存
262
+ * @param templateKeys 模板键列表
263
+ */
190
264
  preloadTemplates(templateKeys) {
191
265
  return __awaiter(this, void 0, void 0, function* () {
192
266
  const templates = yield this.templateRepository
@@ -4,19 +4,49 @@ import { AuditOperation } from '../enums';
4
4
  import { AuditContextService } from './audit-context.service';
5
5
  import { EntityAuditService } from './entity-audit.service';
6
6
  import { MultiDatabaseService } from './multi-database.service';
7
+ /**
8
+ * 事务审计服务
9
+ */
7
10
  export declare class TransactionAuditService {
8
11
  private readonly transactionRepository;
9
12
  private readonly contextService;
10
13
  private readonly auditService;
11
14
  private readonly multiDbService;
12
15
  constructor(transactionRepository: Repository<EntityTransactionEntity>, contextService: AuditContextService, auditService: EntityAuditService, multiDbService: MultiDatabaseService);
16
+ /**
17
+ * 开始事务
18
+ */
13
19
  beginTransaction(description: string): Promise<string>;
20
+ /**
21
+ * 提交事务
22
+ */
14
23
  commitTransaction(transactionId: string): Promise<void>;
24
+ /**
25
+ * 回滚事务(支持多数据库)
26
+ */
15
27
  rollbackTransaction(transactionId: string): Promise<void>;
28
+ /**
29
+ * 添加实体到事务
30
+ */
16
31
  addEntityToTransaction(transactionId: string, entityType: string, entityId: string, operation: AuditOperation): Promise<void>;
32
+ /**
33
+ * 执行回滚(支持多数据库)
34
+ */
17
35
  private performRollback;
36
+ /**
37
+ * 按数据库连接分组实体
38
+ */
18
39
  private groupEntitiesByConnection;
40
+ /**
41
+ * 在指定连接中回滚实体
42
+ */
19
43
  private rollbackEntitiesInConnection;
44
+ /**
45
+ * 回滚单个实体
46
+ */
20
47
  private rollbackSingleEntity;
48
+ /**
49
+ * 获取最新的审计日志
50
+ */
21
51
  private getLatestAuditLog;
22
52
  }