@nest-omni/core 4.1.3-14 → 4.1.3-15

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.
@@ -69,7 +69,7 @@ export declare function FQDNFieldOptional(options?: Omit<ApiPropertyOptions, 'ty
69
69
  export declare function DateField(options?: Omit<ApiPropertyOptions, 'type'> & IDateFieldOptions): PropertyDecorator;
70
70
  export declare function DateFieldOptional(options?: Omit<ApiPropertyOptions, 'type' | 'required'> & IDateFieldOptions): PropertyDecorator;
71
71
  export declare function IpFieldOptional(options?: Omit<ApiPropertyOptions, 'type'> & IIPFieldOptions & IStringFieldOptions): PropertyDecorator;
72
- export declare function IpField(options: Omit<ApiPropertyOptions, 'type'> & IStringFieldOptions & IIPFieldOptions): PropertyDecorator;
72
+ export declare function IpField(options?: Omit<ApiPropertyOptions, 'type'> & IStringFieldOptions & IIPFieldOptions): PropertyDecorator;
73
73
  export declare function ObjectField(options?: Omit<ApiPropertyOptions, 'type'> & IFieldOptions): PropertyDecorator;
74
74
  export declare function ObjectFieldOptional(options?: Omit<ApiPropertyOptions, 'type'> & IFieldOptions): PropertyDecorator;
75
75
  export declare function TimeZoneField(options?: Omit<ApiPropertyOptions, 'type'> & IStringFieldOptions): PropertyDecorator;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nest-omni/core",
3
- "version": "4.1.3-14",
3
+ "version": "4.1.3-15",
4
4
  "description": "A comprehensive NestJS framework for building enterprise-grade applications with best practices",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -4,12 +4,19 @@ import { TransactionManager, Propagation, IsolationLevel, TransactionStatus } fr
4
4
  /**
5
5
  * 事务感知的基础服务类
6
6
  * 提供统一的数据操作接口,自动处理事务
7
+ *
8
+ * 注意:TransactionManager 现在是可选的,@Transactional 装饰器会自动使用全局 TransactionManager
7
9
  */
8
10
  export declare abstract class BaseService {
9
- protected readonly transactionManager: TransactionManager;
11
+ protected readonly transactionManager?: TransactionManager;
10
12
  protected readonly defaultDataSourceName: string;
11
13
  protected readonly logger: Logger;
12
- constructor(transactionManager: TransactionManager, defaultDataSourceName?: string);
14
+ constructor(transactionManager?: TransactionManager, defaultDataSourceName?: string);
15
+ /**
16
+ * 获取事务管理器实例
17
+ * 优先使用注入的实例,其次使用全局持有者
18
+ */
19
+ protected getTransactionManager(): TransactionManager | undefined;
13
20
  /**
14
21
  * 获取指定数据源的 EntityManager
15
22
  */
@@ -25,9 +25,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
25
25
  exports.BaseService = void 0;
26
26
  const common_1 = require("@nestjs/common");
27
27
  const transaction_manager_1 = require("./transaction-manager");
28
+ const transaction_manager_holder_1 = require("./transaction-manager.holder");
28
29
  /**
29
30
  * 事务感知的基础服务类
30
31
  * 提供统一的数据操作接口,自动处理事务
32
+ *
33
+ * 注意:TransactionManager 现在是可选的,@Transactional 装饰器会自动使用全局 TransactionManager
31
34
  */
32
35
  let BaseService = BaseService_1 = class BaseService {
33
36
  constructor(transactionManager, defaultDataSourceName = 'default') {
@@ -35,12 +38,23 @@ let BaseService = BaseService_1 = class BaseService {
35
38
  this.defaultDataSourceName = defaultDataSourceName;
36
39
  this.logger = new common_1.Logger(BaseService_1.name);
37
40
  }
41
+ /**
42
+ * 获取事务管理器实例
43
+ * 优先使用注入的实例,其次使用全局持有者
44
+ */
45
+ getTransactionManager() {
46
+ return this.transactionManager || transaction_manager_holder_1.TransactionManagerHolder.getManager();
47
+ }
38
48
  /**
39
49
  * 获取指定数据源的 EntityManager
40
50
  */
41
51
  getEntityManager(dataSourceName) {
52
+ const tm = this.getTransactionManager();
53
+ if (!tm) {
54
+ throw new Error('TransactionManager not available. Make sure TransactionModule is imported.');
55
+ }
42
56
  const dsName = dataSourceName || this.defaultDataSourceName;
43
- const em = this.transactionManager.getCurrentEntityManager(dsName);
57
+ const em = tm.getCurrentEntityManager(dsName);
44
58
  if (!em) {
45
59
  throw new Error(`No active transaction for dataSource: ${dsName}. ` +
46
60
  `Use @Transactional decorator to start a transaction.`);
@@ -52,7 +66,11 @@ let BaseService = BaseService_1 = class BaseService {
52
66
  */
53
67
  executeInTransaction(callback, options) {
54
68
  return __awaiter(this, void 0, void 0, function* () {
55
- const status = yield this.transactionManager.getTransaction({
69
+ const tm = this.getTransactionManager();
70
+ if (!tm) {
71
+ throw new Error('TransactionManager not available. Make sure TransactionModule is imported.');
72
+ }
73
+ const status = yield tm.getTransaction({
56
74
  propagation: (options === null || options === void 0 ? void 0 : options.propagation) || transaction_manager_1.Propagation.REQUIRED,
57
75
  readOnly: (options === null || options === void 0 ? void 0 : options.readOnly) || false,
58
76
  isolationLevel: options === null || options === void 0 ? void 0 : options.isolation,
@@ -62,11 +80,11 @@ let BaseService = BaseService_1 = class BaseService {
62
80
  try {
63
81
  const em = this.getEntityManager(options === null || options === void 0 ? void 0 : options.dataSource);
64
82
  const result = yield callback(em);
65
- yield this.transactionManager.commit(status);
83
+ yield tm.commit(status);
66
84
  return result;
67
85
  }
68
86
  catch (error) {
69
- yield this.transactionManager.rollback(status);
87
+ yield tm.rollback(status);
70
88
  throw error;
71
89
  }
72
90
  });
@@ -186,12 +204,16 @@ let BaseService = BaseService_1 = class BaseService {
186
204
  */
187
205
  executeAcrossDataSources(operations, options) {
188
206
  return __awaiter(this, void 0, void 0, function* () {
207
+ const tm = this.getTransactionManager();
208
+ if (!tm) {
209
+ throw new Error('TransactionManager not available. Make sure TransactionModule is imported.');
210
+ }
189
211
  const results = [];
190
212
  const startedTransactions = [];
191
213
  try {
192
214
  // 在每个数据源上开始事务
193
215
  for (const op of operations) {
194
- const status = yield this.transactionManager.getTransaction({
216
+ const status = yield tm.getTransaction({
195
217
  propagation: transaction_manager_1.Propagation.REQUIRED,
196
218
  dataSourceName: op.dataSourceName,
197
219
  });
@@ -205,7 +227,7 @@ let BaseService = BaseService_1 = class BaseService {
205
227
  }
206
228
  // 提交所有事务
207
229
  for (const status of startedTransactions) {
208
- yield this.transactionManager.commit(status);
230
+ yield tm.commit(status);
209
231
  }
210
232
  return results;
211
233
  }
@@ -214,7 +236,7 @@ let BaseService = BaseService_1 = class BaseService {
214
236
  if ((options === null || options === void 0 ? void 0 : options.rollbackOnError) !== false) {
215
237
  for (const status of startedTransactions.reverse()) {
216
238
  try {
217
- yield this.transactionManager.rollback(status);
239
+ yield tm.rollback(status);
218
240
  }
219
241
  catch (rollbackError) {
220
242
  this.logger.error(`Failed to rollback transaction on ${status.dataSourceName}:`, rollbackError);
@@ -265,21 +287,30 @@ let BaseService = BaseService_1 = class BaseService {
265
287
  * 检查是否在事务中
266
288
  */
267
289
  isInTransaction(dataSourceName) {
290
+ const tm = this.getTransactionManager();
291
+ if (!tm) {
292
+ return false;
293
+ }
268
294
  const dsName = dataSourceName || this.defaultDataSourceName;
269
- const status = this.transactionManager.getCurrentTransaction(dsName);
295
+ const status = tm.getCurrentTransaction(dsName);
270
296
  return status !== null && !status.isCompleted;
271
297
  }
272
298
  /**
273
299
  * 获取当前事务状态
274
300
  */
275
301
  getCurrentTransactionStatus(dataSourceName) {
302
+ const tm = this.getTransactionManager();
303
+ if (!tm) {
304
+ return null;
305
+ }
276
306
  const dsName = dataSourceName || this.defaultDataSourceName;
277
- return this.transactionManager.getCurrentTransaction(dsName);
307
+ return tm.getCurrentTransaction(dsName);
278
308
  }
279
309
  };
280
310
  exports.BaseService = BaseService;
281
311
  exports.BaseService = BaseService = BaseService_1 = __decorate([
282
312
  (0, common_1.Injectable)(),
313
+ __param(0, (0, common_1.Optional)()),
283
314
  __param(1, (0, common_1.Optional)()),
284
315
  __param(1, (0, common_1.Inject)('DEFAULT_DATA_SOURCE_NAME')),
285
316
  __metadata("design:paramtypes", [transaction_manager_1.TransactionManager, String])
@@ -1,4 +1,5 @@
1
1
  export { TransactionManager, TransactionDefinition, TransactionStatus, Propagation, IsolationLevel, TransactionTimeoutCallback, TransactionContextManager } from './transaction-manager';
2
+ export { TransactionManagerHolder } from './transaction-manager.holder';
2
3
  export { TransactionSynchronizationManager, TransactionSynchronization, TransactionSynchronizationStatus, } from './transaction-synchronization';
3
4
  export { Transactional, ClassTransactional, TransactionalInterceptor, Tx, UseTransactional, TransactionalOptions } from './transactional.decorator';
4
5
  export { BaseService } from './base-service-transaction';
@@ -1,12 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TransactionModule = exports.addDataSources = exports.addDataSource = exports.withTransaction = exports.withDataSource = exports.isDataSourceAvailable = exports.getDefaultDataSource = exports.getDataSourceSafe = exports.getDataSource = exports.DataSourceUtil = exports.DatabaseAdapter = exports.TransactionErrorHandler = exports.TransactionError = exports.TRANSACTION_LOGGING_INTERCEPTOR = exports.LoggingTransactionalInterceptor = exports.isDynamicDataSourceEntity = exports.hasEntityDataSource = exports.getEntityDataSource = exports.BaseEntityWithDataSource = exports.DynamicDataSource = exports.DataSource = exports.ClsServiceManager = exports.ClsCompatibilityService = exports.TransactionContextService = exports.DataSourceRegistryService = exports.GlobalMultiTypeOrmModule = exports.TypeOrmModuleWrapper = exports.BaseService = exports.UseTransactional = exports.Tx = exports.TransactionalInterceptor = exports.ClassTransactional = exports.Transactional = exports.TransactionSynchronizationStatus = exports.TransactionSynchronizationManager = exports.TransactionContextManager = exports.IsolationLevel = exports.Propagation = exports.TransactionManager = void 0;
3
+ exports.TransactionModule = exports.addDataSources = exports.addDataSource = exports.withTransaction = exports.withDataSource = exports.isDataSourceAvailable = exports.getDefaultDataSource = exports.getDataSourceSafe = exports.getDataSource = exports.DataSourceUtil = exports.DatabaseAdapter = exports.TransactionErrorHandler = exports.TransactionError = exports.TRANSACTION_LOGGING_INTERCEPTOR = exports.LoggingTransactionalInterceptor = exports.isDynamicDataSourceEntity = exports.hasEntityDataSource = exports.getEntityDataSource = exports.BaseEntityWithDataSource = exports.DynamicDataSource = exports.DataSource = exports.ClsServiceManager = exports.ClsCompatibilityService = exports.TransactionContextService = exports.DataSourceRegistryService = exports.GlobalMultiTypeOrmModule = exports.TypeOrmModuleWrapper = exports.BaseService = exports.UseTransactional = exports.Tx = exports.TransactionalInterceptor = exports.ClassTransactional = exports.Transactional = exports.TransactionSynchronizationStatus = exports.TransactionSynchronizationManager = exports.TransactionManagerHolder = exports.TransactionContextManager = exports.IsolationLevel = exports.Propagation = exports.TransactionManager = void 0;
4
4
  // 核心事务管理
5
5
  var transaction_manager_1 = require("./transaction-manager");
6
6
  Object.defineProperty(exports, "TransactionManager", { enumerable: true, get: function () { return transaction_manager_1.TransactionManager; } });
7
7
  Object.defineProperty(exports, "Propagation", { enumerable: true, get: function () { return transaction_manager_1.Propagation; } });
8
8
  Object.defineProperty(exports, "IsolationLevel", { enumerable: true, get: function () { return transaction_manager_1.IsolationLevel; } });
9
9
  Object.defineProperty(exports, "TransactionContextManager", { enumerable: true, get: function () { return transaction_manager_1.TransactionContextManager; } });
10
+ // 事务管理器持有者(用于装饰器访问)
11
+ var transaction_manager_holder_1 = require("./transaction-manager.holder");
12
+ Object.defineProperty(exports, "TransactionManagerHolder", { enumerable: true, get: function () { return transaction_manager_holder_1.TransactionManagerHolder; } });
10
13
  // 事务同步机制(对标 Spring TransactionSynchronization)
11
14
  var transaction_synchronization_1 = require("./transaction-synchronization");
12
15
  Object.defineProperty(exports, "TransactionSynchronizationManager", { enumerable: true, get: function () { return transaction_synchronization_1.TransactionSynchronizationManager; } });
@@ -0,0 +1,31 @@
1
+ import { TransactionManager } from './transaction-manager';
2
+ /**
3
+ * 事务管理器持有者
4
+ * 提供全局访问,使装饰器能够获取 TransactionManager 实例
5
+ * 而不需要在每个 Service 中手动注入
6
+ */
7
+ declare class TransactionManagerHolderClass {
8
+ private _manager;
9
+ /**
10
+ * 设置事务管理器实例
11
+ * 由 TransactionModule 在初始化时调用
12
+ */
13
+ setManager(manager: TransactionManager): void;
14
+ /**
15
+ * 获取事务管理器实例
16
+ */
17
+ getManager(): TransactionManager | null;
18
+ /**
19
+ * 清除事务管理器实例
20
+ */
21
+ clearManager(): void;
22
+ /**
23
+ * 检查是否已设置管理器
24
+ */
25
+ hasManager(): boolean;
26
+ }
27
+ /**
28
+ * 全局事务管理器持有者实例
29
+ */
30
+ export declare const TransactionManagerHolder: TransactionManagerHolderClass;
31
+ export {};
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TransactionManagerHolder = void 0;
4
+ /**
5
+ * 事务管理器持有者
6
+ * 提供全局访问,使装饰器能够获取 TransactionManager 实例
7
+ * 而不需要在每个 Service 中手动注入
8
+ */
9
+ class TransactionManagerHolderClass {
10
+ constructor() {
11
+ this._manager = null;
12
+ }
13
+ /**
14
+ * 设置事务管理器实例
15
+ * 由 TransactionModule 在初始化时调用
16
+ */
17
+ setManager(manager) {
18
+ this._manager = manager;
19
+ }
20
+ /**
21
+ * 获取事务管理器实例
22
+ */
23
+ getManager() {
24
+ return this._manager;
25
+ }
26
+ /**
27
+ * 清除事务管理器实例
28
+ */
29
+ clearManager() {
30
+ this._manager = null;
31
+ }
32
+ /**
33
+ * 检查是否已设置管理器
34
+ */
35
+ hasManager() {
36
+ return this._manager !== null;
37
+ }
38
+ }
39
+ /**
40
+ * 全局事务管理器持有者实例
41
+ */
42
+ exports.TransactionManagerHolder = new TransactionManagerHolderClass();
@@ -5,7 +5,13 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
5
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
6
  return c > 3 && r && Object.defineProperty(target, key, r), r;
7
7
  };
8
- var TransactionModule_1;
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 TransactionModuleInitService_1, TransactionModule_1;
9
15
  Object.defineProperty(exports, "__esModule", { value: true });
10
16
  exports.TransactionModule = void 0;
11
17
  const common_1 = require("@nestjs/common");
@@ -15,6 +21,27 @@ const transaction_manager_1 = require("./transaction-manager");
15
21
  const transaction_manager_2 = require("./transaction-manager");
16
22
  const data_source_registry_1 = require("./data-source-registry");
17
23
  const logging_transactional_interceptor_1 = require("./logging-transactional.interceptor");
24
+ const transaction_manager_holder_1 = require("./transaction-manager.holder");
25
+ /**
26
+ * 事务模块初始化服务
27
+ * 用于在模块启动时设置全局 TransactionManager 持有者
28
+ */
29
+ let TransactionModuleInitService = TransactionModuleInitService_1 = class TransactionModuleInitService {
30
+ constructor(transactionManager) {
31
+ this.transactionManager = transactionManager;
32
+ this.logger = new common_1.Logger(TransactionModuleInitService_1.name);
33
+ }
34
+ onModuleInit() {
35
+ // 设置全局事务管理器持有者
36
+ transaction_manager_holder_1.TransactionManagerHolder.setManager(this.transactionManager);
37
+ this.logger.log('TransactionManagerHolder initialized');
38
+ }
39
+ };
40
+ TransactionModuleInitService = TransactionModuleInitService_1 = __decorate([
41
+ (0, common_1.Injectable)(),
42
+ __param(0, (0, common_1.Inject)((0, common_1.forwardRef)(() => transaction_manager_1.TransactionManager))),
43
+ __metadata("design:paramtypes", [transaction_manager_1.TransactionManager])
44
+ ], TransactionModuleInitService);
18
45
  /**
19
46
  * 事务模块
20
47
  */
@@ -26,6 +53,7 @@ let TransactionModule = TransactionModule_1 = class TransactionModule {
26
53
  transaction_manager_2.TransactionContextManager,
27
54
  transaction_manager_1.TransactionManager,
28
55
  transactional_decorator_1.TransactionalInterceptor,
56
+ TransactionModuleInitService,
29
57
  {
30
58
  provide: 'TRANSACTION_CONFIG',
31
59
  useValue: {
@@ -27,6 +27,7 @@ const common_1 = require("@nestjs/common");
27
27
  const rxjs_1 = require("rxjs");
28
28
  const transaction_manager_1 = require("./transaction-manager");
29
29
  const nestjs_cls_1 = require("nestjs-cls");
30
+ const transaction_manager_holder_1 = require("./transaction-manager.holder");
30
31
  /**
31
32
  * 事务元数据键
32
33
  */
@@ -50,11 +51,11 @@ function Transactional(options) {
50
51
  descriptor.value = function (...args) {
51
52
  return __awaiter(this, void 0, void 0, function* () {
52
53
  var _a;
53
- // 获取事务管理器
54
- const transactionManager = this.transactionManager;
54
+ // 获取事务管理器 - 优先使用全局持有者,兼容手动注入的方式
55
+ let transactionManager = transaction_manager_holder_1.TransactionManagerHolder.getManager() || this.transactionManager;
55
56
  const logger = new common_1.Logger('Transactional');
56
57
  if (!transactionManager) {
57
- logger.warn('TransactionManager not found, executing without transaction');
58
+ logger.warn('TransactionManager not found. Make sure TransactionModule is imported. Executing without transaction.');
58
59
  return yield originalMethod.apply(this, args);
59
60
  }
60
61
  // 获取事务定义