sa2kit 1.0.0 → 1.0.2
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/dist/UniversalFileService-CEZRJ87g.d.mts +727 -0
- package/dist/UniversalFileService-CEZRJ87g.d.ts +727 -0
- package/dist/api/index.d.mts +248 -0
- package/dist/api/index.d.ts +248 -0
- package/dist/api/index.js +294 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/index.mjs +290 -0
- package/dist/api/index.mjs.map +1 -0
- package/dist/auth/client/index.d.mts +52 -3
- package/dist/auth/client/index.d.ts +52 -3
- package/dist/auth/components/index.d.mts +149 -4
- package/dist/auth/components/index.d.ts +149 -4
- package/dist/auth/components/index.js +243 -9
- package/dist/auth/components/index.js.map +1 -1
- package/dist/auth/components/index.mjs +237 -4
- package/dist/auth/components/index.mjs.map +1 -1
- package/dist/auth/hooks/index.d.mts +31 -2
- package/dist/auth/hooks/index.d.ts +31 -2
- package/dist/auth/index.d.mts +5 -5
- package/dist/auth/index.d.ts +5 -5
- package/dist/auth/index.js +49 -17
- package/dist/auth/index.mjs +1 -1
- package/dist/auth/routes/index.d.mts +103 -5
- package/dist/auth/routes/index.d.ts +103 -5
- package/dist/auth/routes/index.js +37 -5
- package/dist/auth/routes/index.mjs +1 -1
- package/dist/chunk-42IJ7HEI.js +573 -0
- package/dist/chunk-42IJ7HEI.js.map +1 -0
- package/dist/chunk-7XLFSPDG.mjs +31 -0
- package/dist/chunk-7XLFSPDG.mjs.map +1 -0
- package/dist/chunk-GCVOKQZP.js +36 -0
- package/dist/chunk-GCVOKQZP.js.map +1 -0
- package/dist/chunk-IBLB7ARJ.mjs +560 -0
- package/dist/chunk-IBLB7ARJ.mjs.map +1 -0
- package/dist/{chunk-6FNUWAIV.js → chunk-LX4XX6W7.js} +54 -8
- package/dist/chunk-LX4XX6W7.js.map +1 -0
- package/dist/{chunk-HXFFYNIF.mjs → chunk-T5OZHYVM.mjs} +54 -8
- package/dist/chunk-T5OZHYVM.mjs.map +1 -0
- package/dist/config/server/index.d.mts +1533 -0
- package/dist/config/server/index.d.ts +1533 -0
- package/dist/config/server/index.js +1177 -0
- package/dist/config/server/index.js.map +1 -0
- package/dist/config/server/index.mjs +1138 -0
- package/dist/config/server/index.mjs.map +1 -0
- package/dist/i18n/index.d.mts +2 -1
- package/dist/i18n/index.d.ts +2 -1
- package/dist/i18n/index.js +125 -61
- package/dist/i18n/index.js.map +1 -1
- package/dist/i18n/index.mjs +126 -62
- package/dist/i18n/index.mjs.map +1 -1
- package/dist/index.js +6 -6
- package/dist/index.mjs +1 -1
- package/dist/mmd/index.d.mts +346 -0
- package/dist/mmd/index.d.ts +346 -0
- package/dist/mmd/index.js +1535 -0
- package/dist/mmd/index.js.map +1 -0
- package/dist/mmd/index.mjs +1503 -0
- package/dist/mmd/index.mjs.map +1 -0
- package/dist/storage/index.d.mts +1 -0
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.js +9 -9
- package/dist/storage/index.mjs +1 -1
- package/dist/{index-8VoHap_4.d.mts → types-CroexXnI.d.ts} +38 -44
- package/dist/{index-8VoHap_4.d.ts → types-DmsXCWvm.d.mts} +38 -44
- package/dist/{types-DAxQ1MeY.d.ts → types-Dt0oqeFM.d.mts} +1 -1
- package/dist/{types-DT8LVCvE.d.mts → types-zK6kDzDQ.d.ts} +1 -1
- package/dist/universalExport/index.js +17 -32
- package/dist/universalExport/index.js.map +1 -1
- package/dist/universalExport/index.mjs +2 -29
- package/dist/universalExport/index.mjs.map +1 -1
- package/dist/universalExport/server/index.d.mts +849 -8
- package/dist/universalExport/server/index.d.ts +849 -8
- package/dist/universalExport/server/index.js +1382 -2
- package/dist/universalExport/server/index.js.map +1 -1
- package/dist/universalExport/server/index.mjs +1355 -3
- package/dist/universalExport/server/index.mjs.map +1 -1
- package/dist/universalFile/index.d.mts +54 -3
- package/dist/universalFile/index.d.ts +54 -3
- package/dist/universalFile/index.js +272 -0
- package/dist/universalFile/index.js.map +1 -1
- package/dist/universalFile/index.mjs +267 -1
- package/dist/universalFile/index.mjs.map +1 -1
- package/dist/universalFile/server/index.d.mts +2541 -469
- package/dist/universalFile/server/index.d.ts +2541 -469
- package/dist/universalFile/server/index.js +830 -64
- package/dist/universalFile/server/index.js.map +1 -1
- package/dist/universalFile/server/index.mjs +803 -66
- package/dist/universalFile/server/index.mjs.map +1 -1
- package/package.json +47 -23
- package/dist/chunk-6FNUWAIV.js.map +0 -1
- package/dist/chunk-APY57REU.js +0 -300
- package/dist/chunk-APY57REU.js.map +0 -1
- package/dist/chunk-C64RY2OW.mjs +0 -295
- package/dist/chunk-C64RY2OW.mjs.map +0 -1
- package/dist/chunk-HXFFYNIF.mjs.map +0 -1
- package/dist/types-CoGG1rNV.d.mts +0 -258
- package/dist/types-CoGG1rNV.d.ts +0 -258
- package/dist/types-DW9qar-w.d.mts +0 -52
- package/dist/types-DW9qar-w.d.ts +0 -52
|
@@ -14,6 +14,7 @@ var uuid = require('uuid');
|
|
|
14
14
|
var lruCache = require('lru-cache');
|
|
15
15
|
var server = require('next/server');
|
|
16
16
|
var drizzleOrm = require('drizzle-orm');
|
|
17
|
+
var pgCore = require('drizzle-orm/pg-core');
|
|
17
18
|
|
|
18
19
|
function _interopNamespace(e) {
|
|
19
20
|
if (e && e.__esModule) return e;
|
|
@@ -471,10 +472,10 @@ var AliyunCDNProvider = class {
|
|
|
471
472
|
return cdnUrl;
|
|
472
473
|
}
|
|
473
474
|
const parsedUrl = new URL(cdnUrl);
|
|
474
|
-
const
|
|
475
|
-
const signString = `${parsedUrl.pathname}-${
|
|
475
|
+
const timestamp2 = Math.floor(Date.now() / 1e3) + expiresIn;
|
|
476
|
+
const signString = `${parsedUrl.pathname}-${timestamp2}-0-0-${authKey}`;
|
|
476
477
|
const authValue = crypto.createHash("md5").update(signString).digest("hex");
|
|
477
|
-
const signedUrl = `${cdnUrl}?auth_key=${
|
|
478
|
+
const signedUrl = `${cdnUrl}?auth_key=${timestamp2}-0-0-${authValue}`;
|
|
478
479
|
logger.info(`\u2705 [AliyunCDNProvider] \u9632\u76D7\u94FE\u7B7E\u540DURL\u751F\u6210\u5B8C\u6210`);
|
|
479
480
|
return signedUrl;
|
|
480
481
|
} catch (error) {
|
|
@@ -1313,7 +1314,7 @@ var ImageProcessor = class {
|
|
|
1313
1314
|
/**
|
|
1314
1315
|
* 创建文字水印SVG
|
|
1315
1316
|
*/
|
|
1316
|
-
createTextWatermarkSvg(
|
|
1317
|
+
createTextWatermarkSvg(text2, opacity) {
|
|
1317
1318
|
const fontSize = 24;
|
|
1318
1319
|
const padding = 10;
|
|
1319
1320
|
return `
|
|
@@ -1329,7 +1330,7 @@ var ImageProcessor = class {
|
|
|
1329
1330
|
stroke-width="1"
|
|
1330
1331
|
stroke-opacity="${opacity * 0.8}"
|
|
1331
1332
|
>
|
|
1332
|
-
${
|
|
1333
|
+
${text2}
|
|
1333
1334
|
</text>
|
|
1334
1335
|
</svg>
|
|
1335
1336
|
`.trim();
|
|
@@ -3016,13 +3017,9 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3016
3017
|
async reinitializeStorageProviders() {
|
|
3017
3018
|
logger6.info("\u{1F504} [UniversalFileService] \u91CD\u65B0\u521D\u59CB\u5316\u5B58\u50A8\u63D0\u4F9B\u8005...");
|
|
3018
3019
|
try {
|
|
3019
|
-
const
|
|
3020
|
-
if (
|
|
3021
|
-
|
|
3022
|
-
if (ossProvider && "reinitialize" in ossProvider) {
|
|
3023
|
-
logger6.info("\u{1F504} [UniversalFileService] \u91CD\u65B0\u521D\u59CB\u5316\u963F\u91CC\u4E91OSS\u63D0\u4F9B\u8005...");
|
|
3024
|
-
await ossProvider.reinitialize(ossConfig);
|
|
3025
|
-
}
|
|
3020
|
+
const ossProvider = this.storageProviders.get("aliyun-oss");
|
|
3021
|
+
if (ossProvider && "reinitialize" in ossProvider) {
|
|
3022
|
+
logger6.info("\u{1F504} [UniversalFileService] \u91CD\u65B0\u521D\u59CB\u5316\u963F\u91CC\u4E91OSS\u63D0\u4F9B\u8005...");
|
|
3026
3023
|
}
|
|
3027
3024
|
logger6.info("\u2705 [UniversalFileService] \u5B58\u50A8\u63D0\u4F9B\u8005\u91CD\u65B0\u521D\u59CB\u5316\u5B8C\u6210");
|
|
3028
3025
|
} catch (error) {
|
|
@@ -3176,68 +3173,54 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3176
3173
|
if (this.storageProviders.size === 0) {
|
|
3177
3174
|
await this.registerDefaultStorageProviders();
|
|
3178
3175
|
}
|
|
3179
|
-
|
|
3180
|
-
|
|
3181
|
-
|
|
3182
|
-
|
|
3183
|
-
|
|
3184
|
-
|
|
3185
|
-
|
|
3186
|
-
|
|
3187
|
-
|
|
3176
|
+
if (this.config.storageProviders) {
|
|
3177
|
+
for (const [type, config] of Object.entries(this.config.storageProviders)) {
|
|
3178
|
+
if (config && config.enabled) {
|
|
3179
|
+
const provider = this.storageProviders.get(type);
|
|
3180
|
+
if (provider) {
|
|
3181
|
+
try {
|
|
3182
|
+
await provider.initialize(config);
|
|
3183
|
+
logger6.info(`\u2705 [UniversalFileService] \u5B58\u50A8\u63D0\u4F9B\u8005\u521D\u59CB\u5316\u5B8C\u6210: ${type}`);
|
|
3184
|
+
} catch (error) {
|
|
3185
|
+
console.warn(`\u26A0\uFE0F [UniversalFileService] \u5B58\u50A8\u63D0\u4F9B\u8005\u521D\u59CB\u5316\u5931\u8D25: ${type}:`, error);
|
|
3186
|
+
}
|
|
3187
|
+
} else {
|
|
3188
|
+
console.warn(`\u26A0\uFE0F [UniversalFileService] \u5B58\u50A8\u63D0\u4F9B\u8005\u672A\u6CE8\u518C: ${type}`);
|
|
3188
3189
|
}
|
|
3189
|
-
} else {
|
|
3190
|
-
console.warn(`\u26A0\uFE0F [UniversalFileService] \u5B58\u50A8\u63D0\u4F9B\u8005\u672A\u6CE8\u518C: ${type}`);
|
|
3191
3190
|
}
|
|
3192
3191
|
}
|
|
3193
3192
|
}
|
|
3194
3193
|
}
|
|
3195
3194
|
async registerDefaultStorageProviders() {
|
|
3196
3195
|
logger6.info("\u{1F4E6} [UniversalFileService] \u6CE8\u518C\u9ED8\u8BA4\u5B58\u50A8\u63D0\u4F9B\u8005...");
|
|
3197
|
-
|
|
3198
|
-
|
|
3199
|
-
|
|
3200
|
-
|
|
3201
|
-
|
|
3202
|
-
|
|
3203
|
-
|
|
3204
|
-
|
|
3205
|
-
|
|
3206
|
-
|
|
3207
|
-
|
|
3208
|
-
|
|
3209
|
-
|
|
3210
|
-
try {
|
|
3211
|
-
const { LocalStorageProvider: LocalStorageProvider2 } = await import('../../LocalStorageProvider-NBNHHWLY.js');
|
|
3212
|
-
const localProvider = new LocalStorageProvider2();
|
|
3213
|
-
this.registerStorageProvider(localProvider);
|
|
3214
|
-
logger6.info("\u2705 [UniversalFileService] \u672C\u5730\u5B58\u50A8\u63D0\u4F9B\u8005\u6CE8\u518C\u6210\u529F");
|
|
3215
|
-
} catch (error) {
|
|
3216
|
-
console.warn("\u26A0\uFE0F [UniversalFileService] \u672C\u5730\u5B58\u50A8\u63D0\u4F9B\u8005\u6CE8\u518C\u5931\u8D25:", error);
|
|
3196
|
+
try {
|
|
3197
|
+
if (this.config.storage) {
|
|
3198
|
+
if (this.config.storage.type === "aliyun-oss" && this.config.storage.enabled) {
|
|
3199
|
+
const { AliyunOSSProvider: AliyunOSSProvider2 } = await import('../../AliyunOSSProvider-7JLMJDXK.js');
|
|
3200
|
+
const ossProvider = new AliyunOSSProvider2();
|
|
3201
|
+
this.registerStorageProvider(ossProvider);
|
|
3202
|
+
logger6.info("\u2705 [UniversalFileService] \u963F\u91CC\u4E91OSS\u63D0\u4F9B\u8005\u6CE8\u518C\u6210\u529F");
|
|
3203
|
+
} else if (this.config.storage.type === "local" && this.config.storage.enabled) {
|
|
3204
|
+
const { LocalStorageProvider: LocalStorageProvider2 } = await import('../../LocalStorageProvider-NBNHHWLY.js');
|
|
3205
|
+
const localProvider = new LocalStorageProvider2();
|
|
3206
|
+
this.registerStorageProvider(localProvider);
|
|
3207
|
+
logger6.info("\u2705 [UniversalFileService] \u672C\u5730\u5B58\u50A8\u63D0\u4F9B\u8005\u6CE8\u518C\u6210\u529F");
|
|
3208
|
+
}
|
|
3217
3209
|
}
|
|
3218
|
-
|
|
3219
|
-
if (this.storageProviders.size === 0) {
|
|
3220
|
-
console.warn("\u26A0\uFE0F [UniversalFileService] \u6CA1\u6709\u53EF\u7528\u7684\u5B58\u50A8\u63D0\u4F9B\u8005\uFF0C\u5C1D\u8BD5\u6CE8\u518C\u672C\u5730\u5B58\u50A8\u4F5C\u4E3A\u5907\u7528");
|
|
3221
|
-
try {
|
|
3210
|
+
if (this.storageProviders.size === 0) {
|
|
3222
3211
|
const { LocalStorageProvider: LocalStorageProvider2 } = await import('../../LocalStorageProvider-NBNHHWLY.js');
|
|
3223
|
-
const
|
|
3224
|
-
this.registerStorageProvider(
|
|
3225
|
-
logger6.info("\u2705 [UniversalFileService] \u672C\u5730\u5B58\u50A8\u63D0\u4F9B\u8005
|
|
3226
|
-
} catch (error) {
|
|
3227
|
-
console.error("\u274C [UniversalFileService] \u65E0\u6CD5\u6CE8\u518C\u4EFB\u4F55\u5B58\u50A8\u63D0\u4F9B\u8005:", error);
|
|
3228
|
-
throw new Error("\u65E0\u6CD5\u521D\u59CB\u5316\u5B58\u50A8\u63D0\u4F9B\u8005");
|
|
3212
|
+
const fallbackProvider = new LocalStorageProvider2();
|
|
3213
|
+
this.registerStorageProvider(fallbackProvider);
|
|
3214
|
+
logger6.info("\u2705 [UniversalFileService] \u5DF2\u6CE8\u518C\u5907\u7528\u672C\u5730\u5B58\u50A8\u63D0\u4F9B\u8005");
|
|
3229
3215
|
}
|
|
3216
|
+
} catch (error) {
|
|
3217
|
+
console.warn("\u26A0\uFE0F [UniversalFileService] \u6CE8\u518C\u9ED8\u8BA4\u5B58\u50A8\u63D0\u4F9B\u8005\u5931\u8D25:", error);
|
|
3218
|
+
throw new Error("\u65E0\u6CD5\u521D\u59CB\u5316\u5B58\u50A8\u63D0\u4F9B\u8005");
|
|
3230
3219
|
}
|
|
3231
3220
|
}
|
|
3232
3221
|
async initializeCDNProviders() {
|
|
3233
|
-
|
|
3234
|
-
|
|
3235
|
-
const provider = this.cdnProviders.get(type);
|
|
3236
|
-
if (provider) {
|
|
3237
|
-
await provider.initialize(config);
|
|
3238
|
-
logger6.info(`\u2705 [UniversalFileService] CDN\u63D0\u4F9B\u8005\u521D\u59CB\u5316\u5B8C\u6210: ${type}`);
|
|
3239
|
-
}
|
|
3240
|
-
}
|
|
3222
|
+
if (this.config.cdn && this.config.cdn.enabled) {
|
|
3223
|
+
logger6.info(`\u2705 [UniversalFileService] CDN\u914D\u7F6E\u5DF2\u542F\u7528: ${this.config.cdn.type}`);
|
|
3241
3224
|
}
|
|
3242
3225
|
}
|
|
3243
3226
|
async initializeFileProcessors() {
|
|
@@ -3247,11 +3230,11 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3247
3230
|
}
|
|
3248
3231
|
}
|
|
3249
3232
|
async validateFile(file) {
|
|
3250
|
-
if (file.size > this.config.maxFileSize) {
|
|
3233
|
+
if (this.config.maxFileSize && file.size > this.config.maxFileSize) {
|
|
3251
3234
|
throw new chunkHWJ34NL6_js.FileUploadError(`\u6587\u4EF6\u5927\u5C0F\u8D85\u8FC7\u9650\u5236: ${file.size} > ${this.config.maxFileSize}`);
|
|
3252
3235
|
}
|
|
3253
3236
|
const mimeType = file.type || getMimeType(file.name);
|
|
3254
|
-
if (this.config.allowedMimeTypes.length > 0 && !this.config.allowedMimeTypes.includes(mimeType)) {
|
|
3237
|
+
if (this.config.allowedMimeTypes && this.config.allowedMimeTypes.length > 0 && !this.config.allowedMimeTypes.includes(mimeType)) {
|
|
3255
3238
|
throw new chunkHWJ34NL6_js.FileUploadError(`\u4E0D\u652F\u6301\u7684\u6587\u4EF6\u7C7B\u578B: ${mimeType}`);
|
|
3256
3239
|
}
|
|
3257
3240
|
}
|
|
@@ -3273,7 +3256,7 @@ var UniversalFileService = class extends events.EventEmitter {
|
|
|
3273
3256
|
uploaderId: fileInfo.metadata?.uploadedBy || "system",
|
|
3274
3257
|
moduleId: fileInfo.moduleId,
|
|
3275
3258
|
businessId: fileInfo.businessId,
|
|
3276
|
-
storageProvider: this.config.defaultStorage,
|
|
3259
|
+
storageProvider: this.config.defaultStorage || "local",
|
|
3277
3260
|
storagePath: "",
|
|
3278
3261
|
accessCount: 0,
|
|
3279
3262
|
metadata: fileInfo.metadata || {}
|
|
@@ -4535,6 +4518,760 @@ function createDrizzleRepository(config) {
|
|
|
4535
4518
|
};
|
|
4536
4519
|
}
|
|
4537
4520
|
|
|
4521
|
+
// src/universalFile/server/config-helpers.ts
|
|
4522
|
+
var logger9 = chunk6PRFP5EG_js.createLogger("FileConfigHelpers");
|
|
4523
|
+
var DEFAULT_MAX_FILE_SIZE = 104857600;
|
|
4524
|
+
var DEFAULT_ALLOWED_MIME_TYPES = [
|
|
4525
|
+
// 图片类型
|
|
4526
|
+
"image/jpeg",
|
|
4527
|
+
"image/png",
|
|
4528
|
+
"image/gif",
|
|
4529
|
+
"image/webp",
|
|
4530
|
+
"image/svg+xml",
|
|
4531
|
+
"image/bmp",
|
|
4532
|
+
"image/tiff",
|
|
4533
|
+
// 音频类型
|
|
4534
|
+
"audio/mpeg",
|
|
4535
|
+
"audio/wav",
|
|
4536
|
+
"audio/ogg",
|
|
4537
|
+
"audio/mp4",
|
|
4538
|
+
"audio/aac",
|
|
4539
|
+
"audio/webm",
|
|
4540
|
+
"audio/flac",
|
|
4541
|
+
// 视频类型
|
|
4542
|
+
"video/mp4",
|
|
4543
|
+
"video/avi",
|
|
4544
|
+
"video/mov",
|
|
4545
|
+
"video/webm",
|
|
4546
|
+
"video/mkv",
|
|
4547
|
+
"video/mpeg",
|
|
4548
|
+
"video/quicktime",
|
|
4549
|
+
// 文档类型
|
|
4550
|
+
"application/pdf",
|
|
4551
|
+
"text/plain",
|
|
4552
|
+
"application/json",
|
|
4553
|
+
"application/javascript",
|
|
4554
|
+
"text/css",
|
|
4555
|
+
"text/html",
|
|
4556
|
+
"text/markdown",
|
|
4557
|
+
"application/xml",
|
|
4558
|
+
"text/xml",
|
|
4559
|
+
// Office 文档
|
|
4560
|
+
"application/msword",
|
|
4561
|
+
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
|
4562
|
+
"application/vnd.ms-excel",
|
|
4563
|
+
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
|
4564
|
+
"application/vnd.ms-powerpoint",
|
|
4565
|
+
"application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
|
4566
|
+
// 压缩文件
|
|
4567
|
+
"application/zip",
|
|
4568
|
+
"application/x-zip-compressed",
|
|
4569
|
+
"application/x-rar-compressed",
|
|
4570
|
+
"application/x-7z-compressed",
|
|
4571
|
+
"application/x-tar",
|
|
4572
|
+
"application/gzip",
|
|
4573
|
+
// 3D模型文件
|
|
4574
|
+
"application/octet-stream",
|
|
4575
|
+
"model/gltf+json",
|
|
4576
|
+
"model/gltf-binary",
|
|
4577
|
+
"model/obj",
|
|
4578
|
+
"model/fbx"
|
|
4579
|
+
];
|
|
4580
|
+
var DEFAULT_CACHE_CONFIG = {
|
|
4581
|
+
enabled: false,
|
|
4582
|
+
metadataTTL: 3600,
|
|
4583
|
+
// 1小时
|
|
4584
|
+
urlTTL: 1800
|
|
4585
|
+
// 30分钟
|
|
4586
|
+
};
|
|
4587
|
+
var DEFAULT_FILE_SERVICE_CONFIG = {
|
|
4588
|
+
maxFileSize: DEFAULT_MAX_FILE_SIZE,
|
|
4589
|
+
allowedMimeTypes: DEFAULT_ALLOWED_MIME_TYPES,
|
|
4590
|
+
cache: DEFAULT_CACHE_CONFIG,
|
|
4591
|
+
enableMonitoring: false
|
|
4592
|
+
};
|
|
4593
|
+
function loadOSSConfigFromEnv() {
|
|
4594
|
+
const region = process.env.ALIYUN_OSS_REGION;
|
|
4595
|
+
const bucket = process.env.ALIYUN_OSS_BUCKET;
|
|
4596
|
+
const accessKeyId = process.env.ALIYUN_OSS_ACCESS_KEY_ID;
|
|
4597
|
+
const accessKeySecret = process.env.ALIYUN_OSS_ACCESS_KEY_SECRET;
|
|
4598
|
+
if (!region || !bucket || !accessKeyId || !accessKeySecret) {
|
|
4599
|
+
logger9.debug("OSS \u73AF\u5883\u53D8\u91CF\u914D\u7F6E\u4E0D\u5B8C\u6574", {
|
|
4600
|
+
hasRegion: !!region,
|
|
4601
|
+
hasBucket: !!bucket,
|
|
4602
|
+
hasAccessKeyId: !!accessKeyId,
|
|
4603
|
+
hasAccessKeySecret: !!accessKeySecret
|
|
4604
|
+
});
|
|
4605
|
+
return null;
|
|
4606
|
+
}
|
|
4607
|
+
const config = {
|
|
4608
|
+
type: "aliyun-oss",
|
|
4609
|
+
enabled: true,
|
|
4610
|
+
region,
|
|
4611
|
+
bucket,
|
|
4612
|
+
accessKeyId,
|
|
4613
|
+
accessKeySecret,
|
|
4614
|
+
customDomain: process.env.ALIYUN_OSS_CUSTOM_DOMAIN,
|
|
4615
|
+
secure: process.env.ALIYUN_OSS_SECURE === "true",
|
|
4616
|
+
internal: process.env.ALIYUN_OSS_INTERNAL === "true"
|
|
4617
|
+
};
|
|
4618
|
+
logger9.info("\u2705 \u4ECE\u73AF\u5883\u53D8\u91CF\u52A0\u8F7D OSS \u914D\u7F6E\u6210\u529F", {
|
|
4619
|
+
region: config.region,
|
|
4620
|
+
bucket: config.bucket,
|
|
4621
|
+
hasCustomDomain: !!config.customDomain
|
|
4622
|
+
});
|
|
4623
|
+
return config;
|
|
4624
|
+
}
|
|
4625
|
+
function loadCDNConfigFromEnv() {
|
|
4626
|
+
const domain = process.env.ALIYUN_CDN_DOMAIN;
|
|
4627
|
+
const accessKeyId = process.env.ALIYUN_CDN_ACCESS_KEY_ID;
|
|
4628
|
+
const accessKeySecret = process.env.ALIYUN_CDN_ACCESS_KEY_SECRET;
|
|
4629
|
+
if (!domain || !accessKeyId || !accessKeySecret) {
|
|
4630
|
+
logger9.debug("CDN \u73AF\u5883\u53D8\u91CF\u672A\u914D\u7F6E\u6216\u4E0D\u5B8C\u6574");
|
|
4631
|
+
return null;
|
|
4632
|
+
}
|
|
4633
|
+
const config = {
|
|
4634
|
+
type: "aliyun-cdn",
|
|
4635
|
+
enabled: true,
|
|
4636
|
+
domain,
|
|
4637
|
+
accessKeyId,
|
|
4638
|
+
accessKeySecret,
|
|
4639
|
+
region: process.env.ALIYUN_CDN_REGION
|
|
4640
|
+
};
|
|
4641
|
+
logger9.info("\u2705 \u4ECE\u73AF\u5883\u53D8\u91CF\u52A0\u8F7D CDN \u914D\u7F6E\u6210\u529F", {
|
|
4642
|
+
domain: config.domain
|
|
4643
|
+
});
|
|
4644
|
+
return config;
|
|
4645
|
+
}
|
|
4646
|
+
function getDefaultLocalStorage() {
|
|
4647
|
+
return {
|
|
4648
|
+
type: "local",
|
|
4649
|
+
enabled: true,
|
|
4650
|
+
rootPath: process.env.FILE_STORAGE_PATH || "uploads",
|
|
4651
|
+
baseUrl: process.env.FILE_BASE_URL || "/uploads"
|
|
4652
|
+
};
|
|
4653
|
+
}
|
|
4654
|
+
function loadConfigFromEnv() {
|
|
4655
|
+
logger9.info("\u4ECE\u73AF\u5883\u53D8\u91CF\u52A0\u8F7D\u6587\u4EF6\u670D\u52A1\u914D\u7F6E...");
|
|
4656
|
+
const ossConfig = loadOSSConfigFromEnv();
|
|
4657
|
+
const cdnConfig = loadCDNConfigFromEnv();
|
|
4658
|
+
const storage = ossConfig || getDefaultLocalStorage();
|
|
4659
|
+
const defaultStorage = ossConfig ? "aliyun-oss" : "local";
|
|
4660
|
+
logger9.info(`\u4F7F\u7528\u5B58\u50A8\u65B9\u5F0F: ${defaultStorage}`);
|
|
4661
|
+
const config = {
|
|
4662
|
+
storage,
|
|
4663
|
+
defaultStorage,
|
|
4664
|
+
cdn: cdnConfig || void 0,
|
|
4665
|
+
defaultCDN: cdnConfig ? "aliyun-cdn" : "none",
|
|
4666
|
+
maxFileSize: process.env.MAX_FILE_SIZE ? parseInt(process.env.MAX_FILE_SIZE) : DEFAULT_MAX_FILE_SIZE,
|
|
4667
|
+
allowedMimeTypes: DEFAULT_ALLOWED_MIME_TYPES,
|
|
4668
|
+
cache: {
|
|
4669
|
+
enabled: process.env.ENABLE_CACHE === "true",
|
|
4670
|
+
metadataTTL: process.env.METADATA_CACHE_TTL ? parseInt(process.env.METADATA_CACHE_TTL) : DEFAULT_CACHE_CONFIG.metadataTTL,
|
|
4671
|
+
urlTTL: process.env.URL_CACHE_TTL ? parseInt(process.env.URL_CACHE_TTL) : DEFAULT_CACHE_CONFIG.urlTTL
|
|
4672
|
+
},
|
|
4673
|
+
enableMonitoring: process.env.ENABLE_FILE_MONITORING === "true"
|
|
4674
|
+
};
|
|
4675
|
+
logger9.info("\u2705 \u914D\u7F6E\u52A0\u8F7D\u5B8C\u6210");
|
|
4676
|
+
return config;
|
|
4677
|
+
}
|
|
4678
|
+
var DEFAULT_OSS_CONFIG_KEYS = {
|
|
4679
|
+
region: "aliyun_oss_region",
|
|
4680
|
+
bucket: "aliyun_oss_bucket",
|
|
4681
|
+
accessKeyId: "aliyun_oss_access_key_id",
|
|
4682
|
+
accessKeySecret: "aliyun_oss_access_key_secret",
|
|
4683
|
+
customDomain: "aliyun_oss_custom_domain",
|
|
4684
|
+
secure: "aliyun_oss_secure",
|
|
4685
|
+
internal: "aliyun_oss_internal"
|
|
4686
|
+
};
|
|
4687
|
+
async function loadOSSConfigFromService(configService, keyMapping = DEFAULT_OSS_CONFIG_KEYS) {
|
|
4688
|
+
const logger10 = chunk6PRFP5EG_js.createLogger("loadOSSConfigFromService");
|
|
4689
|
+
try {
|
|
4690
|
+
const keys = { ...DEFAULT_OSS_CONFIG_KEYS, ...keyMapping };
|
|
4691
|
+
const [region, bucket, accessKeyId, accessKeySecret, customDomain, secure, internal] = await Promise.all([
|
|
4692
|
+
configService.getConfig(keys.region),
|
|
4693
|
+
configService.getConfig(keys.bucket),
|
|
4694
|
+
configService.getConfig(keys.accessKeyId),
|
|
4695
|
+
configService.getConfig(keys.accessKeySecret),
|
|
4696
|
+
configService.getConfig(keys.customDomain || ""),
|
|
4697
|
+
configService.getConfig(keys.secure || ""),
|
|
4698
|
+
configService.getConfig(keys.internal || "")
|
|
4699
|
+
]);
|
|
4700
|
+
if (!region || !bucket || !accessKeyId || !accessKeySecret) {
|
|
4701
|
+
logger10.debug("\u914D\u7F6E\u670D\u52A1\u4E2D\u7684 OSS \u914D\u7F6E\u4E0D\u5B8C\u6574");
|
|
4702
|
+
return null;
|
|
4703
|
+
}
|
|
4704
|
+
const config = {
|
|
4705
|
+
type: "aliyun-oss",
|
|
4706
|
+
enabled: true,
|
|
4707
|
+
region,
|
|
4708
|
+
bucket,
|
|
4709
|
+
accessKeyId,
|
|
4710
|
+
accessKeySecret,
|
|
4711
|
+
customDomain,
|
|
4712
|
+
secure: secure === "true" || secure === true,
|
|
4713
|
+
internal: internal === "true" || internal === true
|
|
4714
|
+
};
|
|
4715
|
+
logger10.info("\u2705 \u4ECE\u914D\u7F6E\u670D\u52A1\u52A0\u8F7D OSS \u914D\u7F6E\u6210\u529F");
|
|
4716
|
+
return config;
|
|
4717
|
+
} catch (error) {
|
|
4718
|
+
logger10.warn("\u4ECE\u914D\u7F6E\u670D\u52A1\u52A0\u8F7D OSS \u914D\u7F6E\u5931\u8D25:", error);
|
|
4719
|
+
return null;
|
|
4720
|
+
}
|
|
4721
|
+
}
|
|
4722
|
+
async function loadConfigWithFallback(loaders) {
|
|
4723
|
+
for (const loader of loaders) {
|
|
4724
|
+
try {
|
|
4725
|
+
const config = await loader();
|
|
4726
|
+
if (config) {
|
|
4727
|
+
return config;
|
|
4728
|
+
}
|
|
4729
|
+
} catch (error) {
|
|
4730
|
+
continue;
|
|
4731
|
+
}
|
|
4732
|
+
}
|
|
4733
|
+
return null;
|
|
4734
|
+
}
|
|
4735
|
+
async function createFileServiceWithFactory(options = {}) {
|
|
4736
|
+
const {
|
|
4737
|
+
configLoaders = [() => Promise.resolve(loadConfigFromEnv())],
|
|
4738
|
+
repository,
|
|
4739
|
+
customConfig,
|
|
4740
|
+
autoInitialize = false
|
|
4741
|
+
} = options;
|
|
4742
|
+
const logger10 = chunk6PRFP5EG_js.createLogger("FileServiceFactory");
|
|
4743
|
+
logger10.info("\u521B\u5EFA\u6587\u4EF6\u670D\u52A1...");
|
|
4744
|
+
let config = null;
|
|
4745
|
+
for (const loader of configLoaders) {
|
|
4746
|
+
try {
|
|
4747
|
+
const loadedConfig = await loader();
|
|
4748
|
+
if (loadedConfig) {
|
|
4749
|
+
config = loadedConfig;
|
|
4750
|
+
break;
|
|
4751
|
+
}
|
|
4752
|
+
} catch (error) {
|
|
4753
|
+
logger10.warn("\u914D\u7F6E\u52A0\u8F7D\u5668\u5931\u8D25:", error);
|
|
4754
|
+
continue;
|
|
4755
|
+
}
|
|
4756
|
+
}
|
|
4757
|
+
if (!config) {
|
|
4758
|
+
throw new Error("\u65E0\u6CD5\u52A0\u8F7D\u6587\u4EF6\u670D\u52A1\u914D\u7F6E\uFF1A\u6240\u6709\u914D\u7F6E\u6E90\u90FD\u5931\u8D25");
|
|
4759
|
+
}
|
|
4760
|
+
const finalConfig = {
|
|
4761
|
+
...config,
|
|
4762
|
+
...customConfig
|
|
4763
|
+
};
|
|
4764
|
+
if (repository) {
|
|
4765
|
+
finalConfig.persistence = {
|
|
4766
|
+
enabled: true,
|
|
4767
|
+
repository,
|
|
4768
|
+
autoPersist: true
|
|
4769
|
+
};
|
|
4770
|
+
}
|
|
4771
|
+
const service = new UniversalFileService(finalConfig);
|
|
4772
|
+
if (autoInitialize) {
|
|
4773
|
+
await service.initialize();
|
|
4774
|
+
logger10.info("\u2705 \u6587\u4EF6\u670D\u52A1\u521B\u5EFA\u5E76\u521D\u59CB\u5316\u5B8C\u6210");
|
|
4775
|
+
} else {
|
|
4776
|
+
logger10.info("\u2705 \u6587\u4EF6\u670D\u52A1\u521B\u5EFA\u5B8C\u6210");
|
|
4777
|
+
}
|
|
4778
|
+
return service;
|
|
4779
|
+
}
|
|
4780
|
+
function createSingleton(factory, options = {}) {
|
|
4781
|
+
const { autoInitialize = true, name = "Singleton" } = options;
|
|
4782
|
+
const singletonLogger = chunk6PRFP5EG_js.createLogger(name);
|
|
4783
|
+
let instance = null;
|
|
4784
|
+
let initPromise = null;
|
|
4785
|
+
return {
|
|
4786
|
+
async get() {
|
|
4787
|
+
if (instance) {
|
|
4788
|
+
return instance;
|
|
4789
|
+
}
|
|
4790
|
+
if (initPromise) {
|
|
4791
|
+
singletonLogger.debug("\u7B49\u5F85\u5B9E\u4F8B\u521D\u59CB\u5316\u5B8C\u6210...");
|
|
4792
|
+
return initPromise;
|
|
4793
|
+
}
|
|
4794
|
+
singletonLogger.info("\u521B\u5EFA\u5355\u4F8B\u5B9E\u4F8B...");
|
|
4795
|
+
initPromise = factory();
|
|
4796
|
+
try {
|
|
4797
|
+
instance = await initPromise;
|
|
4798
|
+
singletonLogger.info("\u2705 \u5355\u4F8B\u5B9E\u4F8B\u521B\u5EFA\u5B8C\u6210");
|
|
4799
|
+
return instance;
|
|
4800
|
+
} catch (error) {
|
|
4801
|
+
singletonLogger.error("\u274C \u5355\u4F8B\u5B9E\u4F8B\u521B\u5EFA\u5931\u8D25:", error);
|
|
4802
|
+
initPromise = null;
|
|
4803
|
+
throw error;
|
|
4804
|
+
}
|
|
4805
|
+
},
|
|
4806
|
+
reset() {
|
|
4807
|
+
if (instance) {
|
|
4808
|
+
singletonLogger.info("\u91CD\u7F6E\u5355\u4F8B\u5B9E\u4F8B");
|
|
4809
|
+
instance = null;
|
|
4810
|
+
initPromise = null;
|
|
4811
|
+
}
|
|
4812
|
+
},
|
|
4813
|
+
isCreated() {
|
|
4814
|
+
return instance !== null;
|
|
4815
|
+
}
|
|
4816
|
+
};
|
|
4817
|
+
}
|
|
4818
|
+
var fileStorageProviders = pgCore.pgTable(
|
|
4819
|
+
"file_storage_providers",
|
|
4820
|
+
{
|
|
4821
|
+
/** 主键ID */
|
|
4822
|
+
id: pgCore.serial("id").primaryKey(),
|
|
4823
|
+
/** 提供者名称 */
|
|
4824
|
+
name: pgCore.varchar("name", { length: 100 }).notNull().unique(),
|
|
4825
|
+
/** 提供者类型:local, aliyun_oss, aws_s3, qiniu, etc. */
|
|
4826
|
+
type: pgCore.varchar("type", { length: 50 }).notNull(),
|
|
4827
|
+
/** 提供者配置(JSON格式存储具体配置信息) */
|
|
4828
|
+
config: pgCore.json("config").notNull(),
|
|
4829
|
+
/** 是否启用 */
|
|
4830
|
+
isActive: pgCore.boolean("is_active").notNull().default(true),
|
|
4831
|
+
/** 是否为默认提供者 */
|
|
4832
|
+
isDefault: pgCore.boolean("is_default").notNull().default(false),
|
|
4833
|
+
/** 优先级(数字越小优先级越高) */
|
|
4834
|
+
priority: pgCore.integer("priority").notNull().default(100),
|
|
4835
|
+
/** 最大文件大小限制(字节) */
|
|
4836
|
+
maxFileSize: pgCore.bigint("max_file_size", { mode: "number" }),
|
|
4837
|
+
/** 支持的文件类型(MIME类型列表) */
|
|
4838
|
+
supportedMimeTypes: pgCore.json("supported_mime_types"),
|
|
4839
|
+
/** 创建时间 */
|
|
4840
|
+
createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
|
|
4841
|
+
/** 更新时间 */
|
|
4842
|
+
updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
|
|
4843
|
+
},
|
|
4844
|
+
(table) => ({
|
|
4845
|
+
/** 按类型查询的索引 */
|
|
4846
|
+
typeIndex: pgCore.index("storage_providers_type_idx").on(table.type),
|
|
4847
|
+
/** 按活跃状态查询的索引 */
|
|
4848
|
+
isActiveIndex: pgCore.index("storage_providers_is_active_idx").on(table.isActive),
|
|
4849
|
+
/** 按优先级排序的索引 */
|
|
4850
|
+
priorityIndex: pgCore.index("storage_providers_priority_idx").on(table.priority)
|
|
4851
|
+
})
|
|
4852
|
+
);
|
|
4853
|
+
var fileFolders = pgCore.pgTable(
|
|
4854
|
+
"file_folders",
|
|
4855
|
+
{
|
|
4856
|
+
/** 主键ID */
|
|
4857
|
+
id: pgCore.uuid("id").primaryKey().defaultRandom(),
|
|
4858
|
+
/** 文件夹名称 */
|
|
4859
|
+
name: pgCore.varchar("name", { length: 255 }).notNull(),
|
|
4860
|
+
/** 父文件夹ID(为null表示根文件夹) */
|
|
4861
|
+
parentId: pgCore.uuid("parent_id"),
|
|
4862
|
+
/** 模块ID(标识属于哪个模块) */
|
|
4863
|
+
moduleId: pgCore.varchar("module_id", { length: 100 }),
|
|
4864
|
+
/** 业务ID(具体业务实体的ID) */
|
|
4865
|
+
businessId: pgCore.varchar("business_id", { length: 255 }),
|
|
4866
|
+
/** 文件夹路径(从根到当前文件夹的完整路径) */
|
|
4867
|
+
path: pgCore.text("path").notNull(),
|
|
4868
|
+
/** 层级深度 */
|
|
4869
|
+
depth: pgCore.integer("depth").notNull().default(0),
|
|
4870
|
+
/** 显示顺序 */
|
|
4871
|
+
sortOrder: pgCore.integer("sort_order").notNull().default(0),
|
|
4872
|
+
/** 文件夹描述 */
|
|
4873
|
+
description: pgCore.text("description"),
|
|
4874
|
+
/** 是否为系统文件夹 */
|
|
4875
|
+
isSystem: pgCore.boolean("is_system").notNull().default(false),
|
|
4876
|
+
/** 创建者ID */
|
|
4877
|
+
createdBy: pgCore.varchar("created_by", { length: 255 }).notNull(),
|
|
4878
|
+
/** 创建时间 */
|
|
4879
|
+
createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
|
|
4880
|
+
/** 更新时间 */
|
|
4881
|
+
updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
|
|
4882
|
+
},
|
|
4883
|
+
(table) => ({
|
|
4884
|
+
/** 按模块查询的索引 */
|
|
4885
|
+
moduleIndex: pgCore.index("folders_module_idx").on(table.moduleId),
|
|
4886
|
+
/** 按业务ID查询的索引 */
|
|
4887
|
+
businessIndex: pgCore.index("folders_business_idx").on(table.businessId),
|
|
4888
|
+
/** 按父文件夹查询的索引 */
|
|
4889
|
+
parentIndex: pgCore.index("folders_parent_idx").on(table.parentId),
|
|
4890
|
+
/** 按路径查询的索引 */
|
|
4891
|
+
pathIndex: pgCore.index("folders_path_idx").on(table.path),
|
|
4892
|
+
/** 组合索引:模块+业务+父文件夹 */
|
|
4893
|
+
moduleBusinessParentIndex: pgCore.index("folders_module_business_parent_idx").on(
|
|
4894
|
+
table.moduleId,
|
|
4895
|
+
table.businessId,
|
|
4896
|
+
table.parentId
|
|
4897
|
+
)
|
|
4898
|
+
})
|
|
4899
|
+
);
|
|
4900
|
+
var fileMetadata = pgCore.pgTable(
|
|
4901
|
+
"file_metadata",
|
|
4902
|
+
{
|
|
4903
|
+
/** 主键ID */
|
|
4904
|
+
id: pgCore.uuid("id").primaryKey().defaultRandom(),
|
|
4905
|
+
/** 原始文件名 */
|
|
4906
|
+
originalName: pgCore.varchar("original_name", { length: 500 }).notNull(),
|
|
4907
|
+
/** 存储文件名(系统生成的唯一文件名) */
|
|
4908
|
+
storedName: pgCore.varchar("stored_name", { length: 500 }).notNull(),
|
|
4909
|
+
/** 文件扩展名 */
|
|
4910
|
+
extension: pgCore.varchar("extension", { length: 20 }),
|
|
4911
|
+
/** MIME类型 */
|
|
4912
|
+
mimeType: pgCore.varchar("mime_type", { length: 100 }).notNull(),
|
|
4913
|
+
/** 文件大小(字节) */
|
|
4914
|
+
size: pgCore.bigint("size", { mode: "number" }).notNull(),
|
|
4915
|
+
/** 文件MD5哈希值(用于去重和完整性校验) */
|
|
4916
|
+
md5Hash: pgCore.varchar("md5_hash", { length: 32 }).notNull(),
|
|
4917
|
+
/** 文件SHA256哈希值 */
|
|
4918
|
+
sha256Hash: pgCore.varchar("sha256_hash", { length: 64 }),
|
|
4919
|
+
/** 存储提供者ID */
|
|
4920
|
+
storageProviderId: pgCore.integer("storage_provider_id").references(() => fileStorageProviders.id).notNull(),
|
|
4921
|
+
/** 存储路径 */
|
|
4922
|
+
storagePath: pgCore.text("storage_path").notNull(),
|
|
4923
|
+
/** CDN访问URL */
|
|
4924
|
+
cdnUrl: pgCore.text("cdn_url"),
|
|
4925
|
+
/** 所属文件夹ID */
|
|
4926
|
+
folderId: pgCore.uuid("folder_id").references(() => fileFolders.id, { onDelete: "set null" }),
|
|
4927
|
+
/** 模块ID */
|
|
4928
|
+
moduleId: pgCore.varchar("module_id", { length: 100 }),
|
|
4929
|
+
/** 业务ID */
|
|
4930
|
+
businessId: pgCore.varchar("business_id", { length: 255 }),
|
|
4931
|
+
/** 文件标签(JSON数组) */
|
|
4932
|
+
tags: pgCore.json("tags"),
|
|
4933
|
+
/** 文件元信息(如图片尺寸、视频时长等) */
|
|
4934
|
+
metadata: pgCore.json("metadata"),
|
|
4935
|
+
/** 是否为临时文件 */
|
|
4936
|
+
isTemporary: pgCore.boolean("is_temporary").notNull().default(false),
|
|
4937
|
+
/** 是否已删除(软删除) */
|
|
4938
|
+
isDeleted: pgCore.boolean("is_deleted").notNull().default(false),
|
|
4939
|
+
/** 访问次数 */
|
|
4940
|
+
accessCount: pgCore.integer("access_count").notNull().default(0),
|
|
4941
|
+
/** 下载次数 */
|
|
4942
|
+
downloadCount: pgCore.integer("download_count").notNull().default(0),
|
|
4943
|
+
/** 上传者ID */
|
|
4944
|
+
uploaderId: pgCore.varchar("uploader_id", { length: 255 }).notNull(),
|
|
4945
|
+
/** 上传时间 */
|
|
4946
|
+
uploadTime: pgCore.timestamp("upload_time").defaultNow().notNull(),
|
|
4947
|
+
/** 最后访问时间 */
|
|
4948
|
+
lastAccessTime: pgCore.timestamp("last_access_time"),
|
|
4949
|
+
/** 过期时间(为null表示永不过期) */
|
|
4950
|
+
expiresAt: pgCore.timestamp("expires_at"),
|
|
4951
|
+
/** 创建时间 */
|
|
4952
|
+
createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
|
|
4953
|
+
/** 更新时间 */
|
|
4954
|
+
updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull(),
|
|
4955
|
+
/** 删除时间 */
|
|
4956
|
+
deletedAt: pgCore.timestamp("deleted_at")
|
|
4957
|
+
},
|
|
4958
|
+
(table) => ({
|
|
4959
|
+
/** 按MD5哈希查询的索引(去重用) */
|
|
4960
|
+
md5Index: pgCore.index("file_metadata_md5_idx").on(table.md5Hash),
|
|
4961
|
+
/** 按SHA256哈希查询的索引 */
|
|
4962
|
+
sha256Index: pgCore.index("file_metadata_sha256_idx").on(table.sha256Hash),
|
|
4963
|
+
/** 按模块查询的索引 */
|
|
4964
|
+
moduleIndex: pgCore.index("file_metadata_module_idx").on(table.moduleId),
|
|
4965
|
+
/** 按业务ID查询的索引 */
|
|
4966
|
+
businessIndex: pgCore.index("file_metadata_business_idx").on(table.businessId),
|
|
4967
|
+
/** 按上传者查询的索引 */
|
|
4968
|
+
uploaderIndex: pgCore.index("file_metadata_uploader_idx").on(table.uploaderId),
|
|
4969
|
+
/** 按MIME类型查询的索引 */
|
|
4970
|
+
mimeTypeIndex: pgCore.index("file_metadata_mime_type_idx").on(table.mimeType),
|
|
4971
|
+
/** 按删除状态查询的索引 */
|
|
4972
|
+
isDeletedIndex: pgCore.index("file_metadata_is_deleted_idx").on(table.isDeleted),
|
|
4973
|
+
/** 按临时状态查询的索引 */
|
|
4974
|
+
isTemporaryIndex: pgCore.index("file_metadata_is_temporary_idx").on(table.isTemporary),
|
|
4975
|
+
/** 按文件夹查询的索引 */
|
|
4976
|
+
folderIndex: pgCore.index("file_metadata_folder_idx").on(table.folderId),
|
|
4977
|
+
/** 按上传时间查询的索引 */
|
|
4978
|
+
uploadTimeIndex: pgCore.index("file_metadata_upload_time_idx").on(table.uploadTime),
|
|
4979
|
+
/** 组合索引:模块+业务+删除状态 */
|
|
4980
|
+
moduleBusinessDeletedIndex: pgCore.index("file_metadata_module_business_deleted_idx").on(
|
|
4981
|
+
table.moduleId,
|
|
4982
|
+
table.businessId,
|
|
4983
|
+
table.isDeleted
|
|
4984
|
+
),
|
|
4985
|
+
/** 组合索引:文件夹+删除状态 */
|
|
4986
|
+
folderDeletedIndex: pgCore.index("file_metadata_folder_deleted_idx").on(
|
|
4987
|
+
table.folderId,
|
|
4988
|
+
table.isDeleted
|
|
4989
|
+
)
|
|
4990
|
+
})
|
|
4991
|
+
);
|
|
4992
|
+
var fileVersions = pgCore.pgTable(
|
|
4993
|
+
"file_versions",
|
|
4994
|
+
{
|
|
4995
|
+
/** 主键ID */
|
|
4996
|
+
id: pgCore.uuid("id").primaryKey().defaultRandom(),
|
|
4997
|
+
/** 关联的文件ID */
|
|
4998
|
+
fileId: pgCore.uuid("file_id").references(() => fileMetadata.id, { onDelete: "cascade" }).notNull(),
|
|
4999
|
+
/** 版本号 */
|
|
5000
|
+
version: pgCore.integer("version").notNull(),
|
|
5001
|
+
/** 版本描述 */
|
|
5002
|
+
description: pgCore.text("description"),
|
|
5003
|
+
/** 文件大小 */
|
|
5004
|
+
size: pgCore.bigint("size", { mode: "number" }).notNull(),
|
|
5005
|
+
/** MD5哈希值 */
|
|
5006
|
+
md5Hash: pgCore.varchar("md5_hash", { length: 32 }).notNull(),
|
|
5007
|
+
/** 存储路径 */
|
|
5008
|
+
storagePath: pgCore.text("storage_path").notNull(),
|
|
5009
|
+
/** CDN访问URL */
|
|
5010
|
+
cdnUrl: pgCore.text("cdn_url"),
|
|
5011
|
+
/** 是否为当前版本 */
|
|
5012
|
+
isCurrent: pgCore.boolean("is_current").notNull().default(false),
|
|
5013
|
+
/** 创建者ID */
|
|
5014
|
+
createdBy: pgCore.varchar("created_by", { length: 255 }).notNull(),
|
|
5015
|
+
/** 创建时间 */
|
|
5016
|
+
createdAt: pgCore.timestamp("created_at").defaultNow().notNull()
|
|
5017
|
+
},
|
|
5018
|
+
(table) => ({
|
|
5019
|
+
/** 按文件ID查询的索引 */
|
|
5020
|
+
fileIndex: pgCore.index("file_versions_file_idx").on(table.fileId),
|
|
5021
|
+
/** 按当前版本查询的索引 */
|
|
5022
|
+
isCurrentIndex: pgCore.index("file_versions_is_current_idx").on(table.isCurrent),
|
|
5023
|
+
/** 组合索引:文件+版本 */
|
|
5024
|
+
fileVersionIndex: pgCore.index("file_versions_file_version_idx").on(table.fileId, table.version)
|
|
5025
|
+
})
|
|
5026
|
+
);
|
|
5027
|
+
var fileProcessingRecords = pgCore.pgTable(
|
|
5028
|
+
"file_processing_records",
|
|
5029
|
+
{
|
|
5030
|
+
/** 主键ID */
|
|
5031
|
+
id: pgCore.uuid("id").primaryKey().defaultRandom(),
|
|
5032
|
+
/** 关联的文件ID */
|
|
5033
|
+
fileId: pgCore.uuid("file_id").references(() => fileMetadata.id, { onDelete: "cascade" }).notNull(),
|
|
5034
|
+
/** 处理类型:compress, resize, convert, thumbnail, watermark, etc. */
|
|
5035
|
+
processingType: pgCore.varchar("processing_type", { length: 50 }).notNull(),
|
|
5036
|
+
/** 处理器名称 */
|
|
5037
|
+
processorName: pgCore.varchar("processor_name", { length: 100 }).notNull(),
|
|
5038
|
+
/** 处理状态:pending, processing, completed, failed */
|
|
5039
|
+
status: pgCore.varchar("status", { length: 20 }).notNull().default("pending"),
|
|
5040
|
+
/** 处理参数(JSON格式) */
|
|
5041
|
+
parameters: pgCore.json("parameters"),
|
|
5042
|
+
/** 处理结果(JSON格式) */
|
|
5043
|
+
result: pgCore.json("result"),
|
|
5044
|
+
/** 输出文件路径 */
|
|
5045
|
+
outputPath: pgCore.text("output_path"),
|
|
5046
|
+
/** 输出文件大小 */
|
|
5047
|
+
outputSize: pgCore.bigint("output_size", { mode: "number" }),
|
|
5048
|
+
/** 处理耗时(毫秒) */
|
|
5049
|
+
processingTimeMs: pgCore.integer("processing_time_ms"),
|
|
5050
|
+
/** 错误信息 */
|
|
5051
|
+
errorMessage: pgCore.text("error_message"),
|
|
5052
|
+
/** 重试次数 */
|
|
5053
|
+
retryCount: pgCore.integer("retry_count").notNull().default(0),
|
|
5054
|
+
/** 优先级 */
|
|
5055
|
+
priority: pgCore.integer("priority").notNull().default(5),
|
|
5056
|
+
/** 开始时间 */
|
|
5057
|
+
startedAt: pgCore.timestamp("started_at"),
|
|
5058
|
+
/** 完成时间 */
|
|
5059
|
+
completedAt: pgCore.timestamp("completed_at"),
|
|
5060
|
+
/** 创建时间 */
|
|
5061
|
+
createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
|
|
5062
|
+
/** 更新时间 */
|
|
5063
|
+
updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
|
|
5064
|
+
},
|
|
5065
|
+
(table) => ({
|
|
5066
|
+
/** 按文件ID查询的索引 */
|
|
5067
|
+
fileIndex: pgCore.index("file_processing_records_file_idx").on(table.fileId),
|
|
5068
|
+
/** 按处理状态查询的索引 */
|
|
5069
|
+
statusIndex: pgCore.index("file_processing_records_status_idx").on(table.status),
|
|
5070
|
+
/** 按处理类型查询的索引 */
|
|
5071
|
+
processingTypeIndex: pgCore.index("file_processing_records_processing_type_idx").on(
|
|
5072
|
+
table.processingType
|
|
5073
|
+
),
|
|
5074
|
+
/** 按优先级查询的索引 */
|
|
5075
|
+
priorityIndex: pgCore.index("file_processing_records_priority_idx").on(table.priority),
|
|
5076
|
+
/** 组合索引:文件+处理类型 */
|
|
5077
|
+
fileProcessingTypeIndex: pgCore.index("file_processing_records_file_processing_type_idx").on(
|
|
5078
|
+
table.fileId,
|
|
5079
|
+
table.processingType
|
|
5080
|
+
)
|
|
5081
|
+
})
|
|
5082
|
+
);
|
|
5083
|
+
var fileShares = pgCore.pgTable(
|
|
5084
|
+
"file_shares",
|
|
5085
|
+
{
|
|
5086
|
+
/** 主键ID */
|
|
5087
|
+
id: pgCore.uuid("id").primaryKey().defaultRandom(),
|
|
5088
|
+
/** 分享代码(短链接标识) */
|
|
5089
|
+
shareCode: pgCore.varchar("share_code", { length: 20 }).notNull().unique(),
|
|
5090
|
+
/** 分享的文件ID列表(JSON数组) */
|
|
5091
|
+
fileIds: pgCore.json("file_ids").notNull(),
|
|
5092
|
+
/** 分享标题 */
|
|
5093
|
+
title: pgCore.varchar("title", { length: 255 }),
|
|
5094
|
+
/** 分享描述 */
|
|
5095
|
+
description: pgCore.text("description"),
|
|
5096
|
+
/** 访问密码 */
|
|
5097
|
+
password: pgCore.varchar("password", { length: 100 }),
|
|
5098
|
+
/** 访问权限:view, download */
|
|
5099
|
+
permission: pgCore.varchar("permission", { length: 20 }).notNull().default("view"),
|
|
5100
|
+
/** 最大下载次数(为null表示无限制) */
|
|
5101
|
+
maxDownloads: pgCore.integer("max_downloads"),
|
|
5102
|
+
/** 当前下载次数 */
|
|
5103
|
+
downloadCount: pgCore.integer("download_count").notNull().default(0),
|
|
5104
|
+
/** 最大访问次数(为null表示无限制) */
|
|
5105
|
+
maxAccess: pgCore.integer("max_access"),
|
|
5106
|
+
/** 当前访问次数 */
|
|
5107
|
+
accessCount: pgCore.integer("access_count").notNull().default(0),
|
|
5108
|
+
/** 是否启用 */
|
|
5109
|
+
isActive: pgCore.boolean("is_active").notNull().default(true),
|
|
5110
|
+
/** 过期时间 */
|
|
5111
|
+
expiresAt: pgCore.timestamp("expires_at"),
|
|
5112
|
+
/** 创建者ID */
|
|
5113
|
+
createdBy: pgCore.varchar("created_by", { length: 255 }).notNull(),
|
|
5114
|
+
/** 创建时间 */
|
|
5115
|
+
createdAt: pgCore.timestamp("created_at").defaultNow().notNull(),
|
|
5116
|
+
/** 更新时间 */
|
|
5117
|
+
updatedAt: pgCore.timestamp("updated_at").defaultNow().notNull()
|
|
5118
|
+
},
|
|
5119
|
+
(table) => ({
|
|
5120
|
+
/** 按分享代码查询的索引 */
|
|
5121
|
+
shareCodeIndex: pgCore.index("file_shares_share_code_idx").on(table.shareCode),
|
|
5122
|
+
/** 按创建者查询的索引 */
|
|
5123
|
+
createdByIndex: pgCore.index("file_shares_created_by_idx").on(table.createdBy),
|
|
5124
|
+
/** 按活跃状态查询的索引 */
|
|
5125
|
+
isActiveIndex: pgCore.index("file_shares_is_active_idx").on(table.isActive),
|
|
5126
|
+
/** 按过期时间查询的索引 */
|
|
5127
|
+
expiresAtIndex: pgCore.index("file_shares_expires_at_idx").on(table.expiresAt)
|
|
5128
|
+
})
|
|
5129
|
+
);
|
|
5130
|
+
var fileAccessLogs = pgCore.pgTable(
|
|
5131
|
+
"file_access_logs",
|
|
5132
|
+
{
|
|
5133
|
+
/** 主键ID */
|
|
5134
|
+
id: pgCore.uuid("id").primaryKey().defaultRandom(),
|
|
5135
|
+
/** 关联的文件ID */
|
|
5136
|
+
fileId: pgCore.uuid("file_id").references(() => fileMetadata.id, { onDelete: "cascade" }),
|
|
5137
|
+
/** 分享ID(如果通过分享访问) */
|
|
5138
|
+
shareId: pgCore.uuid("share_id").references(() => fileShares.id, { onDelete: "set null" }),
|
|
5139
|
+
/** 访问类型:view, download, preview, thumbnail */
|
|
5140
|
+
accessType: pgCore.varchar("access_type", { length: 20 }).notNull(),
|
|
5141
|
+
/** 用户ID */
|
|
5142
|
+
userId: pgCore.varchar("user_id", { length: 255 }),
|
|
5143
|
+
/** 客户端IP地址 */
|
|
5144
|
+
ipAddress: pgCore.varchar("ip_address", { length: 45 }),
|
|
5145
|
+
/** 用户代理字符串 */
|
|
5146
|
+
userAgent: pgCore.text("user_agent"),
|
|
5147
|
+
/** 访问来源 */
|
|
5148
|
+
referer: pgCore.text("referer"),
|
|
5149
|
+
/** 响应状态码 */
|
|
5150
|
+
statusCode: pgCore.integer("status_code"),
|
|
5151
|
+
/** 传输字节数 */
|
|
5152
|
+
bytesTransferred: pgCore.bigint("bytes_transferred", { mode: "number" }),
|
|
5153
|
+
/** 响应时间(毫秒) */
|
|
5154
|
+
responseTimeMs: pgCore.integer("response_time_ms"),
|
|
5155
|
+
/** 访问时间 */
|
|
5156
|
+
accessedAt: pgCore.timestamp("accessed_at").defaultNow().notNull()
|
|
5157
|
+
},
|
|
5158
|
+
(table) => ({
|
|
5159
|
+
/** 按文件ID查询的索引 */
|
|
5160
|
+
fileIndex: pgCore.index("file_access_logs_file_idx").on(table.fileId),
|
|
5161
|
+
/** 按用户ID查询的索引 */
|
|
5162
|
+
userIndex: pgCore.index("file_access_logs_user_idx").on(table.userId),
|
|
5163
|
+
/** 按访问类型查询的索引 */
|
|
5164
|
+
accessTypeIndex: pgCore.index("file_access_logs_access_type_idx").on(table.accessType),
|
|
5165
|
+
/** 按访问时间查询的索引 */
|
|
5166
|
+
accessedAtIndex: pgCore.index("file_access_logs_accessed_at_idx").on(table.accessedAt),
|
|
5167
|
+
/** 按分享ID查询的索引 */
|
|
5168
|
+
shareIndex: pgCore.index("file_access_logs_share_idx").on(table.shareId)
|
|
5169
|
+
})
|
|
5170
|
+
);
|
|
5171
|
+
var fileThumbnails = pgCore.pgTable(
|
|
5172
|
+
"file_thumbnails",
|
|
5173
|
+
{
|
|
5174
|
+
/** 主键ID */
|
|
5175
|
+
id: pgCore.uuid("id").primaryKey().defaultRandom(),
|
|
5176
|
+
/** 关联的文件ID */
|
|
5177
|
+
fileId: pgCore.uuid("file_id").references(() => fileMetadata.id, { onDelete: "cascade" }).notNull(),
|
|
5178
|
+
/** 缩略图类型:thumbnail, preview, poster(视频封面), etc. */
|
|
5179
|
+
type: pgCore.varchar("type", { length: 50 }).notNull(),
|
|
5180
|
+
/** 缩略图规格:small, medium, large, 或具体尺寸如 "200x200" */
|
|
5181
|
+
size: pgCore.varchar("size", { length: 20 }).notNull(),
|
|
5182
|
+
/** 缩略图宽度 */
|
|
5183
|
+
width: pgCore.integer("width"),
|
|
5184
|
+
/** 缩略图高度 */
|
|
5185
|
+
height: pgCore.integer("height"),
|
|
5186
|
+
/** 缩略图格式:jpg, png, webp, etc. */
|
|
5187
|
+
format: pgCore.varchar("format", { length: 10 }).notNull(),
|
|
5188
|
+
/** 缩略图文件大小 */
|
|
5189
|
+
fileSize: pgCore.integer("file_size").notNull(),
|
|
5190
|
+
/** 存储路径 */
|
|
5191
|
+
storagePath: pgCore.text("storage_path").notNull(),
|
|
5192
|
+
/** CDN访问URL */
|
|
5193
|
+
cdnUrl: pgCore.text("cdn_url"),
|
|
5194
|
+
/** 生成质量(1-100) */
|
|
5195
|
+
quality: pgCore.integer("quality").default(85),
|
|
5196
|
+
/** 是否生成成功 */
|
|
5197
|
+
isGenerated: pgCore.boolean("is_generated").notNull().default(false),
|
|
5198
|
+
/** 生成时间 */
|
|
5199
|
+
generatedAt: pgCore.timestamp("generated_at"),
|
|
5200
|
+
/** 创建时间 */
|
|
5201
|
+
createdAt: pgCore.timestamp("created_at").defaultNow().notNull()
|
|
5202
|
+
},
|
|
5203
|
+
(table) => ({
|
|
5204
|
+
/** 按文件ID查询的索引 */
|
|
5205
|
+
fileIndex: pgCore.index("file_thumbnails_file_idx").on(table.fileId),
|
|
5206
|
+
/** 按类型查询的索引 */
|
|
5207
|
+
typeIndex: pgCore.index("file_thumbnails_type_idx").on(table.type),
|
|
5208
|
+
/** 按生成状态查询的索引 */
|
|
5209
|
+
isGeneratedIndex: pgCore.index("file_thumbnails_is_generated_idx").on(table.isGenerated),
|
|
5210
|
+
/** 组合索引:文件+类型+尺寸 */
|
|
5211
|
+
fileTypeSizeIndex: pgCore.index("file_thumbnails_file_type_size_idx").on(
|
|
5212
|
+
table.fileId,
|
|
5213
|
+
table.type,
|
|
5214
|
+
table.size
|
|
5215
|
+
)
|
|
5216
|
+
})
|
|
5217
|
+
);
|
|
5218
|
+
var fileStorageProvidersRelations = drizzleOrm.relations(fileStorageProviders, ({ many }) => ({
|
|
5219
|
+
files: many(fileMetadata)
|
|
5220
|
+
}));
|
|
5221
|
+
var fileFoldersRelations = drizzleOrm.relations(fileFolders, ({ one, many }) => ({
|
|
5222
|
+
parent: one(fileFolders, {
|
|
5223
|
+
fields: [fileFolders.parentId],
|
|
5224
|
+
references: [fileFolders.id]
|
|
5225
|
+
}),
|
|
5226
|
+
children: many(fileFolders),
|
|
5227
|
+
files: many(fileMetadata)
|
|
5228
|
+
}));
|
|
5229
|
+
var fileMetadataRelations = drizzleOrm.relations(fileMetadata, ({ one, many }) => ({
|
|
5230
|
+
storageProvider: one(fileStorageProviders, {
|
|
5231
|
+
fields: [fileMetadata.storageProviderId],
|
|
5232
|
+
references: [fileStorageProviders.id]
|
|
5233
|
+
}),
|
|
5234
|
+
folder: one(fileFolders, {
|
|
5235
|
+
fields: [fileMetadata.folderId],
|
|
5236
|
+
references: [fileFolders.id]
|
|
5237
|
+
}),
|
|
5238
|
+
versions: many(fileVersions),
|
|
5239
|
+
processingRecords: many(fileProcessingRecords),
|
|
5240
|
+
accessLogs: many(fileAccessLogs),
|
|
5241
|
+
thumbnails: many(fileThumbnails)
|
|
5242
|
+
}));
|
|
5243
|
+
var fileVersionsRelations = drizzleOrm.relations(fileVersions, ({ one }) => ({
|
|
5244
|
+
file: one(fileMetadata, {
|
|
5245
|
+
fields: [fileVersions.fileId],
|
|
5246
|
+
references: [fileMetadata.id]
|
|
5247
|
+
})
|
|
5248
|
+
}));
|
|
5249
|
+
var fileProcessingRecordsRelations = drizzleOrm.relations(fileProcessingRecords, ({ one }) => ({
|
|
5250
|
+
file: one(fileMetadata, {
|
|
5251
|
+
fields: [fileProcessingRecords.fileId],
|
|
5252
|
+
references: [fileMetadata.id]
|
|
5253
|
+
})
|
|
5254
|
+
}));
|
|
5255
|
+
var fileSharesRelations = drizzleOrm.relations(fileShares, ({ many }) => ({
|
|
5256
|
+
accessLogs: many(fileAccessLogs)
|
|
5257
|
+
}));
|
|
5258
|
+
var fileAccessLogsRelations = drizzleOrm.relations(fileAccessLogs, ({ one }) => ({
|
|
5259
|
+
file: one(fileMetadata, {
|
|
5260
|
+
fields: [fileAccessLogs.fileId],
|
|
5261
|
+
references: [fileMetadata.id]
|
|
5262
|
+
}),
|
|
5263
|
+
share: one(fileShares, {
|
|
5264
|
+
fields: [fileAccessLogs.shareId],
|
|
5265
|
+
references: [fileShares.id]
|
|
5266
|
+
})
|
|
5267
|
+
}));
|
|
5268
|
+
var fileThumbnailsRelations = drizzleOrm.relations(fileThumbnails, ({ one }) => ({
|
|
5269
|
+
file: one(fileMetadata, {
|
|
5270
|
+
fields: [fileThumbnails.fileId],
|
|
5271
|
+
references: [fileMetadata.id]
|
|
5272
|
+
})
|
|
5273
|
+
}));
|
|
5274
|
+
|
|
4538
5275
|
Object.defineProperty(exports, "LocalStorageProvider", {
|
|
4539
5276
|
enumerable: true,
|
|
4540
5277
|
get: function () { return chunkTKCYPDWU_js.LocalStorageProvider; }
|
|
@@ -4551,6 +5288,11 @@ exports.CacheManager = CacheManager;
|
|
|
4551
5288
|
exports.CacheStrategyType = CacheStrategyType;
|
|
4552
5289
|
exports.CdnCacheStrategy = CdnCacheStrategy2;
|
|
4553
5290
|
exports.ConfigValidationError = ConfigValidationError;
|
|
5291
|
+
exports.DEFAULT_ALLOWED_MIME_TYPES = DEFAULT_ALLOWED_MIME_TYPES;
|
|
5292
|
+
exports.DEFAULT_CACHE_CONFIG = DEFAULT_CACHE_CONFIG;
|
|
5293
|
+
exports.DEFAULT_FILE_SERVICE_CONFIG = DEFAULT_FILE_SERVICE_CONFIG;
|
|
5294
|
+
exports.DEFAULT_MAX_FILE_SIZE = DEFAULT_MAX_FILE_SIZE;
|
|
5295
|
+
exports.DEFAULT_OSS_CONFIG_KEYS = DEFAULT_OSS_CONFIG_KEYS;
|
|
4554
5296
|
exports.ErrorHttpStatusMap = ErrorHttpStatusMap;
|
|
4555
5297
|
exports.ErrorMessages = ErrorMessages;
|
|
4556
5298
|
exports.ImageProcessor = ImageProcessor;
|
|
@@ -4564,13 +5306,37 @@ exports.createDocumentServicePreset = createDocumentServicePreset;
|
|
|
4564
5306
|
exports.createDrizzleRepository = createDrizzleRepository;
|
|
4565
5307
|
exports.createFileServiceConfig = createFileServiceConfig;
|
|
4566
5308
|
exports.createFileServiceFromEnv = createFileServiceFromEnv;
|
|
5309
|
+
exports.createFileServiceWithFactory = createFileServiceWithFactory;
|
|
4567
5310
|
exports.createImageServicePreset = createImageServicePreset;
|
|
4568
5311
|
exports.createLocalDevPreset = createLocalDevPreset;
|
|
5312
|
+
exports.createSingleton = createSingleton;
|
|
4569
5313
|
exports.createSmartPreset = createSmartPreset;
|
|
4570
5314
|
exports.createUniversalFileService = createUniversalFileService;
|
|
4571
5315
|
exports.createVideoServicePreset = createVideoServicePreset;
|
|
5316
|
+
exports.fileAccessLogs = fileAccessLogs;
|
|
5317
|
+
exports.fileAccessLogsRelations = fileAccessLogsRelations;
|
|
5318
|
+
exports.fileFolders = fileFolders;
|
|
5319
|
+
exports.fileFoldersRelations = fileFoldersRelations;
|
|
5320
|
+
exports.fileMetadata = fileMetadata;
|
|
5321
|
+
exports.fileMetadataRelations = fileMetadataRelations;
|
|
5322
|
+
exports.fileProcessingRecords = fileProcessingRecords;
|
|
5323
|
+
exports.fileProcessingRecordsRelations = fileProcessingRecordsRelations;
|
|
5324
|
+
exports.fileShares = fileShares;
|
|
5325
|
+
exports.fileSharesRelations = fileSharesRelations;
|
|
5326
|
+
exports.fileStorageProviders = fileStorageProviders;
|
|
5327
|
+
exports.fileStorageProvidersRelations = fileStorageProvidersRelations;
|
|
5328
|
+
exports.fileThumbnails = fileThumbnails;
|
|
5329
|
+
exports.fileThumbnailsRelations = fileThumbnailsRelations;
|
|
5330
|
+
exports.fileVersions = fileVersions;
|
|
5331
|
+
exports.fileVersionsRelations = fileVersionsRelations;
|
|
5332
|
+
exports.getDefaultLocalStorage = getDefaultLocalStorage;
|
|
4572
5333
|
exports.getMimeType = getMimeType;
|
|
4573
5334
|
exports.getRequiredEnvVars = getRequiredEnvVars;
|
|
5335
|
+
exports.loadCDNConfigFromEnv = loadCDNConfigFromEnv;
|
|
5336
|
+
exports.loadConfigFromEnv = loadConfigFromEnv;
|
|
5337
|
+
exports.loadConfigWithFallback = loadConfigWithFallback;
|
|
5338
|
+
exports.loadOSSConfigFromEnv = loadOSSConfigFromEnv;
|
|
5339
|
+
exports.loadOSSConfigFromService = loadOSSConfigFromService;
|
|
4574
5340
|
exports.validateEnvironment = validateEnvironment;
|
|
4575
5341
|
exports.validateServiceConfig = validateServiceConfig;
|
|
4576
5342
|
exports.validateStorageConfig = validateStorageConfig;
|