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

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 (72) hide show
  1. package/cache/dependencies/db.dependency.d.ts +55 -6
  2. package/cache/dependencies/db.dependency.js +64 -13
  3. package/common/boilerplate.polyfill.js +1 -1
  4. package/file-upload/decorators/column.decorator.d.ts +151 -0
  5. package/file-upload/decorators/column.decorator.js +273 -0
  6. package/file-upload/decorators/csv-data.decorator.d.ts +17 -31
  7. package/file-upload/decorators/csv-data.decorator.js +45 -91
  8. package/file-upload/decorators/csv-import.decorator.d.ts +34 -0
  9. package/file-upload/decorators/csv-import.decorator.js +24 -0
  10. package/file-upload/decorators/examples/column-mapping.example.d.ts +76 -0
  11. package/file-upload/decorators/examples/column-mapping.example.js +122 -0
  12. package/file-upload/decorators/excel-data.decorator.d.ts +15 -29
  13. package/file-upload/decorators/excel-data.decorator.js +42 -82
  14. package/file-upload/decorators/index.d.ts +3 -2
  15. package/file-upload/decorators/index.js +20 -2
  16. package/file-upload/decorators/validate-data.decorator.d.ts +91 -0
  17. package/file-upload/decorators/validate-data.decorator.js +39 -0
  18. package/file-upload/dto/update-file.dto.d.ts +0 -1
  19. package/file-upload/dto/update-file.dto.js +0 -4
  20. package/file-upload/entities/file-metadata.entity.d.ts +6 -3
  21. package/file-upload/entities/file-metadata.entity.js +2 -10
  22. package/file-upload/entities/file.entity.d.ts +3 -18
  23. package/file-upload/entities/file.entity.js +0 -34
  24. package/file-upload/file-upload.module.d.ts +1 -1
  25. package/file-upload/file-upload.module.js +44 -16
  26. package/file-upload/index.d.ts +13 -2
  27. package/file-upload/index.js +21 -3
  28. package/file-upload/interceptors/file-upload.interceptor.d.ts +61 -8
  29. package/file-upload/interceptors/file-upload.interceptor.js +417 -257
  30. package/file-upload/interfaces/file-processor.interface.d.ts +93 -0
  31. package/file-upload/interfaces/file-processor.interface.js +2 -0
  32. package/file-upload/interfaces/file-upload-options.interface.d.ts +3 -46
  33. package/file-upload/interfaces/file-upload-options.interface.js +3 -0
  34. package/file-upload/interfaces/processor-options.interface.d.ts +102 -0
  35. package/file-upload/interfaces/processor-options.interface.js +2 -0
  36. package/file-upload/processors/csv.processor.d.ts +98 -0
  37. package/file-upload/processors/csv.processor.js +391 -0
  38. package/file-upload/processors/excel.processor.d.ts +130 -0
  39. package/file-upload/processors/excel.processor.js +547 -0
  40. package/file-upload/processors/image.processor.d.ts +199 -0
  41. package/file-upload/processors/image.processor.js +377 -0
  42. package/file-upload/services/file.service.d.ts +3 -0
  43. package/file-upload/services/file.service.js +39 -10
  44. package/file-upload/services/malicious-file-detector.service.d.ts +29 -3
  45. package/file-upload/services/malicious-file-detector.service.js +256 -57
  46. package/file-upload/utils/dynamic-import.util.d.ts +6 -2
  47. package/file-upload/utils/dynamic-import.util.js +17 -5
  48. package/http-client/decorators/http-client.decorators.d.ts +4 -2
  49. package/http-client/decorators/http-client.decorators.js +2 -1
  50. package/http-client/entities/http-log.entity.js +1 -9
  51. package/http-client/examples/proxy-from-environment.example.d.ts +133 -0
  52. package/http-client/examples/proxy-from-environment.example.js +410 -0
  53. package/http-client/http-client.module.js +65 -6
  54. package/http-client/interfaces/http-client-config.interface.d.ts +6 -0
  55. package/http-client/services/http-client.service.d.ts +8 -0
  56. package/http-client/services/http-client.service.js +61 -17
  57. package/http-client/services/logging.service.d.ts +1 -1
  58. package/http-client/services/logging.service.js +74 -58
  59. package/http-client/utils/index.d.ts +1 -0
  60. package/http-client/utils/index.js +1 -0
  61. package/http-client/utils/proxy-environment.util.d.ts +42 -0
  62. package/http-client/utils/proxy-environment.util.js +148 -0
  63. package/package.json +9 -5
  64. package/shared/service-registry.module.js +18 -0
  65. package/transaction/data-source.util.d.ts +142 -0
  66. package/transaction/data-source.util.js +330 -0
  67. package/transaction/index.d.ts +1 -0
  68. package/transaction/index.js +12 -1
  69. package/validators/is-exists.validator.d.ts +19 -2
  70. package/validators/is-exists.validator.js +27 -2
  71. package/validators/is-unique.validator.d.ts +12 -1
  72. package/validators/is-unique.validator.js +26 -1
@@ -0,0 +1,142 @@
1
+ import { DataSource } from 'typeorm';
2
+ /**
3
+ * 数据源工具类
4
+ * 提供静态方法在任意位置获取数据源
5
+ */
6
+ export declare class DataSourceUtil {
7
+ /**
8
+ * 获取数据源
9
+ * 按优先级从以下位置查找:
10
+ * 1. 当前请求上下文 (TransactionContextService)
11
+ * 2. 全局数据源存储 (GlobalDataSourceStorage)
12
+ *
13
+ * @param name 数据源名称,默认为 'default'
14
+ * @returns DataSource 实例
15
+ * @throws Error 如果数据源不存在
16
+ */
17
+ static getDataSource(name?: string): DataSource;
18
+ /**
19
+ * 安全获取数据源,不存在时返回 null
20
+ *
21
+ * @param name 数据源名称
22
+ * @returns DataSource 实例或 null
23
+ */
24
+ static getDataSourceSafe(name?: string): DataSource | null;
25
+ /**
26
+ * 获取默认数据源
27
+ */
28
+ static getDefaultDataSource(): DataSource;
29
+ /**
30
+ * 安全获取默认数据源
31
+ */
32
+ static getDefaultDataSourceSafe(): DataSource | null;
33
+ /**
34
+ * 检查数据源是否可用
35
+ *
36
+ * @param name 数据源名称
37
+ * @returns 是否可用
38
+ */
39
+ static isAvailable(name?: string): boolean;
40
+ /**
41
+ * 获取所有可用数据源名称
42
+ */
43
+ static getAvailableDataSourceNames(): string[];
44
+ /**
45
+ * 批量获取数据源
46
+ *
47
+ * @param names 数据源名称数组
48
+ * @returns 数据源 Map
49
+ */
50
+ static getDataSources(names: string[]): Map<string, DataSource>;
51
+ /**
52
+ * 获取所有已注册的数据源
53
+ */
54
+ static getAllDataSources(): Map<string, DataSource>;
55
+ /**
56
+ * 手动注册数据源(用于非模块场景)
57
+ *
58
+ * @param name 数据源名称
59
+ * @param dataSource DataSource 实例
60
+ * @param isDefault 是否设为默认数据源
61
+ */
62
+ static registerDataSource(name: string, dataSource: DataSource, isDefault?: boolean): void;
63
+ /**
64
+ * 批量注册数据源
65
+ *
66
+ * @param dataSources 数据源 Map
67
+ * @param defaultName 默认数据源名称
68
+ */
69
+ static registerDataSources(dataSources: Map<string, DataSource>, defaultName?: string): void;
70
+ /**
71
+ * 使用数据源执行操作
72
+ *
73
+ * @param name 数据源名称
74
+ * @param operation 要执行的操作
75
+ * @returns 操作结果
76
+ */
77
+ static withDataSource<T>(name: string, operation: (dataSource: DataSource) => Promise<T> | T): Promise<T>;
78
+ /**
79
+ * 使用默认数据源执行操作
80
+ *
81
+ * @param operation 要执行的操作
82
+ * @returns 操作结果
83
+ */
84
+ static withDefaultDataSource<T>(operation: (dataSource: DataSource) => Promise<T> | T): Promise<T>;
85
+ /**
86
+ * 在事务中执行操作
87
+ *
88
+ * @param name 数据源名称
89
+ * @param operation 要执行的操作
90
+ * @returns 操作结果
91
+ */
92
+ static withTransaction<T>(name: string, operation: (dataSource: DataSource) => Promise<T>): Promise<T>;
93
+ /**
94
+ * 在默认数据源的事务中执行操作
95
+ */
96
+ static withDefaultTransaction<T>(operation: (dataSource: DataSource) => Promise<T>): Promise<T>;
97
+ /**
98
+ * 测试数据源连接
99
+ *
100
+ * @param name 数据源名称
101
+ * @returns 连接是否正常
102
+ */
103
+ static testConnection(name?: string): Promise<boolean>;
104
+ }
105
+ /**
106
+ * 便捷的别名
107
+ */
108
+ export declare const getDataSource: any;
109
+ export declare const getDataSourceSafe: any;
110
+ export declare const getDefaultDataSource: any;
111
+ export declare const isDataSourceAvailable: any;
112
+ export declare const withDataSource: any;
113
+ export declare const withTransaction: any;
114
+ /**
115
+ * 添加数据源到全局注册表
116
+ * 用于在 TypeOrmModule.forRootAsync 的 useFactory 中手动注册数据源
117
+ *
118
+ * @param name 数据源名称
119
+ * @param dataSource DataSource 实例
120
+ * @param isDefault 是否设为默认数据源
121
+ *
122
+ * @example
123
+ * ```typescript
124
+ * TypeOrmModule.forRootAsync({
125
+ * inject: [ApiConfigService],
126
+ * useFactory: (config: ApiConfigService) => {
127
+ * const dsConfig = config.typeormConfig;
128
+ * // 在这里注册,确保数据源初始化后立即可用
129
+ * addDataSource('default', dataSource, true);
130
+ * return dsConfig;
131
+ * },
132
+ * }),
133
+ * ```
134
+ */
135
+ export declare const addDataSource: any;
136
+ /**
137
+ * 批量添加数据源
138
+ *
139
+ * @param dataSources 数据源 Map
140
+ * @param defaultName 默认数据源名称
141
+ */
142
+ export declare const addDataSources: any;
@@ -0,0 +1,330 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.addDataSources = exports.addDataSource = exports.withTransaction = exports.withDataSource = exports.isDataSourceAvailable = exports.getDefaultDataSource = exports.getDataSourceSafe = exports.getDataSource = exports.DataSourceUtil = void 0;
13
+ const transaction_context_service_1 = require("./transaction-context.service");
14
+ /**
15
+ * 全局数据源存储
16
+ * 用于在非请求上下文中存储和获取数据源
17
+ */
18
+ class GlobalDataSourceStorage {
19
+ /**
20
+ * 注册数据源
21
+ */
22
+ static register(name, dataSource) {
23
+ this.dataSources.set(name, dataSource);
24
+ }
25
+ /**
26
+ * 批量注册数据源
27
+ */
28
+ static registerAll(dataSources) {
29
+ for (const [name, dataSource] of dataSources.entries()) {
30
+ this.register(name, dataSource);
31
+ }
32
+ }
33
+ /**
34
+ * 获取数据源
35
+ */
36
+ static get(name) {
37
+ return this.dataSources.get(name);
38
+ }
39
+ /**
40
+ * 获取默认数据源
41
+ */
42
+ static getDefault() {
43
+ return this.dataSources.get(this.defaultDataSourceName);
44
+ }
45
+ /**
46
+ * 设置默认数据源名称
47
+ */
48
+ static setDefaultName(name) {
49
+ this.defaultDataSourceName = name;
50
+ }
51
+ /**
52
+ * 检查数据源是否存在
53
+ */
54
+ static has(name) {
55
+ return this.dataSources.has(name);
56
+ }
57
+ /**
58
+ * 获取所有已注册的数据源名称
59
+ */
60
+ static getAllNames() {
61
+ return Array.from(this.dataSources.keys());
62
+ }
63
+ /**
64
+ * 移除数据源
65
+ */
66
+ static remove(name) {
67
+ this.dataSources.delete(name);
68
+ }
69
+ /**
70
+ * 清空所有数据源
71
+ */
72
+ static clear() {
73
+ this.dataSources.clear();
74
+ }
75
+ }
76
+ GlobalDataSourceStorage.dataSources = new Map();
77
+ GlobalDataSourceStorage.defaultDataSourceName = 'default';
78
+ /**
79
+ * 数据源工具类
80
+ * 提供静态方法在任意位置获取数据源
81
+ */
82
+ class DataSourceUtil {
83
+ /**
84
+ * 获取数据源
85
+ * 按优先级从以下位置查找:
86
+ * 1. 当前请求上下文 (TransactionContextService)
87
+ * 2. 全局数据源存储 (GlobalDataSourceStorage)
88
+ *
89
+ * @param name 数据源名称,默认为 'default'
90
+ * @returns DataSource 实例
91
+ * @throws Error 如果数据源不存在
92
+ */
93
+ static getDataSource(name = 'default') {
94
+ // 1. 尝试从请求上下文获取
95
+ try {
96
+ return transaction_context_service_1.TransactionContextService.getDataSource(name);
97
+ }
98
+ catch (_a) {
99
+ // 忽略错误,继续尝试其他方式
100
+ }
101
+ // 2. 从全局存储获取
102
+ const dataSource = GlobalDataSourceStorage.get(name);
103
+ if (dataSource) {
104
+ return dataSource;
105
+ }
106
+ throw new Error(`DataSource '${name}' not found. ` +
107
+ `Please ensure it is registered via TransactionModule.registerDataSource() or TypeOrmModule.`);
108
+ }
109
+ /**
110
+ * 安全获取数据源,不存在时返回 null
111
+ *
112
+ * @param name 数据源名称
113
+ * @returns DataSource 实例或 null
114
+ */
115
+ static getDataSourceSafe(name = 'default') {
116
+ try {
117
+ return this.getDataSource(name);
118
+ }
119
+ catch (_a) {
120
+ return null;
121
+ }
122
+ }
123
+ /**
124
+ * 获取默认数据源
125
+ */
126
+ static getDefaultDataSource() {
127
+ return this.getDataSource('default');
128
+ }
129
+ /**
130
+ * 安全获取默认数据源
131
+ */
132
+ static getDefaultDataSourceSafe() {
133
+ return this.getDataSourceSafe('default');
134
+ }
135
+ /**
136
+ * 检查数据源是否可用
137
+ *
138
+ * @param name 数据源名称
139
+ * @returns 是否可用
140
+ */
141
+ static isAvailable(name = 'default') {
142
+ var _a;
143
+ try {
144
+ const ds = this.getDataSource(name);
145
+ return (_a = ds === null || ds === void 0 ? void 0 : ds.isInitialized) !== null && _a !== void 0 ? _a : false;
146
+ }
147
+ catch (_b) {
148
+ return false;
149
+ }
150
+ }
151
+ /**
152
+ * 获取所有可用数据源名称
153
+ */
154
+ static getAvailableDataSourceNames() {
155
+ const names = new Set();
156
+ // 从请求上下文获取
157
+ try {
158
+ const contextNames = transaction_context_service_1.TransactionContextService.getRegisteredDataSources();
159
+ contextNames.forEach((name) => names.add(name));
160
+ }
161
+ catch (_a) {
162
+ // 忽略错误
163
+ }
164
+ // 从全局存储获取
165
+ GlobalDataSourceStorage.getAllNames().forEach((name) => names.add(name));
166
+ return Array.from(names);
167
+ }
168
+ /**
169
+ * 批量获取数据源
170
+ *
171
+ * @param names 数据源名称数组
172
+ * @returns 数据源 Map
173
+ */
174
+ static getDataSources(names) {
175
+ const result = new Map();
176
+ for (const name of names) {
177
+ try {
178
+ const ds = this.getDataSource(name);
179
+ if (ds) {
180
+ result.set(name, ds);
181
+ }
182
+ }
183
+ catch (_a) {
184
+ // 跳过不存在的数据源
185
+ }
186
+ }
187
+ return result;
188
+ }
189
+ /**
190
+ * 获取所有已注册的数据源
191
+ */
192
+ static getAllDataSources() {
193
+ const names = this.getAvailableDataSourceNames();
194
+ return this.getDataSources(names);
195
+ }
196
+ /**
197
+ * 手动注册数据源(用于非模块场景)
198
+ *
199
+ * @param name 数据源名称
200
+ * @param dataSource DataSource 实例
201
+ * @param isDefault 是否设为默认数据源
202
+ */
203
+ static registerDataSource(name, dataSource, isDefault = false) {
204
+ GlobalDataSourceStorage.register(name, dataSource);
205
+ if (isDefault) {
206
+ GlobalDataSourceStorage.setDefaultName(name);
207
+ }
208
+ }
209
+ /**
210
+ * 批量注册数据源
211
+ *
212
+ * @param dataSources 数据源 Map
213
+ * @param defaultName 默认数据源名称
214
+ */
215
+ static registerDataSources(dataSources, defaultName) {
216
+ GlobalDataSourceStorage.registerAll(dataSources);
217
+ if (defaultName) {
218
+ GlobalDataSourceStorage.setDefaultName(defaultName);
219
+ }
220
+ }
221
+ /**
222
+ * 使用数据源执行操作
223
+ *
224
+ * @param name 数据源名称
225
+ * @param operation 要执行的操作
226
+ * @returns 操作结果
227
+ */
228
+ static withDataSource(name, operation) {
229
+ return __awaiter(this, void 0, void 0, function* () {
230
+ const dataSource = this.getDataSource(name);
231
+ return operation(dataSource);
232
+ });
233
+ }
234
+ /**
235
+ * 使用默认数据源执行操作
236
+ *
237
+ * @param operation 要执行的操作
238
+ * @returns 操作结果
239
+ */
240
+ static withDefaultDataSource(operation) {
241
+ return __awaiter(this, void 0, void 0, function* () {
242
+ return this.withDataSource('default', operation);
243
+ });
244
+ }
245
+ /**
246
+ * 在事务中执行操作
247
+ *
248
+ * @param name 数据源名称
249
+ * @param operation 要执行的操作
250
+ * @returns 操作结果
251
+ */
252
+ static withTransaction(name, operation) {
253
+ return __awaiter(this, void 0, void 0, function* () {
254
+ const dataSource = this.getDataSource(name);
255
+ return dataSource.transaction((entityManager) => __awaiter(this, void 0, void 0, function* () {
256
+ // 通过 EntityManager 获取 DataSource
257
+ const ds = entityManager.connection;
258
+ return operation(ds);
259
+ }));
260
+ });
261
+ }
262
+ /**
263
+ * 在默认数据源的事务中执行操作
264
+ */
265
+ static withDefaultTransaction(operation) {
266
+ return __awaiter(this, void 0, void 0, function* () {
267
+ return this.withTransaction('default', operation);
268
+ });
269
+ }
270
+ /**
271
+ * 测试数据源连接
272
+ *
273
+ * @param name 数据源名称
274
+ * @returns 连接是否正常
275
+ */
276
+ static testConnection() {
277
+ return __awaiter(this, arguments, void 0, function* (name = 'default') {
278
+ try {
279
+ const dataSource = this.getDataSource(name);
280
+ if (dataSource.isInitialized) {
281
+ yield dataSource.query('SELECT 1');
282
+ return true;
283
+ }
284
+ return false;
285
+ }
286
+ catch (_a) {
287
+ return false;
288
+ }
289
+ });
290
+ }
291
+ }
292
+ exports.DataSourceUtil = DataSourceUtil;
293
+ /**
294
+ * 便捷的别名
295
+ */
296
+ exports.getDataSource = DataSourceUtil.getDataSource.bind(DataSourceUtil);
297
+ exports.getDataSourceSafe = DataSourceUtil.getDataSourceSafe.bind(DataSourceUtil);
298
+ exports.getDefaultDataSource = DataSourceUtil.getDefaultDataSource.bind(DataSourceUtil);
299
+ exports.isDataSourceAvailable = DataSourceUtil.isAvailable.bind(DataSourceUtil);
300
+ exports.withDataSource = DataSourceUtil.withDataSource.bind(DataSourceUtil);
301
+ exports.withTransaction = DataSourceUtil.withTransaction.bind(DataSourceUtil);
302
+ /**
303
+ * 添加数据源到全局注册表
304
+ * 用于在 TypeOrmModule.forRootAsync 的 useFactory 中手动注册数据源
305
+ *
306
+ * @param name 数据源名称
307
+ * @param dataSource DataSource 实例
308
+ * @param isDefault 是否设为默认数据源
309
+ *
310
+ * @example
311
+ * ```typescript
312
+ * TypeOrmModule.forRootAsync({
313
+ * inject: [ApiConfigService],
314
+ * useFactory: (config: ApiConfigService) => {
315
+ * const dsConfig = config.typeormConfig;
316
+ * // 在这里注册,确保数据源初始化后立即可用
317
+ * addDataSource('default', dataSource, true);
318
+ * return dsConfig;
319
+ * },
320
+ * }),
321
+ * ```
322
+ */
323
+ exports.addDataSource = DataSourceUtil.registerDataSource.bind(DataSourceUtil);
324
+ /**
325
+ * 批量添加数据源
326
+ *
327
+ * @param dataSources 数据源 Map
328
+ * @param defaultName 默认数据源名称
329
+ */
330
+ exports.addDataSources = DataSourceUtil.registerDataSources.bind(DataSourceUtil);
@@ -11,4 +11,5 @@ export { LoggingTransactionalInterceptor } from './logging-transactional.interce
11
11
  export { LoggingTransactionalInterceptor as TRANSACTION_LOGGING_INTERCEPTOR } from './logging-transactional.interceptor';
12
12
  export { TransactionError, TransactionErrorHandler } from './transaction.errors';
13
13
  export { DatabaseAdapter, DatabaseType } from './database-adapter';
14
+ export { DataSourceUtil, getDataSource, getDataSourceSafe, getDefaultDataSource, isDataSourceAvailable, withDataSource, withTransaction, addDataSource, addDataSources, } from './data-source.util';
14
15
  export { TransactionModule } from './transaction.module';
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TransactionModule = 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.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; } });
@@ -52,6 +52,17 @@ Object.defineProperty(exports, "TransactionErrorHandler", { enumerable: true, ge
52
52
  // 数据库适配器
53
53
  var database_adapter_1 = require("./database-adapter");
54
54
  Object.defineProperty(exports, "DatabaseAdapter", { enumerable: true, get: function () { return database_adapter_1.DatabaseAdapter; } });
55
+ // 数据源工具(可在任意位置获取数据源)
56
+ var data_source_util_1 = require("./data-source.util");
57
+ Object.defineProperty(exports, "DataSourceUtil", { enumerable: true, get: function () { return data_source_util_1.DataSourceUtil; } });
58
+ Object.defineProperty(exports, "getDataSource", { enumerable: true, get: function () { return data_source_util_1.getDataSource; } });
59
+ Object.defineProperty(exports, "getDataSourceSafe", { enumerable: true, get: function () { return data_source_util_1.getDataSourceSafe; } });
60
+ Object.defineProperty(exports, "getDefaultDataSource", { enumerable: true, get: function () { return data_source_util_1.getDefaultDataSource; } });
61
+ Object.defineProperty(exports, "isDataSourceAvailable", { enumerable: true, get: function () { return data_source_util_1.isDataSourceAvailable; } });
62
+ Object.defineProperty(exports, "withDataSource", { enumerable: true, get: function () { return data_source_util_1.withDataSource; } });
63
+ Object.defineProperty(exports, "withTransaction", { enumerable: true, get: function () { return data_source_util_1.withTransaction; } });
64
+ Object.defineProperty(exports, "addDataSource", { enumerable: true, get: function () { return data_source_util_1.addDataSource; } });
65
+ Object.defineProperty(exports, "addDataSources", { enumerable: true, get: function () { return data_source_util_1.addDataSources; } });
55
66
  // 模块导出
56
67
  var transaction_module_1 = require("./transaction.module");
57
68
  Object.defineProperty(exports, "TransactionModule", { enumerable: true, get: function () { return transaction_module_1.TransactionModule; } });
@@ -1,5 +1,5 @@
1
1
  import type { ValidationArguments, ValidationOptions, ValidatorConstraintInterface } from 'class-validator';
2
- import type { EntitySchema, FindOptionsWhere, ObjectType } from 'typeorm';
2
+ import type { DataSource, EntitySchema, FindOptionsWhere, ObjectType } from 'typeorm';
3
3
  export declare class IsExistsValidator implements ValidatorConstraintInterface {
4
4
  constructor();
5
5
  /**
@@ -15,12 +15,29 @@ export declare class IsExistsValidator implements ValidatorConstraintInterface {
15
15
  * 例如:appId -> App, userId -> User
16
16
  */
17
17
  private inferEntityNameFromProperty;
18
+ /**
19
+ * 获取数据源
20
+ * 支持多数据源配置,保持向后兼容
21
+ */
22
+ private getDataSource;
18
23
  validate<E>(value: string, args: IExistsValidationArguments<E>): Promise<boolean>;
19
24
  defaultMessage(args: ValidationArguments): string;
20
25
  }
26
+ /**
27
+ * IsExists 配置选项
28
+ */
29
+ export interface IsExistsOptions {
30
+ /**
31
+ * 数据源名称或 DataSource 实例
32
+ * 用于多数据源场景,指定使用哪个数据源进行验证
33
+ * 例如:'readonly', 'report', 或直接传入 DataSource 实例
34
+ */
35
+ dataSource?: string | DataSource;
36
+ }
21
37
  type ExistsValidationConstraints<E> = [
22
38
  (ObjectType<E> | EntitySchema<E> | string | (() => ObjectType<E> | EntitySchema<E> | string)),
23
- (validationArguments: ValidationArguments) => FindOptionsWhere<E>
39
+ (validationArguments: ValidationArguments) => FindOptionsWhere<E>,
40
+ IsExistsOptions?
24
41
  ];
25
42
  interface IExistsValidationArguments<E> extends ValidationArguments {
26
43
  constraints: ExistsValidationConstraints<E>;
@@ -24,6 +24,7 @@ const class_validator_1 = require("class-validator");
24
24
  const nestjs_i18n_1 = require("nestjs-i18n");
25
25
  const common_1 = require("@nestjs/common");
26
26
  const transaction_1 = require("../transaction");
27
+ const transaction_2 = require("../transaction");
27
28
  let IsExistsValidator = class IsExistsValidator {
28
29
  constructor() { }
29
30
  /**
@@ -84,12 +85,36 @@ let IsExistsValidator = class IsExistsValidator {
84
85
  const entityName = name.charAt(0).toUpperCase() + name.slice(1) + 'Entity';
85
86
  return entityName;
86
87
  }
88
+ /**
89
+ * 获取数据源
90
+ * 支持多数据源配置,保持向后兼容
91
+ */
92
+ getDataSource(dataSourceOrName) {
93
+ // 1. 如果传入的是 DataSource 实例,直接返回
94
+ if (dataSourceOrName && typeof dataSourceOrName !== 'string') {
95
+ return dataSourceOrName;
96
+ }
97
+ // 2. 如果传入的是数据源名称,获取对应的数据源
98
+ if (typeof dataSourceOrName === 'string') {
99
+ return (0, transaction_2.getDataSource)(dataSourceOrName);
100
+ }
101
+ // 3. 默认:尝试从请求上下文获取,然后获取 default 数据源
102
+ try {
103
+ return transaction_1.TransactionContextService.getDataSource();
104
+ }
105
+ catch (_a) {
106
+ return (0, transaction_2.getDataSource)('default');
107
+ }
108
+ }
87
109
  validate(value, args) {
88
110
  return __awaiter(this, void 0, void 0, function* () {
89
- const [entityRef, findCondition] = args.constraints;
111
+ const [entityRef, findCondition, options] = args.constraints;
90
112
  // 解析 Entity 引用
91
113
  const entityClass = this.resolveEntity(entityRef, args.property, args.object);
92
- const repository = transaction_1.TransactionContextService.getDataSource().getRepository(entityClass);
114
+ // 获取数据源(支持多数据源)
115
+ const dataSourceName = (options === null || options === void 0 ? void 0 : options.dataSource) || 'default';
116
+ const dataSource = this.getDataSource(dataSourceName);
117
+ const repository = dataSource.getRepository(entityClass);
93
118
  args.value = value;
94
119
  return ((yield repository.count({
95
120
  where: findCondition(args),
@@ -1,5 +1,5 @@
1
1
  import type { ValidationArguments, ValidationOptions, ValidatorConstraintInterface } from 'class-validator';
2
- import { EntitySchema, FindOptionsWhere, ObjectType } from 'typeorm';
2
+ import type { DataSource, EntitySchema, FindOptionsWhere, ObjectType } from 'typeorm';
3
3
  export declare class IsUniqueValidator implements ValidatorConstraintInterface {
4
4
  constructor();
5
5
  /**
@@ -15,6 +15,11 @@ export declare class IsUniqueValidator implements ValidatorConstraintInterface {
15
15
  * 例如:appId -> App, userId -> User
16
16
  */
17
17
  private inferEntityNameFromProperty;
18
+ /**
19
+ * 获取数据源
20
+ * 支持多数据源配置,保持向后兼容
21
+ */
22
+ private getDataSource;
18
23
  validate<E>(value: string, args: IUniqueValidationArguments<E>): Promise<boolean>;
19
24
  defaultMessage(args: ValidationArguments): string;
20
25
  }
@@ -28,6 +33,12 @@ export interface IsUniqueOptions {
28
33
  * 例如:uniqueKeys: ['id'] 或 uniqueKeys: ['id', 'version']
29
34
  */
30
35
  uniqueKeys?: string[];
36
+ /**
37
+ * 数据源名称或 DataSource 实例
38
+ * 用于多数据源场景,指定使用哪个数据源进行验证
39
+ * 例如:'readonly', 'report', 或直接传入 DataSource 实例
40
+ */
41
+ dataSource?: string | DataSource;
31
42
  }
32
43
  type UniqueValidationConstraints<E> = [
33
44
  (ObjectType<E> | EntitySchema<E> | string | (() => ObjectType<E> | EntitySchema<E> | string)),
@@ -24,6 +24,7 @@ const class_validator_1 = require("class-validator");
24
24
  const nestjs_i18n_1 = require("nestjs-i18n");
25
25
  const common_1 = require("@nestjs/common");
26
26
  const transaction_1 = require("../transaction");
27
+ const transaction_2 = require("../transaction");
27
28
  let IsUniqueValidator = class IsUniqueValidator {
28
29
  constructor() { }
29
30
  /**
@@ -80,12 +81,36 @@ let IsUniqueValidator = class IsUniqueValidator {
80
81
  const entityName = name.charAt(0).toUpperCase() + name.slice(1) + 'Entity';
81
82
  return entityName;
82
83
  }
84
+ /**
85
+ * 获取数据源
86
+ * 支持多数据源配置,保持向后兼容
87
+ */
88
+ getDataSource(dataSourceOrName) {
89
+ // 1. 如果传入的是 DataSource 实例,直接返回
90
+ if (dataSourceOrName && typeof dataSourceOrName !== 'string') {
91
+ return dataSourceOrName;
92
+ }
93
+ // 2. 如果传入的是数据源名称,获取对应的数据源
94
+ if (typeof dataSourceOrName === 'string') {
95
+ return (0, transaction_2.getDataSource)(dataSourceOrName);
96
+ }
97
+ // 3. 默认:尝试从请求上下文获取,然后获取 default 数据源
98
+ try {
99
+ return transaction_1.TransactionContextService.getDataSource();
100
+ }
101
+ catch (_a) {
102
+ return (0, transaction_2.getDataSource)('default');
103
+ }
104
+ }
83
105
  validate(value, args) {
84
106
  return __awaiter(this, void 0, void 0, function* () {
85
107
  const [entityRef, findCondition, options] = args.constraints;
86
108
  // 解析 Entity 引用
87
109
  const entityClass = this.resolveEntity(entityRef, args.property, args.object);
88
- const repository = transaction_1.TransactionContextService.getDataSource().getRepository(entityClass);
110
+ // 获取数据源(支持多数据源)
111
+ const dataSourceName = (options === null || options === void 0 ? void 0 : options.dataSource) || 'default';
112
+ const dataSource = this.getDataSource(dataSourceName);
113
+ const repository = dataSource.getRepository(entityClass);
89
114
  args.value = value;
90
115
  let exists;
91
116
  const defCon = findCondition(args);