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.
Files changed (99) hide show
  1. package/dist/UniversalFileService-CEZRJ87g.d.mts +727 -0
  2. package/dist/UniversalFileService-CEZRJ87g.d.ts +727 -0
  3. package/dist/api/index.d.mts +248 -0
  4. package/dist/api/index.d.ts +248 -0
  5. package/dist/api/index.js +294 -0
  6. package/dist/api/index.js.map +1 -0
  7. package/dist/api/index.mjs +290 -0
  8. package/dist/api/index.mjs.map +1 -0
  9. package/dist/auth/client/index.d.mts +52 -3
  10. package/dist/auth/client/index.d.ts +52 -3
  11. package/dist/auth/components/index.d.mts +149 -4
  12. package/dist/auth/components/index.d.ts +149 -4
  13. package/dist/auth/components/index.js +243 -9
  14. package/dist/auth/components/index.js.map +1 -1
  15. package/dist/auth/components/index.mjs +237 -4
  16. package/dist/auth/components/index.mjs.map +1 -1
  17. package/dist/auth/hooks/index.d.mts +31 -2
  18. package/dist/auth/hooks/index.d.ts +31 -2
  19. package/dist/auth/index.d.mts +5 -5
  20. package/dist/auth/index.d.ts +5 -5
  21. package/dist/auth/index.js +49 -17
  22. package/dist/auth/index.mjs +1 -1
  23. package/dist/auth/routes/index.d.mts +103 -5
  24. package/dist/auth/routes/index.d.ts +103 -5
  25. package/dist/auth/routes/index.js +37 -5
  26. package/dist/auth/routes/index.mjs +1 -1
  27. package/dist/chunk-42IJ7HEI.js +573 -0
  28. package/dist/chunk-42IJ7HEI.js.map +1 -0
  29. package/dist/chunk-7XLFSPDG.mjs +31 -0
  30. package/dist/chunk-7XLFSPDG.mjs.map +1 -0
  31. package/dist/chunk-GCVOKQZP.js +36 -0
  32. package/dist/chunk-GCVOKQZP.js.map +1 -0
  33. package/dist/chunk-IBLB7ARJ.mjs +560 -0
  34. package/dist/chunk-IBLB7ARJ.mjs.map +1 -0
  35. package/dist/{chunk-6FNUWAIV.js → chunk-LX4XX6W7.js} +54 -8
  36. package/dist/chunk-LX4XX6W7.js.map +1 -0
  37. package/dist/{chunk-HXFFYNIF.mjs → chunk-T5OZHYVM.mjs} +54 -8
  38. package/dist/chunk-T5OZHYVM.mjs.map +1 -0
  39. package/dist/config/server/index.d.mts +1533 -0
  40. package/dist/config/server/index.d.ts +1533 -0
  41. package/dist/config/server/index.js +1177 -0
  42. package/dist/config/server/index.js.map +1 -0
  43. package/dist/config/server/index.mjs +1138 -0
  44. package/dist/config/server/index.mjs.map +1 -0
  45. package/dist/i18n/index.d.mts +2 -1
  46. package/dist/i18n/index.d.ts +2 -1
  47. package/dist/i18n/index.js +125 -61
  48. package/dist/i18n/index.js.map +1 -1
  49. package/dist/i18n/index.mjs +126 -62
  50. package/dist/i18n/index.mjs.map +1 -1
  51. package/dist/index.js +6 -6
  52. package/dist/index.mjs +1 -1
  53. package/dist/mmd/index.d.mts +346 -0
  54. package/dist/mmd/index.d.ts +346 -0
  55. package/dist/mmd/index.js +1535 -0
  56. package/dist/mmd/index.js.map +1 -0
  57. package/dist/mmd/index.mjs +1503 -0
  58. package/dist/mmd/index.mjs.map +1 -0
  59. package/dist/storage/index.d.mts +1 -0
  60. package/dist/storage/index.d.ts +1 -0
  61. package/dist/storage/index.js +9 -9
  62. package/dist/storage/index.mjs +1 -1
  63. package/dist/{index-8VoHap_4.d.mts → types-CroexXnI.d.ts} +38 -44
  64. package/dist/{index-8VoHap_4.d.ts → types-DmsXCWvm.d.mts} +38 -44
  65. package/dist/{types-DAxQ1MeY.d.ts → types-Dt0oqeFM.d.mts} +1 -1
  66. package/dist/{types-DT8LVCvE.d.mts → types-zK6kDzDQ.d.ts} +1 -1
  67. package/dist/universalExport/index.js +17 -32
  68. package/dist/universalExport/index.js.map +1 -1
  69. package/dist/universalExport/index.mjs +2 -29
  70. package/dist/universalExport/index.mjs.map +1 -1
  71. package/dist/universalExport/server/index.d.mts +849 -8
  72. package/dist/universalExport/server/index.d.ts +849 -8
  73. package/dist/universalExport/server/index.js +1382 -2
  74. package/dist/universalExport/server/index.js.map +1 -1
  75. package/dist/universalExport/server/index.mjs +1355 -3
  76. package/dist/universalExport/server/index.mjs.map +1 -1
  77. package/dist/universalFile/index.d.mts +54 -3
  78. package/dist/universalFile/index.d.ts +54 -3
  79. package/dist/universalFile/index.js +272 -0
  80. package/dist/universalFile/index.js.map +1 -1
  81. package/dist/universalFile/index.mjs +267 -1
  82. package/dist/universalFile/index.mjs.map +1 -1
  83. package/dist/universalFile/server/index.d.mts +2541 -469
  84. package/dist/universalFile/server/index.d.ts +2541 -469
  85. package/dist/universalFile/server/index.js +830 -64
  86. package/dist/universalFile/server/index.js.map +1 -1
  87. package/dist/universalFile/server/index.mjs +803 -66
  88. package/dist/universalFile/server/index.mjs.map +1 -1
  89. package/package.json +47 -23
  90. package/dist/chunk-6FNUWAIV.js.map +0 -1
  91. package/dist/chunk-APY57REU.js +0 -300
  92. package/dist/chunk-APY57REU.js.map +0 -1
  93. package/dist/chunk-C64RY2OW.mjs +0 -295
  94. package/dist/chunk-C64RY2OW.mjs.map +0 -1
  95. package/dist/chunk-HXFFYNIF.mjs.map +0 -1
  96. package/dist/types-CoGG1rNV.d.mts +0 -258
  97. package/dist/types-CoGG1rNV.d.ts +0 -258
  98. package/dist/types-DW9qar-w.d.mts +0 -52
  99. 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 timestamp = Math.floor(Date.now() / 1e3) + expiresIn;
475
- const signString = `${parsedUrl.pathname}-${timestamp}-0-0-${authKey}`;
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=${timestamp}-0-0-${authValue}`;
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(text, opacity) {
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
- ${text}
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 ossConfig = this.config.storageProviders["aliyun-oss"];
3020
- if (ossConfig && ossConfig.enabled) {
3021
- const ossProvider = this.storageProviders.get("aliyun-oss");
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
- for (const [type, config] of Object.entries(this.config.storageProviders)) {
3180
- if (config.enabled) {
3181
- const provider = this.storageProviders.get(type);
3182
- if (provider) {
3183
- try {
3184
- await provider.initialize(config);
3185
- logger6.info(`\u2705 [UniversalFileService] \u5B58\u50A8\u63D0\u4F9B\u8005\u521D\u59CB\u5316\u5B8C\u6210: ${type}`);
3186
- } catch (error) {
3187
- console.warn(`\u26A0\uFE0F [UniversalFileService] \u5B58\u50A8\u63D0\u4F9B\u8005\u521D\u59CB\u5316\u5931\u8D25: ${type}:`, error);
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
- const ossConfig = this.config.storageProviders["aliyun-oss"];
3198
- if (ossConfig && ossConfig.enabled) {
3199
- try {
3200
- const { AliyunOSSProvider: AliyunOSSProvider2 } = await import('../../AliyunOSSProvider-7JLMJDXK.js');
3201
- const ossProvider = new AliyunOSSProvider2();
3202
- this.registerStorageProvider(ossProvider);
3203
- logger6.info("\u2705 [UniversalFileService] \u963F\u91CC\u4E91OSS\u63D0\u4F9B\u8005\u6CE8\u518C\u6210\u529F");
3204
- } catch (error) {
3205
- console.warn("\u26A0\uFE0F [UniversalFileService] \u963F\u91CC\u4E91OSS\u63D0\u4F9B\u8005\u6CE8\u518C\u5931\u8D25:", error);
3206
- }
3207
- }
3208
- const localConfig = this.config.storageProviders["local"];
3209
- if (localConfig && localConfig.enabled) {
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 localProvider = new LocalStorageProvider2();
3224
- this.registerStorageProvider(localProvider);
3225
- logger6.info("\u2705 [UniversalFileService] \u672C\u5730\u5B58\u50A8\u63D0\u4F9B\u8005\u6CE8\u518C\u6210\u529F\uFF08\u5907\u7528\uFF09");
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
- for (const [type, config] of Object.entries(this.config.cdnProviders)) {
3234
- if (config.enabled) {
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;