@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
@@ -0,0 +1,99 @@
1
+ import { Logger } from '@nestjs/common';
2
+ import { Repository, EntityManager } from 'typeorm';
3
+ import { TransactionManager, Propagation, IsolationLevel, TransactionStatus } from './transaction-manager';
4
+ /**
5
+ * 事务感知的基础服务类
6
+ * 提供统一的数据操作接口,自动处理事务
7
+ */
8
+ export declare abstract class BaseService {
9
+ protected readonly transactionManager: TransactionManager;
10
+ protected readonly defaultDataSourceName: string;
11
+ protected readonly logger: Logger;
12
+ constructor(transactionManager: TransactionManager, defaultDataSourceName?: string);
13
+ /**
14
+ * 获取指定数据源的 EntityManager
15
+ */
16
+ protected getEntityManager(dataSourceName?: string): EntityManager;
17
+ /**
18
+ * 手动在事务中执行
19
+ */
20
+ protected executeInTransaction<T>(callback: (em: EntityManager) => Promise<T>, options?: {
21
+ propagation?: Propagation;
22
+ readOnly?: boolean;
23
+ isolation?: IsolationLevel;
24
+ dataSource?: string;
25
+ }): Promise<T>;
26
+ /**
27
+ * 保存实体
28
+ */
29
+ protected save<T>(entity: T, dataSourceName?: string): Promise<T>;
30
+ /**
31
+ * 批量保存实体
32
+ */
33
+ protected saveMany<T>(entities: T[], dataSourceName?: string): Promise<T[]>;
34
+ /**
35
+ * 更新实体
36
+ */
37
+ protected update<T>(entityClass: any, criteria: any, partialEntity: Partial<T>, dataSourceName?: string): Promise<void>;
38
+ /**
39
+ * 删除实体
40
+ */
41
+ protected remove<T>(entity: T, dataSourceName?: string): Promise<T>;
42
+ /**
43
+ * 根据 ID 删除实体
44
+ */
45
+ protected delete<T>(entityClass: any, id: string | number | (string | number)[], dataSourceName?: string): Promise<void>;
46
+ /**
47
+ * 查找实体
48
+ */
49
+ protected find<T>(entityClass: any, options?: any, dataSourceName?: string): Promise<T[]>;
50
+ /**
51
+ * 查找一个实体
52
+ */
53
+ protected findOne<T>(entityClass: any, options?: any, dataSourceName?: string): Promise<T | null>;
54
+ /**
55
+ * 根据 ID 查找实体
56
+ */
57
+ protected findById<T>(entityClass: any, id: string | number, dataSourceName?: string): Promise<T | null>;
58
+ /**
59
+ * 计数
60
+ */
61
+ protected count<T>(entityClass: any, options?: any, dataSourceName?: string): Promise<number>;
62
+ /**
63
+ * 执行原生 SQL
64
+ */
65
+ protected query<T = any>(query: string, parameters?: any[], dataSourceName?: string): Promise<T[]>;
66
+ /**
67
+ * 创建 Query Builder
68
+ */
69
+ protected createQueryBuilder<T>(entityClass: any, alias?: string, dataSourceName?: string): Promise<import("typeorm").SelectQueryBuilder<import("typeorm").ObjectLiteral>>;
70
+ /**
71
+ * 获取 Repository
72
+ */
73
+ protected getRepository<T>(entity: any, dataSourceName?: string): Promise<Repository<T>>;
74
+ /**
75
+ * 执行跨数据源操作
76
+ */
77
+ protected executeAcrossDataSources<T>(operations: Array<{
78
+ dataSourceName: string;
79
+ operation: (em: EntityManager) => Promise<any>;
80
+ }>, options?: {
81
+ rollbackOnError?: boolean;
82
+ }): Promise<T[]>;
83
+ /**
84
+ * 批量操作优化
85
+ */
86
+ protected batchOperation<T, R>(items: T[], batchSize: number, operation: (batch: T[], em: EntityManager) => Promise<R[]>, options?: {
87
+ continueOnError?: boolean;
88
+ isolation?: IsolationLevel;
89
+ dataSourceName?: string;
90
+ }): Promise<R[]>;
91
+ /**
92
+ * 检查是否在事务中
93
+ */
94
+ protected isInTransaction(dataSourceName?: string): boolean;
95
+ /**
96
+ * 获取当前事务状态
97
+ */
98
+ protected getCurrentTransactionStatus(dataSourceName?: string): TransactionStatus;
99
+ }
@@ -0,0 +1,286 @@
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
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ var BaseService_1;
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.BaseService = void 0;
26
+ const common_1 = require("@nestjs/common");
27
+ const transaction_manager_1 = require("./transaction-manager");
28
+ /**
29
+ * 事务感知的基础服务类
30
+ * 提供统一的数据操作接口,自动处理事务
31
+ */
32
+ let BaseService = BaseService_1 = class BaseService {
33
+ constructor(transactionManager, defaultDataSourceName = 'default') {
34
+ this.transactionManager = transactionManager;
35
+ this.defaultDataSourceName = defaultDataSourceName;
36
+ this.logger = new common_1.Logger(BaseService_1.name);
37
+ }
38
+ /**
39
+ * 获取指定数据源的 EntityManager
40
+ */
41
+ getEntityManager(dataSourceName) {
42
+ const dsName = dataSourceName || this.defaultDataSourceName;
43
+ const em = this.transactionManager.getCurrentEntityManager(dsName);
44
+ if (!em) {
45
+ throw new Error(`No active transaction for dataSource: ${dsName}. ` +
46
+ `Use @Transactional decorator to start a transaction.`);
47
+ }
48
+ return em;
49
+ }
50
+ /**
51
+ * 手动在事务中执行
52
+ */
53
+ executeInTransaction(callback, options) {
54
+ return __awaiter(this, void 0, void 0, function* () {
55
+ const status = yield this.transactionManager.getTransaction({
56
+ propagation: (options === null || options === void 0 ? void 0 : options.propagation) || transaction_manager_1.Propagation.REQUIRED,
57
+ readOnly: (options === null || options === void 0 ? void 0 : options.readOnly) || false,
58
+ isolationLevel: options === null || options === void 0 ? void 0 : options.isolation,
59
+ dataSourceName: (options === null || options === void 0 ? void 0 : options.dataSource) || this.defaultDataSourceName,
60
+ name: `executeInTransaction-${this.constructor.name}`,
61
+ });
62
+ try {
63
+ const em = this.getEntityManager(options === null || options === void 0 ? void 0 : options.dataSource);
64
+ const result = yield callback(em);
65
+ yield this.transactionManager.commit(status);
66
+ return result;
67
+ }
68
+ catch (error) {
69
+ yield this.transactionManager.rollback(status);
70
+ throw error;
71
+ }
72
+ });
73
+ }
74
+ /**
75
+ * 保存实体
76
+ */
77
+ save(entity, dataSourceName) {
78
+ return __awaiter(this, void 0, void 0, function* () {
79
+ const em = this.getEntityManager(dataSourceName);
80
+ return em.save(entity);
81
+ });
82
+ }
83
+ /**
84
+ * 批量保存实体
85
+ */
86
+ saveMany(entities, dataSourceName) {
87
+ return __awaiter(this, void 0, void 0, function* () {
88
+ const em = this.getEntityManager(dataSourceName);
89
+ return em.save(entities);
90
+ });
91
+ }
92
+ /**
93
+ * 更新实体
94
+ */
95
+ update(entityClass, criteria, partialEntity, dataSourceName) {
96
+ return __awaiter(this, void 0, void 0, function* () {
97
+ const em = this.getEntityManager(dataSourceName);
98
+ yield em.update(entityClass, criteria, partialEntity);
99
+ });
100
+ }
101
+ /**
102
+ * 删除实体
103
+ */
104
+ remove(entity, dataSourceName) {
105
+ return __awaiter(this, void 0, void 0, function* () {
106
+ const em = this.getEntityManager(dataSourceName);
107
+ return em.remove(entity);
108
+ });
109
+ }
110
+ /**
111
+ * 根据 ID 删除实体
112
+ */
113
+ delete(entityClass, id, dataSourceName) {
114
+ return __awaiter(this, void 0, void 0, function* () {
115
+ const em = this.getEntityManager(dataSourceName);
116
+ yield em.delete(entityClass, id);
117
+ });
118
+ }
119
+ /**
120
+ * 查找实体
121
+ */
122
+ find(entityClass, options, dataSourceName) {
123
+ return __awaiter(this, void 0, void 0, function* () {
124
+ const em = this.getEntityManager(dataSourceName);
125
+ return em.find(entityClass, options);
126
+ });
127
+ }
128
+ /**
129
+ * 查找一个实体
130
+ */
131
+ findOne(entityClass, options, dataSourceName) {
132
+ return __awaiter(this, void 0, void 0, function* () {
133
+ const em = this.getEntityManager(dataSourceName);
134
+ return em.findOne(entityClass, options);
135
+ });
136
+ }
137
+ /**
138
+ * 根据 ID 查找实体
139
+ */
140
+ findById(entityClass, id, dataSourceName) {
141
+ return __awaiter(this, void 0, void 0, function* () {
142
+ const em = this.getEntityManager(dataSourceName);
143
+ return em.findOne(entityClass, {
144
+ where: { id },
145
+ });
146
+ });
147
+ }
148
+ /**
149
+ * 计数
150
+ */
151
+ count(entityClass, options, dataSourceName) {
152
+ return __awaiter(this, void 0, void 0, function* () {
153
+ const em = this.getEntityManager(dataSourceName);
154
+ return em.count(entityClass, options);
155
+ });
156
+ }
157
+ /**
158
+ * 执行原生 SQL
159
+ */
160
+ query(query, parameters, dataSourceName) {
161
+ return __awaiter(this, void 0, void 0, function* () {
162
+ const em = this.getEntityManager(dataSourceName);
163
+ return em.query(query, parameters);
164
+ });
165
+ }
166
+ /**
167
+ * 创建 Query Builder
168
+ */
169
+ createQueryBuilder(entityClass, alias, dataSourceName) {
170
+ return __awaiter(this, void 0, void 0, function* () {
171
+ const em = this.getEntityManager(dataSourceName);
172
+ return em.createQueryBuilder(entityClass, alias || entityClass.name.toLowerCase());
173
+ });
174
+ }
175
+ /**
176
+ * 获取 Repository
177
+ */
178
+ getRepository(entity, dataSourceName) {
179
+ return __awaiter(this, void 0, void 0, function* () {
180
+ const em = this.getEntityManager(dataSourceName);
181
+ return em.getRepository(entity);
182
+ });
183
+ }
184
+ /**
185
+ * 执行跨数据源操作
186
+ */
187
+ executeAcrossDataSources(operations, options) {
188
+ return __awaiter(this, void 0, void 0, function* () {
189
+ const results = [];
190
+ const startedTransactions = [];
191
+ try {
192
+ // 在每个数据源上开始事务
193
+ for (const op of operations) {
194
+ const status = yield this.transactionManager.getTransaction({
195
+ propagation: transaction_manager_1.Propagation.REQUIRED,
196
+ dataSourceName: op.dataSourceName,
197
+ });
198
+ startedTransactions.push(status);
199
+ }
200
+ // 执行所有操作
201
+ for (const op of operations) {
202
+ const em = this.getEntityManager(op.dataSourceName);
203
+ const result = yield op.operation(em);
204
+ results.push(result);
205
+ }
206
+ // 提交所有事务
207
+ for (const status of startedTransactions) {
208
+ yield this.transactionManager.commit(status);
209
+ }
210
+ return results;
211
+ }
212
+ catch (error) {
213
+ // 回滚所有事务
214
+ if ((options === null || options === void 0 ? void 0 : options.rollbackOnError) !== false) {
215
+ for (const status of startedTransactions.reverse()) {
216
+ try {
217
+ yield this.transactionManager.rollback(status);
218
+ }
219
+ catch (rollbackError) {
220
+ this.logger.error(`Failed to rollback transaction on ${status.dataSourceName}:`, rollbackError);
221
+ }
222
+ }
223
+ }
224
+ throw error;
225
+ }
226
+ });
227
+ }
228
+ /**
229
+ * 批量操作优化
230
+ */
231
+ batchOperation(items, batchSize, operation, options) {
232
+ return __awaiter(this, void 0, void 0, function* () {
233
+ const allResults = [];
234
+ let processedCount = 0;
235
+ return yield this.executeInTransaction((em) => __awaiter(this, void 0, void 0, function* () {
236
+ for (let i = 0; i < items.length; i += batchSize) {
237
+ const batch = items.slice(i, i + batchSize);
238
+ const batchNumber = Math.floor(i / batchSize) + 1;
239
+ try {
240
+ this.logger.log(`Processing batch ${batchNumber}/${Math.ceil(items.length / batchSize)}`);
241
+ const results = yield operation(batch, em);
242
+ allResults.push(...results);
243
+ processedCount += batch.length;
244
+ }
245
+ catch (error) {
246
+ this.logger.error(`Batch ${batchNumber} failed:`, error);
247
+ if (options === null || options === void 0 ? void 0 : options.continueOnError) {
248
+ // 记录失败但继续
249
+ processedCount += batch.length;
250
+ continue;
251
+ }
252
+ else {
253
+ throw new Error(`Batch operation failed at batch ${batchNumber}. Processed ${processedCount}/${items.length} items.`);
254
+ }
255
+ }
256
+ }
257
+ return allResults;
258
+ }), {
259
+ isolation: options === null || options === void 0 ? void 0 : options.isolation,
260
+ dataSource: options === null || options === void 0 ? void 0 : options.dataSourceName,
261
+ });
262
+ });
263
+ }
264
+ /**
265
+ * 检查是否在事务中
266
+ */
267
+ isInTransaction(dataSourceName) {
268
+ const dsName = dataSourceName || this.defaultDataSourceName;
269
+ const status = this.transactionManager.getCurrentTransaction(dsName);
270
+ return status !== null && !status.isCompleted;
271
+ }
272
+ /**
273
+ * 获取当前事务状态
274
+ */
275
+ getCurrentTransactionStatus(dataSourceName) {
276
+ const dsName = dataSourceName || this.defaultDataSourceName;
277
+ return this.transactionManager.getCurrentTransaction(dsName);
278
+ }
279
+ };
280
+ exports.BaseService = BaseService;
281
+ exports.BaseService = BaseService = BaseService_1 = __decorate([
282
+ (0, common_1.Injectable)(),
283
+ __param(1, (0, common_1.Optional)()),
284
+ __param(1, (0, common_1.Inject)('DEFAULT_DATA_SOURCE_NAME')),
285
+ __metadata("design:paramtypes", [transaction_manager_1.TransactionManager, String])
286
+ ], BaseService);
@@ -0,0 +1,55 @@
1
+ import { EntityManager } from 'typeorm';
2
+ import { TransactionContextService } from './transaction-context.service';
3
+ /**
4
+ * CLS (Continuation Local Storage) 兼容服务
5
+ * 提供与 nestjs-cls 兼容的 API,但底层使用事务上下文服务
6
+ */
7
+ export declare class ClsCompatibilityService {
8
+ private readonly transactionContext;
9
+ private readonly defaultDataSource?;
10
+ private readonly store;
11
+ constructor(transactionContext: TransactionContextService, defaultDataSource?: string);
12
+ /**
13
+ * 设置值到存储中
14
+ */
15
+ set<T>(key: string, value: T): void;
16
+ /**
17
+ * 从存储中获取值
18
+ */
19
+ get<T>(key: string): T | undefined;
20
+ /**
21
+ * 根据数据源名称获取 EntityManager
22
+ */
23
+ getEntityManager(dataSourceName?: string): EntityManager | null;
24
+ /**
25
+ * 设置指定数据源的 EntityManager
26
+ */
27
+ setEntityManager(dataSourceName: string, entityManager: EntityManager): void;
28
+ /**
29
+ * 检查是否在事务中
30
+ */
31
+ isInTransaction(dataSourceName?: string): boolean;
32
+ /**
33
+ * 获取所有活跃的事务上下文
34
+ */
35
+ getActiveTransactions(): Map<string, {
36
+ entityManager: EntityManager;
37
+ dataSource: any;
38
+ }>;
39
+ /**
40
+ * 清理存储
41
+ */
42
+ clear(): void;
43
+ }
44
+ /**
45
+ * CLS 服务管理器(静态类,模拟 nestjs-cls 的 API)
46
+ */
47
+ export declare class ClsServiceManager {
48
+ private static clsService;
49
+ static setClsService(clsService: ClsCompatibilityService): void;
50
+ static getClsService(): ClsCompatibilityService;
51
+ }
52
+ /**
53
+ * CLS 装饰器(兼容性)
54
+ */
55
+ export declare function SetCls(key?: string): (target: any, propertyKey: string | symbol, parameterIndex: number) => void;
@@ -0,0 +1,127 @@
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
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.ClsServiceManager = exports.ClsCompatibilityService = void 0;
16
+ exports.SetCls = SetCls;
17
+ const common_1 = require("@nestjs/common");
18
+ const transaction_context_service_1 = require("./transaction-context.service");
19
+ /**
20
+ * CLS (Continuation Local Storage) 兼容服务
21
+ * 提供与 nestjs-cls 兼容的 API,但底层使用事务上下文服务
22
+ */
23
+ let ClsCompatibilityService = class ClsCompatibilityService {
24
+ constructor(transactionContext, defaultDataSource) {
25
+ this.transactionContext = transactionContext;
26
+ this.defaultDataSource = defaultDataSource;
27
+ this.store = new Map();
28
+ }
29
+ /**
30
+ * 设置值到存储中
31
+ */
32
+ set(key, value) {
33
+ if (key === 'entityManager') {
34
+ // 如果设置 entityManager,则根据数据源名称设置到事务上下文
35
+ const dataSourceName = this.defaultDataSource || 'default';
36
+ this.transactionContext.setContext(dataSourceName, value);
37
+ }
38
+ else {
39
+ this.store.set(key, value);
40
+ }
41
+ }
42
+ /**
43
+ * 从存储中获取值
44
+ */
45
+ get(key) {
46
+ if (key === 'entityManager') {
47
+ // 获取默认数据源的 EntityManager
48
+ const dataSourceName = this.defaultDataSource || 'default';
49
+ return this.transactionContext.getEntityManager(dataSourceName);
50
+ }
51
+ else {
52
+ return this.store.get(key);
53
+ }
54
+ }
55
+ /**
56
+ * 根据数据源名称获取 EntityManager
57
+ */
58
+ getEntityManager(dataSourceName) {
59
+ return this.transactionContext.getEntityManager(dataSourceName || this.defaultDataSource || 'default');
60
+ }
61
+ /**
62
+ * 设置指定数据源的 EntityManager
63
+ */
64
+ setEntityManager(dataSourceName, entityManager) {
65
+ this.transactionContext.setContext(dataSourceName, entityManager);
66
+ }
67
+ /**
68
+ * 检查是否在事务中
69
+ */
70
+ isInTransaction(dataSourceName) {
71
+ return this.transactionContext.isInTransaction(dataSourceName || this.defaultDataSource || 'default');
72
+ }
73
+ /**
74
+ * 获取所有活跃的事务上下文
75
+ */
76
+ getActiveTransactions() {
77
+ const contexts = this.transactionContext.getAllActiveContexts();
78
+ const result = new Map();
79
+ for (const [name, context] of contexts) {
80
+ result.set(name, {
81
+ entityManager: context.entityManager,
82
+ dataSource: context.dataSource,
83
+ });
84
+ }
85
+ return result;
86
+ }
87
+ /**
88
+ * 清理存储
89
+ */
90
+ clear() {
91
+ this.store.clear();
92
+ this.transactionContext.clearContext();
93
+ }
94
+ };
95
+ exports.ClsCompatibilityService = ClsCompatibilityService;
96
+ exports.ClsCompatibilityService = ClsCompatibilityService = __decorate([
97
+ (0, common_1.Injectable)({ scope: common_1.Scope.REQUEST }),
98
+ __param(1, (0, common_1.Optional)()),
99
+ __param(1, (0, common_1.Inject)('CLS_DEFAULT_DATA_SOURCE')),
100
+ __metadata("design:paramtypes", [transaction_context_service_1.TransactionContextService, String])
101
+ ], ClsCompatibilityService);
102
+ /**
103
+ * CLS 服务管理器(静态类,模拟 nestjs-cls 的 API)
104
+ */
105
+ class ClsServiceManager {
106
+ static setClsService(clsService) {
107
+ ClsServiceManager.clsService = clsService;
108
+ }
109
+ static getClsService() {
110
+ if (!ClsServiceManager.clsService) {
111
+ throw new Error('CLS service not initialized. Please ensure TransactionModule is imported.');
112
+ }
113
+ return ClsServiceManager.clsService;
114
+ }
115
+ }
116
+ exports.ClsServiceManager = ClsServiceManager;
117
+ ClsServiceManager.clsService = null;
118
+ /**
119
+ * CLS 装饰器(兼容性)
120
+ */
121
+ function SetCls(key) {
122
+ return function (target, propertyKey, parameterIndex) {
123
+ const existing = Reflect.getMetadata('cls_params', target) || {};
124
+ existing[parameterIndex] = { key };
125
+ Reflect.defineMetadata('cls_params', existing, target);
126
+ };
127
+ }
@@ -0,0 +1,91 @@
1
+ import { OnModuleInit, OnModuleDestroy } from '@nestjs/common';
2
+ import { DataSource, DataSourceOptions } from 'typeorm';
3
+ /**
4
+ * 数据源注册表配置
5
+ */
6
+ export interface DataSourceRegistryConfig {
7
+ enableHealthCheck?: boolean;
8
+ healthCheckInterval?: number;
9
+ connectionTimeout?: number;
10
+ maxReconnectAttempts?: number;
11
+ logLifecycleEvents?: boolean;
12
+ autoCleanup?: boolean;
13
+ }
14
+ /**
15
+ * 数据源健康状态
16
+ */
17
+ export interface DataSourceHealthStatus {
18
+ name: string;
19
+ isConnected: boolean;
20
+ lastChecked: Date;
21
+ error?: string;
22
+ responseTime?: number;
23
+ }
24
+ /**
25
+ * 数据源注册表管理器
26
+ * 负责管理所有动态注册的数据源
27
+ */
28
+ export declare class DataSourceRegistryService implements OnModuleInit, OnModuleDestroy {
29
+ private readonly logger;
30
+ private healthCheckInterval;
31
+ private healthStatuses;
32
+ private config;
33
+ constructor(config?: DataSourceRegistryConfig);
34
+ onModuleInit(): Promise<void>;
35
+ onModuleDestroy(): Promise<void>;
36
+ /**
37
+ * 注册新的数据源
38
+ */
39
+ registerDataSource(name: string, options: DataSourceOptions, metadata?: Record<string, any>): Promise<DataSource>;
40
+ /**
41
+ * 注册已存在的数据源
42
+ */
43
+ registerExistingDataSource(name: string, dataSource: DataSource, metadata?: Record<string, any>): Promise<void>;
44
+ /**
45
+ * 注销数据源
46
+ */
47
+ unregisterDataSource(name: string): Promise<void>;
48
+ /**
49
+ * 获取数据源
50
+ */
51
+ getDataSource(name: string): DataSource | null;
52
+ /**
53
+ * 获取所有已注册的数据源名称
54
+ */
55
+ getRegisteredDataSources(): string[];
56
+ /**
57
+ * 批量注册数据源
58
+ */
59
+ registerDataSources(configs: Array<{
60
+ name: string;
61
+ options: DataSourceOptions;
62
+ metadata?: Record<string, any>;
63
+ }>, options?: {
64
+ continueOnError?: boolean;
65
+ parallel?: boolean;
66
+ }): Promise<DataSource[]>;
67
+ /**
68
+ * 测试数据源连接
69
+ */
70
+ testConnection(name: string): Promise<boolean>;
71
+ /**
72
+ * 获取所有数据源的健康状态
73
+ */
74
+ getHealthStatuses(): Map<string, DataSourceHealthStatus>;
75
+ /**
76
+ * 重新连接数据源
77
+ */
78
+ reconnectDataSource(name: string): Promise<boolean>;
79
+ /**
80
+ * 开始健康检查
81
+ */
82
+ private startHealthCheck;
83
+ /**
84
+ * 清理指定数据源
85
+ */
86
+ private cleanupDataSources;
87
+ /**
88
+ * 清理所有动态数据源
89
+ */
90
+ private cleanupAllDataSources;
91
+ }