@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.
- package/cache/dependencies/db.dependency.d.ts +55 -6
- package/cache/dependencies/db.dependency.js +64 -13
- package/common/boilerplate.polyfill.js +1 -1
- package/file-upload/decorators/column.decorator.d.ts +151 -0
- package/file-upload/decorators/column.decorator.js +273 -0
- package/file-upload/decorators/csv-data.decorator.d.ts +17 -31
- package/file-upload/decorators/csv-data.decorator.js +45 -91
- package/file-upload/decorators/csv-import.decorator.d.ts +34 -0
- package/file-upload/decorators/csv-import.decorator.js +24 -0
- package/file-upload/decorators/examples/column-mapping.example.d.ts +76 -0
- package/file-upload/decorators/examples/column-mapping.example.js +122 -0
- package/file-upload/decorators/excel-data.decorator.d.ts +15 -29
- package/file-upload/decorators/excel-data.decorator.js +42 -82
- package/file-upload/decorators/index.d.ts +3 -2
- package/file-upload/decorators/index.js +20 -2
- package/file-upload/decorators/validate-data.decorator.d.ts +91 -0
- package/file-upload/decorators/validate-data.decorator.js +39 -0
- package/file-upload/dto/update-file.dto.d.ts +0 -1
- package/file-upload/dto/update-file.dto.js +0 -4
- package/file-upload/entities/file-metadata.entity.d.ts +6 -3
- package/file-upload/entities/file-metadata.entity.js +2 -10
- package/file-upload/entities/file.entity.d.ts +3 -18
- package/file-upload/entities/file.entity.js +0 -34
- package/file-upload/file-upload.module.d.ts +1 -1
- package/file-upload/file-upload.module.js +44 -16
- package/file-upload/index.d.ts +13 -2
- package/file-upload/index.js +21 -3
- package/file-upload/interceptors/file-upload.interceptor.d.ts +61 -8
- package/file-upload/interceptors/file-upload.interceptor.js +417 -257
- package/file-upload/interfaces/file-processor.interface.d.ts +93 -0
- package/file-upload/interfaces/file-processor.interface.js +2 -0
- package/file-upload/interfaces/file-upload-options.interface.d.ts +3 -46
- package/file-upload/interfaces/file-upload-options.interface.js +3 -0
- package/file-upload/interfaces/processor-options.interface.d.ts +102 -0
- package/file-upload/interfaces/processor-options.interface.js +2 -0
- package/file-upload/processors/csv.processor.d.ts +98 -0
- package/file-upload/processors/csv.processor.js +391 -0
- package/file-upload/processors/excel.processor.d.ts +130 -0
- package/file-upload/processors/excel.processor.js +547 -0
- package/file-upload/processors/image.processor.d.ts +199 -0
- package/file-upload/processors/image.processor.js +377 -0
- package/file-upload/services/file.service.d.ts +3 -0
- package/file-upload/services/file.service.js +39 -10
- package/file-upload/services/malicious-file-detector.service.d.ts +29 -3
- package/file-upload/services/malicious-file-detector.service.js +256 -57
- package/file-upload/utils/dynamic-import.util.d.ts +6 -2
- package/file-upload/utils/dynamic-import.util.js +17 -5
- package/http-client/decorators/http-client.decorators.d.ts +4 -2
- package/http-client/decorators/http-client.decorators.js +2 -1
- package/http-client/entities/http-log.entity.js +1 -9
- package/http-client/examples/proxy-from-environment.example.d.ts +133 -0
- package/http-client/examples/proxy-from-environment.example.js +410 -0
- package/http-client/http-client.module.js +65 -6
- package/http-client/interfaces/http-client-config.interface.d.ts +6 -0
- package/http-client/services/http-client.service.d.ts +8 -0
- package/http-client/services/http-client.service.js +61 -17
- package/http-client/services/logging.service.d.ts +1 -1
- package/http-client/services/logging.service.js +74 -58
- package/http-client/utils/index.d.ts +1 -0
- package/http-client/utils/index.js +1 -0
- package/http-client/utils/proxy-environment.util.d.ts +42 -0
- package/http-client/utils/proxy-environment.util.js +148 -0
- package/package.json +9 -5
- package/shared/service-registry.module.js +18 -0
- package/transaction/data-source.util.d.ts +142 -0
- package/transaction/data-source.util.js +330 -0
- package/transaction/index.d.ts +1 -0
- package/transaction/index.js +12 -1
- package/validators/is-exists.validator.d.ts +19 -2
- package/validators/is-exists.validator.js +27 -2
- package/validators/is-unique.validator.d.ts +12 -1
- 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);
|
package/transaction/index.d.ts
CHANGED
|
@@ -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';
|
package/transaction/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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);
|