@nest-omni/core 4.1.3-15 → 4.1.3-17
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.
- package/audit/audit.module.js +7 -0
- package/audit/services/entity-audit.service.js +2 -1
- package/audit/services/manual-audit-log.service.js +2 -2
- package/audit/services/multi-database.service.d.ts +0 -5
- package/audit/services/multi-database.service.js +0 -24
- package/audit/services/transaction-audit.service.js +3 -2
- package/cache/dependencies/db.dependency.d.ts +2 -2
- package/cache/dependencies/db.dependency.js +4 -4
- package/http-client/examples/proxy-from-environment.example.d.ts +1 -1
- package/http-client/examples/proxy-from-environment.example.js +18 -19
- package/http-client/services/logging.service.js +2 -3
- package/index.d.ts +1 -1
- package/index.js +1 -1
- package/package.json +3 -2
- package/setup/bootstrap.setup.d.ts +1 -1
- package/shared/service-registry.module.js +2 -15
- package/shared/services/api-config.service.js +1 -0
- package/validators/is-exists.validator.d.ts +2 -7
- package/validators/is-exists.validator.js +2 -24
- package/validators/is-unique.validator.d.ts +2 -7
- package/validators/is-unique.validator.js +2 -24
- package/transaction/__tests__/mocks.d.ts +0 -9
- package/transaction/__tests__/mocks.js +0 -33
- package/transaction/base-service-transaction.d.ts +0 -106
- package/transaction/base-service-transaction.js +0 -317
- package/transaction/cls-compatibility.service.d.ts +0 -55
- package/transaction/cls-compatibility.service.js +0 -127
- package/transaction/data-source-registry.d.ts +0 -91
- package/transaction/data-source-registry.js +0 -349
- package/transaction/data-source.util.d.ts +0 -142
- package/transaction/data-source.util.js +0 -330
- package/transaction/database-adapter.d.ts +0 -44
- package/transaction/database-adapter.js +0 -240
- package/transaction/decorators/entity-datasource.decorator.d.ts +0 -62
- package/transaction/decorators/entity-datasource.decorator.js +0 -105
- package/transaction/index.d.ts +0 -16
- package/transaction/index.js +0 -71
- package/transaction/logging-transactional.interceptor.d.ts +0 -18
- package/transaction/logging-transactional.interceptor.js +0 -163
- package/transaction/transaction-context.service.d.ts +0 -137
- package/transaction/transaction-context.service.js +0 -411
- package/transaction/transaction-manager.d.ts +0 -230
- package/transaction/transaction-manager.holder.d.ts +0 -31
- package/transaction/transaction-manager.holder.js +0 -42
- package/transaction/transaction-manager.js +0 -1001
- package/transaction/transaction-synchronization.d.ts +0 -171
- package/transaction/transaction-synchronization.js +0 -380
- package/transaction/transaction.errors.d.ts +0 -91
- package/transaction/transaction.errors.js +0 -206
- package/transaction/transaction.module.d.ts +0 -30
- package/transaction/transaction.module.js +0 -126
- package/transaction/transactional.decorator.d.ts +0 -82
- package/transaction/transactional.decorator.js +0 -320
- package/transaction/typeorm-module-wrapper.d.ts +0 -96
- package/transaction/typeorm-module-wrapper.js +0 -197
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { TransactionStatus } from '../transaction-manager';
|
|
2
|
-
/**
|
|
3
|
-
* 创建 Mock TransactionStatus
|
|
4
|
-
*/
|
|
5
|
-
export declare function createMockTransactionStatus(overrides?: Partial<TransactionStatus>): TransactionStatus;
|
|
6
|
-
/**
|
|
7
|
-
* 创建 Mock EntityManager
|
|
8
|
-
*/
|
|
9
|
-
export declare function createMockEntityManager(): any;
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createMockTransactionStatus = createMockTransactionStatus;
|
|
4
|
-
exports.createMockEntityManager = createMockEntityManager;
|
|
5
|
-
/**
|
|
6
|
-
* 创建 Mock TransactionStatus
|
|
7
|
-
*/
|
|
8
|
-
function createMockTransactionStatus(overrides) {
|
|
9
|
-
return Object.assign({ isCompleted: false, isRollbackOnly: false, isNewTransaction: false, dataSourceName: 'default', startTime: new Date(), definition: {
|
|
10
|
-
propagation: 0, // Propagation.REQUIRED
|
|
11
|
-
}, nestingLevel: 1 }, overrides);
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* 创建 Mock EntityManager
|
|
15
|
-
*/
|
|
16
|
-
function createMockEntityManager() {
|
|
17
|
-
const mockEntityManager = {
|
|
18
|
-
save: jest.fn().mockResolvedValue({}),
|
|
19
|
-
find: jest.fn().mockResolvedValue([]),
|
|
20
|
-
findOne: jest.fn().mockResolvedValue(null),
|
|
21
|
-
update: jest.fn().mockResolvedValue(undefined),
|
|
22
|
-
delete: jest.fn().mockResolvedValue(undefined),
|
|
23
|
-
remove: jest.fn().mockResolvedValue({}),
|
|
24
|
-
count: jest.fn().mockResolvedValue(0),
|
|
25
|
-
query: jest.fn().mockResolvedValue([]),
|
|
26
|
-
createQueryBuilder: jest.fn().mockReturnValue({}),
|
|
27
|
-
getRepository: jest.fn().mockReturnValue({}),
|
|
28
|
-
queryRunner: {
|
|
29
|
-
isTransactionActive: false,
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
return mockEntityManager;
|
|
33
|
-
}
|
|
@@ -1,106 +0,0 @@
|
|
|
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
|
-
* 注意:TransactionManager 现在是可选的,@Transactional 装饰器会自动使用全局 TransactionManager
|
|
9
|
-
*/
|
|
10
|
-
export declare abstract class BaseService {
|
|
11
|
-
protected readonly transactionManager?: TransactionManager;
|
|
12
|
-
protected readonly defaultDataSourceName: string;
|
|
13
|
-
protected readonly logger: Logger;
|
|
14
|
-
constructor(transactionManager?: TransactionManager, defaultDataSourceName?: string);
|
|
15
|
-
/**
|
|
16
|
-
* 获取事务管理器实例
|
|
17
|
-
* 优先使用注入的实例,其次使用全局持有者
|
|
18
|
-
*/
|
|
19
|
-
protected getTransactionManager(): TransactionManager | undefined;
|
|
20
|
-
/**
|
|
21
|
-
* 获取指定数据源的 EntityManager
|
|
22
|
-
*/
|
|
23
|
-
protected getEntityManager(dataSourceName?: string): EntityManager;
|
|
24
|
-
/**
|
|
25
|
-
* 手动在事务中执行
|
|
26
|
-
*/
|
|
27
|
-
protected executeInTransaction<T>(callback: (em: EntityManager) => Promise<T>, options?: {
|
|
28
|
-
propagation?: Propagation;
|
|
29
|
-
readOnly?: boolean;
|
|
30
|
-
isolation?: IsolationLevel;
|
|
31
|
-
dataSource?: string;
|
|
32
|
-
}): Promise<T>;
|
|
33
|
-
/**
|
|
34
|
-
* 保存实体
|
|
35
|
-
*/
|
|
36
|
-
protected save<T>(entity: T, dataSourceName?: string): Promise<T>;
|
|
37
|
-
/**
|
|
38
|
-
* 批量保存实体
|
|
39
|
-
*/
|
|
40
|
-
protected saveMany<T>(entities: T[], dataSourceName?: string): Promise<T[]>;
|
|
41
|
-
/**
|
|
42
|
-
* 更新实体
|
|
43
|
-
*/
|
|
44
|
-
protected update<T>(entityClass: any, criteria: any, partialEntity: Partial<T>, dataSourceName?: string): Promise<void>;
|
|
45
|
-
/**
|
|
46
|
-
* 删除实体
|
|
47
|
-
*/
|
|
48
|
-
protected remove<T>(entity: T, dataSourceName?: string): Promise<T>;
|
|
49
|
-
/**
|
|
50
|
-
* 根据 ID 删除实体
|
|
51
|
-
*/
|
|
52
|
-
protected delete<T>(entityClass: any, id: string | number | (string | number)[], dataSourceName?: string): Promise<void>;
|
|
53
|
-
/**
|
|
54
|
-
* 查找实体
|
|
55
|
-
*/
|
|
56
|
-
protected find<T>(entityClass: any, options?: any, dataSourceName?: string): Promise<T[]>;
|
|
57
|
-
/**
|
|
58
|
-
* 查找一个实体
|
|
59
|
-
*/
|
|
60
|
-
protected findOne<T>(entityClass: any, options?: any, dataSourceName?: string): Promise<T | null>;
|
|
61
|
-
/**
|
|
62
|
-
* 根据 ID 查找实体
|
|
63
|
-
*/
|
|
64
|
-
protected findById<T>(entityClass: any, id: string | number, dataSourceName?: string): Promise<T | null>;
|
|
65
|
-
/**
|
|
66
|
-
* 计数
|
|
67
|
-
*/
|
|
68
|
-
protected count<T>(entityClass: any, options?: any, dataSourceName?: string): Promise<number>;
|
|
69
|
-
/**
|
|
70
|
-
* 执行原生 SQL
|
|
71
|
-
*/
|
|
72
|
-
protected query<T = any>(query: string, parameters?: any[], dataSourceName?: string): Promise<T[]>;
|
|
73
|
-
/**
|
|
74
|
-
* 创建 Query Builder
|
|
75
|
-
*/
|
|
76
|
-
protected createQueryBuilder<T>(entityClass: any, alias?: string, dataSourceName?: string): Promise<import("typeorm").SelectQueryBuilder<import("typeorm").ObjectLiteral>>;
|
|
77
|
-
/**
|
|
78
|
-
* 获取 Repository
|
|
79
|
-
*/
|
|
80
|
-
protected getRepository<T>(entity: any, dataSourceName?: string): Promise<Repository<T>>;
|
|
81
|
-
/**
|
|
82
|
-
* 执行跨数据源操作
|
|
83
|
-
*/
|
|
84
|
-
protected executeAcrossDataSources<T>(operations: Array<{
|
|
85
|
-
dataSourceName: string;
|
|
86
|
-
operation: (em: EntityManager) => Promise<any>;
|
|
87
|
-
}>, options?: {
|
|
88
|
-
rollbackOnError?: boolean;
|
|
89
|
-
}): Promise<T[]>;
|
|
90
|
-
/**
|
|
91
|
-
* 批量操作优化
|
|
92
|
-
*/
|
|
93
|
-
protected batchOperation<T, R>(items: T[], batchSize: number, operation: (batch: T[], em: EntityManager) => Promise<R[]>, options?: {
|
|
94
|
-
continueOnError?: boolean;
|
|
95
|
-
isolation?: IsolationLevel;
|
|
96
|
-
dataSourceName?: string;
|
|
97
|
-
}): Promise<R[]>;
|
|
98
|
-
/**
|
|
99
|
-
* 检查是否在事务中
|
|
100
|
-
*/
|
|
101
|
-
protected isInTransaction(dataSourceName?: string): boolean;
|
|
102
|
-
/**
|
|
103
|
-
* 获取当前事务状态
|
|
104
|
-
*/
|
|
105
|
-
protected getCurrentTransactionStatus(dataSourceName?: string): TransactionStatus;
|
|
106
|
-
}
|
|
@@ -1,317 +0,0 @@
|
|
|
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
|
-
const transaction_manager_holder_1 = require("./transaction-manager.holder");
|
|
29
|
-
/**
|
|
30
|
-
* 事务感知的基础服务类
|
|
31
|
-
* 提供统一的数据操作接口,自动处理事务
|
|
32
|
-
*
|
|
33
|
-
* 注意:TransactionManager 现在是可选的,@Transactional 装饰器会自动使用全局 TransactionManager
|
|
34
|
-
*/
|
|
35
|
-
let BaseService = BaseService_1 = class BaseService {
|
|
36
|
-
constructor(transactionManager, defaultDataSourceName = 'default') {
|
|
37
|
-
this.transactionManager = transactionManager;
|
|
38
|
-
this.defaultDataSourceName = defaultDataSourceName;
|
|
39
|
-
this.logger = new common_1.Logger(BaseService_1.name);
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* 获取事务管理器实例
|
|
43
|
-
* 优先使用注入的实例,其次使用全局持有者
|
|
44
|
-
*/
|
|
45
|
-
getTransactionManager() {
|
|
46
|
-
return this.transactionManager || transaction_manager_holder_1.TransactionManagerHolder.getManager();
|
|
47
|
-
}
|
|
48
|
-
/**
|
|
49
|
-
* 获取指定数据源的 EntityManager
|
|
50
|
-
*/
|
|
51
|
-
getEntityManager(dataSourceName) {
|
|
52
|
-
const tm = this.getTransactionManager();
|
|
53
|
-
if (!tm) {
|
|
54
|
-
throw new Error('TransactionManager not available. Make sure TransactionModule is imported.');
|
|
55
|
-
}
|
|
56
|
-
const dsName = dataSourceName || this.defaultDataSourceName;
|
|
57
|
-
const em = tm.getCurrentEntityManager(dsName);
|
|
58
|
-
if (!em) {
|
|
59
|
-
throw new Error(`No active transaction for dataSource: ${dsName}. ` +
|
|
60
|
-
`Use @Transactional decorator to start a transaction.`);
|
|
61
|
-
}
|
|
62
|
-
return em;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* 手动在事务中执行
|
|
66
|
-
*/
|
|
67
|
-
executeInTransaction(callback, options) {
|
|
68
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
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({
|
|
74
|
-
propagation: (options === null || options === void 0 ? void 0 : options.propagation) || transaction_manager_1.Propagation.REQUIRED,
|
|
75
|
-
readOnly: (options === null || options === void 0 ? void 0 : options.readOnly) || false,
|
|
76
|
-
isolationLevel: options === null || options === void 0 ? void 0 : options.isolation,
|
|
77
|
-
dataSourceName: (options === null || options === void 0 ? void 0 : options.dataSource) || this.defaultDataSourceName,
|
|
78
|
-
name: `executeInTransaction-${this.constructor.name}`,
|
|
79
|
-
});
|
|
80
|
-
try {
|
|
81
|
-
const em = this.getEntityManager(options === null || options === void 0 ? void 0 : options.dataSource);
|
|
82
|
-
const result = yield callback(em);
|
|
83
|
-
yield tm.commit(status);
|
|
84
|
-
return result;
|
|
85
|
-
}
|
|
86
|
-
catch (error) {
|
|
87
|
-
yield tm.rollback(status);
|
|
88
|
-
throw error;
|
|
89
|
-
}
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* 保存实体
|
|
94
|
-
*/
|
|
95
|
-
save(entity, dataSourceName) {
|
|
96
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
97
|
-
const em = this.getEntityManager(dataSourceName);
|
|
98
|
-
return em.save(entity);
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
/**
|
|
102
|
-
* 批量保存实体
|
|
103
|
-
*/
|
|
104
|
-
saveMany(entities, dataSourceName) {
|
|
105
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
106
|
-
const em = this.getEntityManager(dataSourceName);
|
|
107
|
-
return em.save(entities);
|
|
108
|
-
});
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* 更新实体
|
|
112
|
-
*/
|
|
113
|
-
update(entityClass, criteria, partialEntity, dataSourceName) {
|
|
114
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
115
|
-
const em = this.getEntityManager(dataSourceName);
|
|
116
|
-
yield em.update(entityClass, criteria, partialEntity);
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
/**
|
|
120
|
-
* 删除实体
|
|
121
|
-
*/
|
|
122
|
-
remove(entity, dataSourceName) {
|
|
123
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
124
|
-
const em = this.getEntityManager(dataSourceName);
|
|
125
|
-
return em.remove(entity);
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
/**
|
|
129
|
-
* 根据 ID 删除实体
|
|
130
|
-
*/
|
|
131
|
-
delete(entityClass, id, dataSourceName) {
|
|
132
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
133
|
-
const em = this.getEntityManager(dataSourceName);
|
|
134
|
-
yield em.delete(entityClass, id);
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* 查找实体
|
|
139
|
-
*/
|
|
140
|
-
find(entityClass, options, dataSourceName) {
|
|
141
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
142
|
-
const em = this.getEntityManager(dataSourceName);
|
|
143
|
-
return em.find(entityClass, options);
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* 查找一个实体
|
|
148
|
-
*/
|
|
149
|
-
findOne(entityClass, options, dataSourceName) {
|
|
150
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
151
|
-
const em = this.getEntityManager(dataSourceName);
|
|
152
|
-
return em.findOne(entityClass, options);
|
|
153
|
-
});
|
|
154
|
-
}
|
|
155
|
-
/**
|
|
156
|
-
* 根据 ID 查找实体
|
|
157
|
-
*/
|
|
158
|
-
findById(entityClass, id, dataSourceName) {
|
|
159
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
160
|
-
const em = this.getEntityManager(dataSourceName);
|
|
161
|
-
return em.findOne(entityClass, {
|
|
162
|
-
where: { id },
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
/**
|
|
167
|
-
* 计数
|
|
168
|
-
*/
|
|
169
|
-
count(entityClass, options, dataSourceName) {
|
|
170
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
171
|
-
const em = this.getEntityManager(dataSourceName);
|
|
172
|
-
return em.count(entityClass, options);
|
|
173
|
-
});
|
|
174
|
-
}
|
|
175
|
-
/**
|
|
176
|
-
* 执行原生 SQL
|
|
177
|
-
*/
|
|
178
|
-
query(query, parameters, dataSourceName) {
|
|
179
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
180
|
-
const em = this.getEntityManager(dataSourceName);
|
|
181
|
-
return em.query(query, parameters);
|
|
182
|
-
});
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* 创建 Query Builder
|
|
186
|
-
*/
|
|
187
|
-
createQueryBuilder(entityClass, alias, dataSourceName) {
|
|
188
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
189
|
-
const em = this.getEntityManager(dataSourceName);
|
|
190
|
-
return em.createQueryBuilder(entityClass, alias || entityClass.name.toLowerCase());
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* 获取 Repository
|
|
195
|
-
*/
|
|
196
|
-
getRepository(entity, dataSourceName) {
|
|
197
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
198
|
-
const em = this.getEntityManager(dataSourceName);
|
|
199
|
-
return em.getRepository(entity);
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
/**
|
|
203
|
-
* 执行跨数据源操作
|
|
204
|
-
*/
|
|
205
|
-
executeAcrossDataSources(operations, options) {
|
|
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
|
-
}
|
|
211
|
-
const results = [];
|
|
212
|
-
const startedTransactions = [];
|
|
213
|
-
try {
|
|
214
|
-
// 在每个数据源上开始事务
|
|
215
|
-
for (const op of operations) {
|
|
216
|
-
const status = yield tm.getTransaction({
|
|
217
|
-
propagation: transaction_manager_1.Propagation.REQUIRED,
|
|
218
|
-
dataSourceName: op.dataSourceName,
|
|
219
|
-
});
|
|
220
|
-
startedTransactions.push(status);
|
|
221
|
-
}
|
|
222
|
-
// 执行所有操作
|
|
223
|
-
for (const op of operations) {
|
|
224
|
-
const em = this.getEntityManager(op.dataSourceName);
|
|
225
|
-
const result = yield op.operation(em);
|
|
226
|
-
results.push(result);
|
|
227
|
-
}
|
|
228
|
-
// 提交所有事务
|
|
229
|
-
for (const status of startedTransactions) {
|
|
230
|
-
yield tm.commit(status);
|
|
231
|
-
}
|
|
232
|
-
return results;
|
|
233
|
-
}
|
|
234
|
-
catch (error) {
|
|
235
|
-
// 回滚所有事务
|
|
236
|
-
if ((options === null || options === void 0 ? void 0 : options.rollbackOnError) !== false) {
|
|
237
|
-
for (const status of startedTransactions.reverse()) {
|
|
238
|
-
try {
|
|
239
|
-
yield tm.rollback(status);
|
|
240
|
-
}
|
|
241
|
-
catch (rollbackError) {
|
|
242
|
-
this.logger.error(`Failed to rollback transaction on ${status.dataSourceName}:`, rollbackError);
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
throw error;
|
|
247
|
-
}
|
|
248
|
-
});
|
|
249
|
-
}
|
|
250
|
-
/**
|
|
251
|
-
* 批量操作优化
|
|
252
|
-
*/
|
|
253
|
-
batchOperation(items, batchSize, operation, options) {
|
|
254
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
255
|
-
const allResults = [];
|
|
256
|
-
let processedCount = 0;
|
|
257
|
-
return yield this.executeInTransaction((em) => __awaiter(this, void 0, void 0, function* () {
|
|
258
|
-
for (let i = 0; i < items.length; i += batchSize) {
|
|
259
|
-
const batch = items.slice(i, i + batchSize);
|
|
260
|
-
const batchNumber = Math.floor(i / batchSize) + 1;
|
|
261
|
-
try {
|
|
262
|
-
this.logger.log(`Processing batch ${batchNumber}/${Math.ceil(items.length / batchSize)}`);
|
|
263
|
-
const results = yield operation(batch, em);
|
|
264
|
-
allResults.push(...results);
|
|
265
|
-
processedCount += batch.length;
|
|
266
|
-
}
|
|
267
|
-
catch (error) {
|
|
268
|
-
this.logger.error(`Batch ${batchNumber} failed:`, error);
|
|
269
|
-
if (options === null || options === void 0 ? void 0 : options.continueOnError) {
|
|
270
|
-
// 记录失败但继续
|
|
271
|
-
processedCount += batch.length;
|
|
272
|
-
continue;
|
|
273
|
-
}
|
|
274
|
-
else {
|
|
275
|
-
throw new Error(`Batch operation failed at batch ${batchNumber}. Processed ${processedCount}/${items.length} items.`);
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
return allResults;
|
|
280
|
-
}), {
|
|
281
|
-
isolation: options === null || options === void 0 ? void 0 : options.isolation,
|
|
282
|
-
dataSource: options === null || options === void 0 ? void 0 : options.dataSourceName,
|
|
283
|
-
});
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
/**
|
|
287
|
-
* 检查是否在事务中
|
|
288
|
-
*/
|
|
289
|
-
isInTransaction(dataSourceName) {
|
|
290
|
-
const tm = this.getTransactionManager();
|
|
291
|
-
if (!tm) {
|
|
292
|
-
return false;
|
|
293
|
-
}
|
|
294
|
-
const dsName = dataSourceName || this.defaultDataSourceName;
|
|
295
|
-
const status = tm.getCurrentTransaction(dsName);
|
|
296
|
-
return status !== null && !status.isCompleted;
|
|
297
|
-
}
|
|
298
|
-
/**
|
|
299
|
-
* 获取当前事务状态
|
|
300
|
-
*/
|
|
301
|
-
getCurrentTransactionStatus(dataSourceName) {
|
|
302
|
-
const tm = this.getTransactionManager();
|
|
303
|
-
if (!tm) {
|
|
304
|
-
return null;
|
|
305
|
-
}
|
|
306
|
-
const dsName = dataSourceName || this.defaultDataSourceName;
|
|
307
|
-
return tm.getCurrentTransaction(dsName);
|
|
308
|
-
}
|
|
309
|
-
};
|
|
310
|
-
exports.BaseService = BaseService;
|
|
311
|
-
exports.BaseService = BaseService = BaseService_1 = __decorate([
|
|
312
|
-
(0, common_1.Injectable)(),
|
|
313
|
-
__param(0, (0, common_1.Optional)()),
|
|
314
|
-
__param(1, (0, common_1.Optional)()),
|
|
315
|
-
__param(1, (0, common_1.Inject)('DEFAULT_DATA_SOURCE_NAME')),
|
|
316
|
-
__metadata("design:paramtypes", [transaction_manager_1.TransactionManager, String])
|
|
317
|
-
], BaseService);
|
|
@@ -1,55 +0,0 @@
|
|
|
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;
|
|
@@ -1,127 +0,0 @@
|
|
|
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
|
-
}
|