@nest-omni/core 4.1.3-2 → 4.1.3-20

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 (386) hide show
  1. package/audit/audit.module.d.ts +10 -0
  2. package/audit/audit.module.js +63 -1
  3. package/audit/controllers/audit.controller.d.ts +88 -0
  4. package/audit/controllers/audit.controller.js +74 -0
  5. package/audit/decorators/audit-action.decorator.d.ts +74 -0
  6. package/audit/decorators/audit-action.decorator.js +42 -0
  7. package/audit/decorators/audit-controller.decorator.d.ts +9 -1
  8. package/audit/decorators/audit-controller.decorator.js +11 -2
  9. package/audit/decorators/audit-operation.decorator.d.ts +45 -0
  10. package/audit/decorators/audit-operation.decorator.js +49 -0
  11. package/audit/decorators/entity-audit.decorator.d.ts +85 -1
  12. package/audit/decorators/entity-audit.decorator.js +153 -3
  13. package/audit/decorators/index.d.ts +2 -0
  14. package/audit/decorators/index.js +2 -0
  15. package/audit/dto/audit-log-query.dto.d.ts +3 -0
  16. package/audit/dto/audit-log-query.dto.js +3 -0
  17. package/audit/dto/begin-transaction.dto.d.ts +3 -0
  18. package/audit/dto/begin-transaction.dto.js +3 -0
  19. package/audit/dto/compare-entities.dto.d.ts +3 -0
  20. package/audit/dto/compare-entities.dto.js +3 -0
  21. package/audit/dto/pre-check-restore.dto.d.ts +3 -0
  22. package/audit/dto/pre-check-restore.dto.js +3 -0
  23. package/audit/dto/restore-entity.dto.d.ts +3 -0
  24. package/audit/dto/restore-entity.dto.js +3 -0
  25. package/audit/entities/audit-action-summary.entity.d.ts +23 -0
  26. package/audit/entities/audit-action-summary.entity.js +101 -0
  27. package/audit/entities/entity-audit-log.entity.d.ts +11 -0
  28. package/audit/entities/entity-audit-log.entity.js +57 -2
  29. package/audit/entities/entity-transaction.entity.d.ts +11 -2
  30. package/audit/entities/entity-transaction.entity.js +42 -3
  31. package/audit/entities/index.d.ts +3 -0
  32. package/audit/entities/index.js +3 -0
  33. package/audit/entities/manual-operation-log.entity.d.ts +4 -0
  34. package/audit/entities/manual-operation-log.entity.js +12 -1
  35. package/audit/entities/operation-template.entity.d.ts +4 -0
  36. package/audit/entities/operation-template.entity.js +4 -0
  37. package/audit/enums/audit.enums.d.ts +37 -6
  38. package/audit/enums/audit.enums.js +40 -7
  39. package/audit/index.d.ts +4 -1
  40. package/audit/index.js +34 -1
  41. package/audit/interceptors/audit-action.interceptor.d.ts +38 -0
  42. package/audit/interceptors/audit-action.interceptor.js +215 -0
  43. package/audit/interceptors/audit.interceptor.d.ts +15 -0
  44. package/audit/interceptors/audit.interceptor.js +23 -1
  45. package/audit/interceptors/index.d.ts +1 -0
  46. package/audit/interceptors/index.js +1 -0
  47. package/audit/interfaces/audit.interfaces.d.ts +187 -2
  48. package/audit/services/audit-action.service.d.ts +141 -0
  49. package/audit/services/audit-action.service.js +244 -0
  50. package/audit/services/audit-context.service.d.ts +97 -0
  51. package/audit/services/audit-context.service.js +185 -0
  52. package/audit/services/audit-strategy.service.d.ts +6 -0
  53. package/audit/services/audit-strategy.service.js +13 -0
  54. package/audit/services/entity-audit.service.d.ts +230 -3
  55. package/audit/services/entity-audit.service.js +607 -14
  56. package/audit/services/index.d.ts +3 -0
  57. package/audit/services/index.js +3 -0
  58. package/audit/services/manual-audit-log.service.d.ts +134 -9
  59. package/audit/services/manual-audit-log.service.js +157 -40
  60. package/audit/services/multi-database.service.d.ts +9 -2
  61. package/audit/services/multi-database.service.js +9 -21
  62. package/audit/services/operation-description.service.d.ts +71 -2
  63. package/audit/services/operation-description.service.js +231 -20
  64. package/audit/services/transaction-audit.service.d.ts +30 -0
  65. package/audit/services/transaction-audit.service.js +53 -5
  66. package/audit/subscribers/entity-audit.subscriber.d.ts +19 -0
  67. package/audit/subscribers/entity-audit.subscriber.js +76 -1
  68. package/cache/cache-metrics.service.d.ts +67 -0
  69. package/cache/cache-metrics.service.js +68 -4
  70. package/cache/cache-serialization.service.d.ts +31 -0
  71. package/cache/cache-serialization.service.js +25 -0
  72. package/cache/cache.constants.d.ts +9 -0
  73. package/cache/cache.constants.js +9 -0
  74. package/cache/cache.health.d.ts +26 -0
  75. package/cache/cache.health.js +30 -0
  76. package/cache/cache.module.d.ts +82 -2
  77. package/cache/cache.module.js +76 -5
  78. package/cache/cache.service.d.ts +140 -0
  79. package/cache/cache.service.js +169 -0
  80. package/cache/cache.warmup.service.d.ts +39 -0
  81. package/cache/cache.warmup.service.js +32 -0
  82. package/cache/decorators/cache-evict.decorator.d.ts +47 -0
  83. package/cache/decorators/cache-evict.decorator.js +56 -0
  84. package/cache/decorators/cache-put.decorator.d.ts +34 -0
  85. package/cache/decorators/cache-put.decorator.js +39 -0
  86. package/cache/decorators/cacheable.decorator.d.ts +40 -0
  87. package/cache/decorators/cacheable.decorator.js +55 -0
  88. package/cache/dependencies/callback.dependency.d.ts +33 -0
  89. package/cache/dependencies/callback.dependency.js +39 -1
  90. package/cache/dependencies/chain.dependency.d.ts +28 -0
  91. package/cache/dependencies/chain.dependency.js +34 -0
  92. package/cache/dependencies/db.dependency.d.ts +83 -7
  93. package/cache/dependencies/db.dependency.js +89 -14
  94. package/cache/dependencies/file.dependency.d.ts +32 -0
  95. package/cache/dependencies/file.dependency.js +34 -0
  96. package/cache/dependencies/tag.dependency.d.ts +75 -4
  97. package/cache/dependencies/tag.dependency.js +145 -11
  98. package/cache/dependencies/time.dependency.d.ts +43 -0
  99. package/cache/dependencies/time.dependency.js +43 -0
  100. package/cache/examples/basic-usage.d.ts +15 -0
  101. package/cache/examples/basic-usage.js +62 -8
  102. package/cache/index.js +9 -0
  103. package/cache/interfaces/cache-dependency.interface.d.ts +53 -0
  104. package/cache/interfaces/cache-options.interface.d.ts +89 -0
  105. package/cache/interfaces/cache-options.interface.js +6 -0
  106. package/cache/interfaces/cache-provider.interface.d.ts +78 -0
  107. package/cache/providers/base-cache.provider.d.ts +14 -0
  108. package/cache/providers/base-cache.provider.js +16 -0
  109. package/cache/providers/cls-cache.provider.d.ts +20 -0
  110. package/cache/providers/cls-cache.provider.js +28 -0
  111. package/cache/providers/memory-cache.provider.d.ts +43 -0
  112. package/cache/providers/memory-cache.provider.js +66 -0
  113. package/cache/providers/redis-cache.provider.d.ts +26 -0
  114. package/cache/providers/redis-cache.provider.js +29 -0
  115. package/cache/utils/dependency-manager.util.d.ts +52 -0
  116. package/cache/utils/dependency-manager.util.js +59 -0
  117. package/cache/utils/key-generator.util.d.ts +42 -0
  118. package/cache/utils/key-generator.util.js +53 -1
  119. package/common/abstract.entity.d.ts +14 -0
  120. package/common/abstract.entity.js +14 -0
  121. package/common/boilerplate.polyfill.d.ts +142 -0
  122. package/common/boilerplate.polyfill.js +18 -1
  123. package/common/dto/dto-container.d.ts +16 -0
  124. package/common/dto/dto-container.js +20 -0
  125. package/common/dto/dto-decorators.d.ts +18 -0
  126. package/common/dto/dto-decorators.js +14 -0
  127. package/common/dto/dto-extensions.d.ts +11 -0
  128. package/common/dto/dto-extensions.js +9 -0
  129. package/common/dto/dto-service-accessor.d.ts +17 -0
  130. package/common/dto/dto-service-accessor.js +18 -0
  131. package/common/dto/dto-transformer.d.ts +12 -0
  132. package/common/dto/dto-transformer.js +9 -0
  133. package/common/dto/index.js +2 -0
  134. package/common/examples/paginate-and-map.example.d.ts +6 -0
  135. package/common/examples/paginate-and-map.example.js +26 -0
  136. package/common/utils.d.ts +15 -0
  137. package/common/utils.js +15 -0
  138. package/constants/language-code.js +1 -0
  139. package/decorators/field.decorators.d.ts +1 -1
  140. package/decorators/field.decorators.js +8 -1
  141. package/decorators/property.decorators.js +1 -0
  142. package/decorators/public-route.decorator.js +1 -0
  143. package/decorators/transform.decorators.d.ts +27 -0
  144. package/decorators/transform.decorators.js +29 -0
  145. package/decorators/translate.decorator.js +1 -0
  146. package/decorators/user.decorator.js +1 -0
  147. package/decorators/validator.decorators.d.ts +8 -18
  148. package/decorators/validator.decorators.js +22 -190
  149. package/file-upload/controllers/file-access.controller.d.ts +23 -0
  150. package/file-upload/controllers/file-access.controller.js +128 -0
  151. package/file-upload/decorators/column.decorator.d.ts +151 -0
  152. package/file-upload/decorators/column.decorator.js +273 -0
  153. package/file-upload/decorators/csv-data.decorator.d.ts +30 -0
  154. package/file-upload/decorators/csv-data.decorator.js +85 -0
  155. package/file-upload/decorators/csv-import.decorator.d.ts +34 -0
  156. package/file-upload/decorators/csv-import.decorator.js +24 -0
  157. package/file-upload/decorators/examples/column-mapping.example.d.ts +76 -0
  158. package/file-upload/decorators/examples/column-mapping.example.js +122 -0
  159. package/file-upload/decorators/excel-data.decorator.d.ts +30 -0
  160. package/file-upload/decorators/excel-data.decorator.js +85 -0
  161. package/file-upload/decorators/file-upload.decorator.d.ts +83 -0
  162. package/file-upload/decorators/file-upload.decorator.js +172 -0
  163. package/file-upload/decorators/index.d.ts +5 -0
  164. package/file-upload/decorators/index.js +38 -0
  165. package/file-upload/decorators/process.decorator.d.ts +40 -0
  166. package/file-upload/decorators/process.decorator.js +52 -0
  167. package/file-upload/decorators/validate-data.decorator.d.ts +91 -0
  168. package/file-upload/decorators/validate-data.decorator.js +39 -0
  169. package/file-upload/dto/create-file.dto.d.ts +24 -0
  170. package/file-upload/dto/create-file.dto.js +112 -0
  171. package/file-upload/dto/find-files.dto.d.ts +15 -0
  172. package/file-upload/dto/find-files.dto.js +76 -0
  173. package/file-upload/dto/index.d.ts +4 -0
  174. package/file-upload/dto/index.js +20 -0
  175. package/file-upload/dto/pagination.dto.d.ts +7 -0
  176. package/file-upload/dto/pagination.dto.js +39 -0
  177. package/file-upload/dto/update-file.dto.d.ts +15 -0
  178. package/file-upload/dto/update-file.dto.js +67 -0
  179. package/file-upload/entities/file-metadata.entity.d.ts +25 -0
  180. package/file-upload/entities/file-metadata.entity.js +76 -0
  181. package/file-upload/entities/file.entity.d.ts +114 -0
  182. package/file-upload/entities/file.entity.js +350 -0
  183. package/file-upload/entities/index.d.ts +2 -0
  184. package/file-upload/entities/index.js +18 -0
  185. package/file-upload/enums/file-type.enum.d.ts +72 -0
  186. package/file-upload/enums/file-type.enum.js +212 -0
  187. package/file-upload/exceptions/file-upload.exception.d.ts +57 -0
  188. package/file-upload/exceptions/file-upload.exception.js +120 -0
  189. package/file-upload/exceptions/index.d.ts +1 -0
  190. package/file-upload/exceptions/index.js +17 -0
  191. package/file-upload/file-upload.module.d.ts +89 -0
  192. package/file-upload/file-upload.module.js +292 -0
  193. package/file-upload/index.d.ts +37 -0
  194. package/file-upload/index.js +77 -0
  195. package/file-upload/interceptors/file-upload.interceptor.d.ts +101 -0
  196. package/file-upload/interceptors/file-upload.interceptor.js +594 -0
  197. package/file-upload/interceptors/index.d.ts +1 -0
  198. package/file-upload/interceptors/index.js +17 -0
  199. package/file-upload/interfaces/custom-file-type.interface.d.ts +72 -0
  200. package/file-upload/interfaces/custom-file-type.interface.js +2 -0
  201. package/file-upload/interfaces/file-buffer.interface.d.ts +72 -0
  202. package/file-upload/interfaces/file-buffer.interface.js +2 -0
  203. package/file-upload/interfaces/file-entity.interface.d.ts +142 -0
  204. package/file-upload/interfaces/file-entity.interface.js +28 -0
  205. package/file-upload/interfaces/file-metadata.interface.d.ts +21 -0
  206. package/file-upload/interfaces/file-metadata.interface.js +2 -0
  207. package/file-upload/interfaces/file-processor.interface.d.ts +93 -0
  208. package/file-upload/interfaces/file-processor.interface.js +2 -0
  209. package/file-upload/interfaces/file-upload-options.interface.d.ts +74 -0
  210. package/file-upload/interfaces/file-upload-options.interface.js +5 -0
  211. package/file-upload/interfaces/index.d.ts +7 -0
  212. package/file-upload/interfaces/index.js +24 -0
  213. package/file-upload/interfaces/processor-options.interface.d.ts +102 -0
  214. package/file-upload/interfaces/processor-options.interface.js +2 -0
  215. package/file-upload/interfaces/storage-provider.interface.d.ts +239 -0
  216. package/file-upload/interfaces/storage-provider.interface.js +2 -0
  217. package/file-upload/interfaces/upload-options.interface.d.ts +19 -0
  218. package/file-upload/interfaces/upload-options.interface.js +2 -0
  219. package/file-upload/processors/csv.processor.d.ts +98 -0
  220. package/file-upload/processors/csv.processor.js +391 -0
  221. package/file-upload/processors/excel.processor.d.ts +130 -0
  222. package/file-upload/processors/excel.processor.js +547 -0
  223. package/file-upload/processors/image.processor.d.ts +199 -0
  224. package/file-upload/processors/image.processor.js +377 -0
  225. package/file-upload/providers/index.d.ts +2 -0
  226. package/file-upload/providers/index.js +18 -0
  227. package/file-upload/providers/local-storage.provider.d.ts +98 -0
  228. package/file-upload/providers/local-storage.provider.js +484 -0
  229. package/file-upload/providers/s3-storage.provider.d.ts +87 -0
  230. package/file-upload/providers/s3-storage.provider.js +455 -0
  231. package/file-upload/services/file-signature-validator.service.d.ts +118 -0
  232. package/file-upload/services/file-signature-validator.service.js +376 -0
  233. package/file-upload/services/file.service.d.ts +193 -0
  234. package/file-upload/services/file.service.js +638 -0
  235. package/file-upload/services/index.d.ts +4 -0
  236. package/file-upload/services/index.js +20 -0
  237. package/file-upload/services/malicious-file-detector.service.d.ts +300 -0
  238. package/file-upload/services/malicious-file-detector.service.js +1234 -0
  239. package/file-upload/services/mime-registry.service.d.ts +47 -0
  240. package/file-upload/services/mime-registry.service.js +167 -0
  241. package/file-upload/utils/checksum.util.d.ts +28 -0
  242. package/file-upload/utils/checksum.util.js +65 -0
  243. package/file-upload/utils/dynamic-import.util.d.ts +54 -0
  244. package/file-upload/utils/dynamic-import.util.js +156 -0
  245. package/file-upload/utils/filename.util.d.ts +59 -0
  246. package/file-upload/utils/filename.util.js +184 -0
  247. package/file-upload/utils/filepath.util.d.ts +70 -0
  248. package/file-upload/utils/filepath.util.js +152 -0
  249. package/file-upload/utils/index.d.ts +4 -0
  250. package/file-upload/utils/index.js +20 -0
  251. package/filters/constraint-errors.js +1 -0
  252. package/helpers/common.helper.d.ts +13 -0
  253. package/helpers/common.helper.js +13 -0
  254. package/http-client/config/http-client.config.d.ts +20 -0
  255. package/http-client/config/http-client.config.js +48 -21
  256. package/http-client/decorators/http-client.decorators.d.ts +55 -14
  257. package/http-client/decorators/http-client.decorators.js +154 -78
  258. package/http-client/entities/http-log.entity.d.ts +217 -8
  259. package/http-client/entities/http-log.entity.js +7 -22
  260. package/http-client/errors/http-client.errors.d.ts +57 -0
  261. package/http-client/errors/http-client.errors.js +58 -0
  262. package/http-client/examples/advanced-usage.example.d.ts +40 -0
  263. package/http-client/examples/advanced-usage.example.js +53 -61
  264. package/http-client/examples/auth-with-waiting-lock.example.d.ts +31 -0
  265. package/http-client/examples/auth-with-waiting-lock.example.js +52 -5
  266. package/http-client/examples/basic-usage.example.d.ts +60 -0
  267. package/http-client/examples/basic-usage.example.js +60 -0
  268. package/http-client/examples/multi-api-configuration.example.d.ts +60 -0
  269. package/http-client/examples/multi-api-configuration.example.js +76 -5
  270. package/http-client/examples/proxy-from-environment.example.d.ts +133 -0
  271. package/http-client/examples/proxy-from-environment.example.js +409 -0
  272. package/http-client/http-client.module.d.ts +48 -2
  273. package/http-client/http-client.module.js +147 -68
  274. package/http-client/index.d.ts +1 -1
  275. package/http-client/index.js +8 -0
  276. package/http-client/interfaces/api-client-config.interface.d.ts +80 -45
  277. package/http-client/interfaces/api-client-config.interface.js +3 -0
  278. package/http-client/interfaces/http-client-config.interface.d.ts +109 -52
  279. package/http-client/services/api-client-registry.service.d.ts +50 -11
  280. package/http-client/services/api-client-registry.service.js +90 -250
  281. package/http-client/services/circuit-breaker.service.d.ts +115 -2
  282. package/http-client/services/circuit-breaker.service.js +237 -7
  283. package/http-client/services/http-client.service.d.ts +124 -14
  284. package/http-client/services/http-client.service.js +437 -148
  285. package/http-client/services/http-log-query.service.d.ts +83 -0
  286. package/http-client/services/http-log-query.service.js +121 -13
  287. package/http-client/services/http-replay.service.d.ts +101 -0
  288. package/http-client/services/http-replay.service.js +86 -0
  289. package/http-client/services/index.d.ts +0 -1
  290. package/http-client/services/index.js +0 -1
  291. package/http-client/services/log-cleanup.service.d.ts +63 -0
  292. package/http-client/services/log-cleanup.service.js +54 -2
  293. package/http-client/services/logging.service.d.ts +116 -7
  294. package/http-client/services/logging.service.js +349 -86
  295. package/http-client/utils/call-stack-extractor.util.d.ts +63 -0
  296. package/http-client/utils/call-stack-extractor.util.js +83 -0
  297. package/http-client/utils/context-extractor.util.d.ts +49 -0
  298. package/http-client/utils/context-extractor.util.js +52 -0
  299. package/http-client/utils/curl-generator.util.d.ts +21 -0
  300. package/http-client/utils/curl-generator.util.js +44 -3
  301. package/http-client/utils/index.d.ts +1 -0
  302. package/http-client/utils/index.js +1 -0
  303. package/http-client/utils/proxy-environment.util.d.ts +42 -0
  304. package/http-client/utils/proxy-environment.util.js +148 -0
  305. package/http-client/utils/request-id.util.d.ts +18 -0
  306. package/http-client/utils/request-id.util.js +20 -0
  307. package/http-client/utils/retry-recorder.util.d.ts +42 -0
  308. package/http-client/utils/retry-recorder.util.js +44 -0
  309. package/http-client/utils/security-validator.util.d.ts +118 -0
  310. package/http-client/utils/security-validator.util.js +352 -0
  311. package/index.d.ts +3 -1
  312. package/index.js +12 -1
  313. package/interceptors/translation-interceptor.service.js +5 -0
  314. package/package.json +11 -7
  315. package/providers/context.provider.js +2 -0
  316. package/providers/generator.provider.d.ts +4 -0
  317. package/providers/generator.provider.js +4 -0
  318. package/redis-lock/comprehensive-lock-cleanup.service.d.ts +94 -0
  319. package/redis-lock/comprehensive-lock-cleanup.service.js +253 -0
  320. package/redis-lock/examples/lock-strategy.examples.d.ts +89 -0
  321. package/redis-lock/examples/lock-strategy.examples.js +130 -15
  322. package/redis-lock/index.d.ts +2 -0
  323. package/redis-lock/index.js +8 -1
  324. package/redis-lock/lock-heartbeat.service.d.ts +80 -0
  325. package/redis-lock/lock-heartbeat.service.js +232 -0
  326. package/redis-lock/redis-lock.decorator.d.ts +101 -0
  327. package/redis-lock/redis-lock.decorator.js +120 -0
  328. package/redis-lock/redis-lock.module.d.ts +66 -0
  329. package/redis-lock/redis-lock.module.js +175 -70
  330. package/redis-lock/redis-lock.service.d.ts +282 -0
  331. package/redis-lock/redis-lock.service.js +343 -20
  332. package/setup/bootstrap.setup.d.ts +1 -0
  333. package/setup/bootstrap.setup.js +21 -0
  334. package/setup/index.d.ts +1 -0
  335. package/setup/index.js +1 -0
  336. package/setup/mode.setup.d.ts +44 -0
  337. package/setup/mode.setup.js +44 -0
  338. package/setup/run-in-mode.decorator.d.ts +56 -0
  339. package/setup/run-in-mode.decorator.js +92 -0
  340. package/setup/schedule.decorator.d.ts +227 -0
  341. package/setup/schedule.decorator.js +240 -12
  342. package/setup/worker.decorator.d.ts +86 -0
  343. package/setup/worker.decorator.js +97 -0
  344. package/shared/index.d.ts +1 -1
  345. package/shared/index.js +1 -1
  346. package/shared/{serviceRegistryModule.js → service-registry.module.js} +19 -17
  347. package/shared/services/api-config.service.d.ts +3 -0
  348. package/shared/services/api-config.service.js +21 -9
  349. package/shared/services/index.d.ts +0 -1
  350. package/shared/services/index.js +0 -1
  351. package/validator-json/decorators.d.ts +17 -0
  352. package/validator-json/decorators.js +17 -2
  353. package/validator-json/default.d.ts +6 -0
  354. package/validator-json/default.js +30 -2
  355. package/validator-json/defaultConverters.js +1 -0
  356. package/validator-json/options.d.ts +23 -0
  357. package/validators/common-validators.d.ts +143 -0
  358. package/validators/common-validators.js +249 -0
  359. package/validators/custom-validate.examples.d.ts +23 -0
  360. package/validators/custom-validate.examples.js +78 -6
  361. package/validators/custom-validate.validator.d.ts +108 -0
  362. package/validators/custom-validate.validator.js +85 -0
  363. package/validators/file-mimetype.validator.d.ts +0 -2
  364. package/validators/file-mimetype.validator.js +4 -6
  365. package/validators/index.d.ts +1 -0
  366. package/validators/index.js +1 -0
  367. package/validators/is-exists.validator.d.ts +26 -6
  368. package/validators/is-exists.validator.js +30 -7
  369. package/validators/is-unique.validator.d.ts +33 -7
  370. package/validators/is-unique.validator.js +59 -17
  371. package/validators/skip-empty.validator.d.ts +5 -0
  372. package/validators/skip-empty.validator.js +5 -0
  373. package/vault/interfaces/vault-options.interface.d.ts +9 -0
  374. package/vault/vault-config.loader.d.ts +30 -0
  375. package/vault/vault-config.loader.js +48 -1
  376. package/vault/vault-config.service.d.ts +53 -0
  377. package/vault/vault-config.service.js +57 -0
  378. package/vault/vault.module.d.ts +4 -0
  379. package/vault/vault.module.js +4 -0
  380. package/decorators/examples/validation-decorators.example.d.ts +0 -69
  381. package/decorators/examples/validation-decorators.example.js +0 -331
  382. package/http-client/services/cache.service.d.ts +0 -24
  383. package/http-client/services/cache.service.js +0 -264
  384. package/shared/services/validator.service.d.ts +0 -3
  385. package/shared/services/validator.service.js +0 -20
  386. /package/shared/{serviceRegistryModule.d.ts → service-registry.module.d.ts} +0 -0
@@ -0,0 +1,638 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
15
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
16
+ return new (P || (P = Promise))(function (resolve, reject) {
17
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
18
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
19
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
20
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
21
+ });
22
+ };
23
+ var FileService_1;
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.FileService = void 0;
26
+ const common_1 = require("@nestjs/common");
27
+ const typeorm_1 = require("@nestjs/typeorm");
28
+ const typeorm_2 = require("typeorm");
29
+ const file_entity_1 = require("../entities/file.entity");
30
+ const file_metadata_entity_1 = require("../entities/file-metadata.entity");
31
+ const fs_1 = require("fs");
32
+ const path = require("path");
33
+ /**
34
+ * 文件管理服务
35
+ */
36
+ let FileService = FileService_1 = class FileService {
37
+ constructor(fileRepository, metadataRepository, storageProvider, localStorageProvider, s3StorageProvider) {
38
+ this.fileRepository = fileRepository;
39
+ this.metadataRepository = metadataRepository;
40
+ this.storageProvider = storageProvider;
41
+ this.localStorageProvider = localStorageProvider;
42
+ this.s3StorageProvider = s3StorageProvider;
43
+ this.logger = new common_1.Logger(FileService_1.name);
44
+ // 允许的排序字段白名单(防止 SQL 注入)
45
+ this.ALLOWED_ORDER_FIELDS = [
46
+ 'createdAt',
47
+ 'updatedAt',
48
+ 'size',
49
+ 'originalName',
50
+ 'filename',
51
+ 'mimeType',
52
+ 'status',
53
+ 'fileType',
54
+ 'extension',
55
+ 'uploadId',
56
+ 'userId',
57
+ ];
58
+ // 允许的排序方向
59
+ this.ALLOWED_ORDER_DIRECTIONS = ['ASC', 'DESC'];
60
+ }
61
+ /**
62
+ * 创建文件记录
63
+ */
64
+ create(createFileDto) {
65
+ return __awaiter(this, void 0, void 0, function* () {
66
+ const file = this.fileRepository.create(createFileDto);
67
+ const saved = yield this.fileRepository.save(file);
68
+ this.logger.debug(`File record created: ${saved.id}`);
69
+ return saved;
70
+ });
71
+ }
72
+ /**
73
+ * 根据ID查找文件
74
+ */
75
+ findById(id_1) {
76
+ return __awaiter(this, arguments, void 0, function* (id, includeDeleted = false) {
77
+ const query = this.fileRepository
78
+ .createQueryBuilder('file')
79
+ .where('file.id = :id', { id });
80
+ if (!includeDeleted) {
81
+ query.andWhere('file.deletedAt IS NULL');
82
+ }
83
+ return query.getOne();
84
+ });
85
+ }
86
+ /**
87
+ * 根据uploadId查找文件
88
+ */
89
+ findByUploadId(uploadId) {
90
+ return __awaiter(this, void 0, void 0, function* () {
91
+ return this.fileRepository.find({
92
+ where: {
93
+ uploadId,
94
+ status: 'completed',
95
+ },
96
+ order: { createdAt: 'ASC' },
97
+ });
98
+ });
99
+ }
100
+ /**
101
+ * 查找文件列表
102
+ */
103
+ findFiles(query, pagination) {
104
+ return __awaiter(this, void 0, void 0, function* () {
105
+ var _a;
106
+ const queryBuilder = this.fileRepository.createQueryBuilder('file');
107
+ // 应用筛选条件
108
+ if (query.userId) {
109
+ queryBuilder.andWhere('file.userId = :userId', { userId: query.userId });
110
+ }
111
+ if (query.mimeType) {
112
+ if (Array.isArray(query.mimeType)) {
113
+ queryBuilder.andWhere('file.mimeType IN (:...mimeTypes)', {
114
+ mimeTypes: query.mimeType,
115
+ });
116
+ }
117
+ else {
118
+ queryBuilder.andWhere('file.mimeType = :mimeType', {
119
+ mimeType: query.mimeType,
120
+ });
121
+ }
122
+ }
123
+ if (query.uploadId) {
124
+ queryBuilder.andWhere('file.uploadId = :uploadId', {
125
+ uploadId: query.uploadId,
126
+ });
127
+ }
128
+ if (query.status) {
129
+ queryBuilder.andWhere('file.status = :status', { status: query.status });
130
+ }
131
+ if (query.storageProvider) {
132
+ queryBuilder.andWhere('file.storageProvider = :storageProvider', {
133
+ storageProvider: query.storageProvider,
134
+ });
135
+ }
136
+ if (query.dateFrom) {
137
+ queryBuilder.andWhere('file.createdAt >= :dateFrom', {
138
+ dateFrom: query.dateFrom,
139
+ });
140
+ }
141
+ if (query.dateTo) {
142
+ queryBuilder.andWhere('file.createdAt <= :dateTo', {
143
+ dateTo: query.dateTo,
144
+ });
145
+ }
146
+ if (query.search) {
147
+ // 转义 LIKE 操作符中的特殊字符
148
+ const escapedSearch = this.escapeLikeString(query.search);
149
+ queryBuilder.andWhere('(file.originalName LIKE :search OR file.filename LIKE :search)', {
150
+ search: `%${escapedSearch}%`,
151
+ });
152
+ }
153
+ // 排除软删除的记录
154
+ queryBuilder.andWhere('file.deletedAt IS NULL');
155
+ // 应用排序(带安全验证)
156
+ const orderBy = query.orderBy || 'createdAt';
157
+ const orderDirection = (((_a = query.orderDirection) === null || _a === void 0 ? void 0 : _a.toUpperCase()) || 'DESC');
158
+ // 验证排序字段
159
+ if (!this.ALLOWED_ORDER_FIELDS.includes(orderBy)) {
160
+ throw new common_1.BadRequestException(`Invalid order field: ${orderBy}. Allowed fields: ${this.ALLOWED_ORDER_FIELDS.join(', ')}`);
161
+ }
162
+ // 验证排序方向
163
+ if (!this.ALLOWED_ORDER_DIRECTIONS.includes(orderDirection)) {
164
+ throw new common_1.BadRequestException(`Invalid order direction: ${orderDirection}. Allowed: ASC, DESC`);
165
+ }
166
+ queryBuilder.orderBy(`file.${orderBy}`, orderDirection);
167
+ // 应用分页
168
+ const offset = (pagination.page - 1) * pagination.limit;
169
+ queryBuilder.skip(offset).take(pagination.limit);
170
+ const [files, total] = yield queryBuilder.getManyAndCount();
171
+ return {
172
+ files,
173
+ total,
174
+ page: pagination.page,
175
+ limit: pagination.limit,
176
+ totalPages: Math.ceil(total / pagination.limit),
177
+ };
178
+ });
179
+ }
180
+ /**
181
+ * 更新文件记录
182
+ */
183
+ update(id, updateFileDto) {
184
+ return __awaiter(this, void 0, void 0, function* () {
185
+ const file = yield this.findById(id);
186
+ if (!file) {
187
+ throw new common_1.NotFoundException(`File not found: ${id}`);
188
+ }
189
+ Object.assign(file, updateFileDto);
190
+ const updated = yield this.fileRepository.save(file);
191
+ this.logger.debug(`File record updated: ${updated.id}`);
192
+ return updated;
193
+ });
194
+ }
195
+ /**
196
+ * 软删除文件
197
+ * @param id 文件ID
198
+ * @param deletePhysicalFile 是否同时删除物理文件,默认 false
199
+ */
200
+ softDelete(id_1) {
201
+ return __awaiter(this, arguments, void 0, function* (id, deletePhysicalFile = false) {
202
+ const file = yield this.findById(id);
203
+ if (!file) {
204
+ throw new common_1.NotFoundException(`File not found: ${id}`);
205
+ }
206
+ file.markAsDeleted();
207
+ yield this.fileRepository.softRemove(file);
208
+ // 可选:删除物理文件
209
+ if (deletePhysicalFile) {
210
+ yield this.deletePhysicalFile(file);
211
+ }
212
+ this.logger.debug(`File soft deleted: ${id}, physicalFile: ${deletePhysicalFile}`);
213
+ });
214
+ }
215
+ /**
216
+ * 硬删除文件
217
+ * @param id 文件ID
218
+ * @param deletePhysicalFile 是否同时删除物理文件,默认 true
219
+ */
220
+ hardDelete(id_1) {
221
+ return __awaiter(this, arguments, void 0, function* (id, deletePhysicalFile = true) {
222
+ const file = yield this.findById(id);
223
+ if (!file) {
224
+ this.logger.warn(`File not found for hard delete: ${id}`);
225
+ return; // 已删除,幂等操作
226
+ }
227
+ // 硬删除默认清理物理文件
228
+ if (deletePhysicalFile) {
229
+ yield this.deletePhysicalFile(file);
230
+ }
231
+ yield this.fileRepository.delete(id);
232
+ this.logger.debug(`File hard deleted: ${id}, physicalFile: ${deletePhysicalFile}`);
233
+ });
234
+ }
235
+ /**
236
+ * 添加元数据
237
+ */
238
+ addMetadata(fileId_1, key_1, value_1) {
239
+ return __awaiter(this, arguments, void 0, function* (fileId, key, value, isPublic = false) {
240
+ // 检查文件是否存在
241
+ const file = yield this.findById(fileId);
242
+ if (!file) {
243
+ throw new common_1.NotFoundException(`File not found: ${fileId}`);
244
+ }
245
+ // 检查是否已存在相同key的元数据
246
+ const existing = yield this.metadataRepository.findOne({
247
+ where: { fileId, key },
248
+ });
249
+ if (existing) {
250
+ // 更新现有元数据
251
+ existing.setValue(value);
252
+ existing.isPublic = isPublic;
253
+ return this.metadataRepository.save(existing);
254
+ }
255
+ // 创建新元数据
256
+ const metadata = this.metadataRepository.create({
257
+ fileId,
258
+ key,
259
+ isPublic,
260
+ });
261
+ metadata.setValue(value);
262
+ return this.metadataRepository.save(metadata);
263
+ });
264
+ }
265
+ /**
266
+ * 获取元数据
267
+ */
268
+ getMetadata(fileId, keys) {
269
+ return __awaiter(this, void 0, void 0, function* () {
270
+ const query = this.metadataRepository
271
+ .createQueryBuilder('metadata')
272
+ .where('metadata.fileId = :fileId', { fileId });
273
+ if (keys && keys.length > 0) {
274
+ query.andWhere('metadata.key IN (:...keys)', { keys });
275
+ }
276
+ const metadataList = yield query.getMany();
277
+ const result = new Map();
278
+ metadataList.forEach((metadata) => {
279
+ result.set(metadata.key, metadata.getValue());
280
+ });
281
+ return result;
282
+ });
283
+ }
284
+ /**
285
+ * 获取存储统计
286
+ */
287
+ getStorageStats(userId) {
288
+ return __awaiter(this, void 0, void 0, function* () {
289
+ const query = this.fileRepository
290
+ .createQueryBuilder('file')
291
+ .select('file.storageProvider', 'provider')
292
+ .addSelect('COUNT(*)', 'count')
293
+ .addSelect('SUM(file.size)', 'totalSize')
294
+ .where('file.status = :status', { status: 'completed' })
295
+ .andWhere('file.deletedAt IS NULL');
296
+ if (userId) {
297
+ query.andWhere('file.userId = :userId', { userId });
298
+ }
299
+ const results = yield query.groupBy('file.storageProvider').getRawMany();
300
+ const stats = {
301
+ totalFiles: 0,
302
+ totalSize: 0,
303
+ providers: {},
304
+ };
305
+ results.forEach((row) => {
306
+ const count = parseInt(row.count);
307
+ const size = parseInt(row.totalSize) || 0;
308
+ stats.totalFiles += count;
309
+ stats.totalSize += size;
310
+ stats.providers[row.provider] = {
311
+ count,
312
+ size,
313
+ };
314
+ });
315
+ return stats;
316
+ });
317
+ }
318
+ /**
319
+ * 更新处理状态
320
+ * 处理状态信息保存到 file_metadata 表
321
+ */
322
+ updateProcessingStatus(fileId, processor, status, result, error) {
323
+ return __awaiter(this, void 0, void 0, function* () {
324
+ const file = yield this.findById(fileId);
325
+ if (!file) {
326
+ this.logger.warn(`File not found for processing update: ${fileId}`);
327
+ return;
328
+ }
329
+ // 将处理状态保存到 metadata
330
+ const processingKey = `processing_${processor}`;
331
+ yield this.addMetadata(fileId, processingKey, {
332
+ processor,
333
+ status,
334
+ result: result || null,
335
+ error: error || null,
336
+ timestamp: new Date().toISOString(),
337
+ });
338
+ if (status === 'failed') {
339
+ file.markAsFailed(`Processor ${processor} failed: ${error}`);
340
+ yield this.fileRepository.save(file);
341
+ }
342
+ });
343
+ }
344
+ /**
345
+ * 清理临时文件(定时任务)
346
+ */
347
+ cleanupTempFiles() {
348
+ return __awaiter(this, arguments, void 0, function* (olderThanHours = 24) {
349
+ const cutoffDate = new Date();
350
+ cutoffDate.setHours(cutoffDate.getHours() - olderThanHours);
351
+ const result = yield this.fileRepository
352
+ .createQueryBuilder()
353
+ .delete()
354
+ .from(file_entity_1.FileEntity)
355
+ .where('status = :status', { status: 'processing' })
356
+ .andWhere('createdAt < :cutoffDate', { cutoffDate })
357
+ .execute();
358
+ this.logger.log(`Cleaned up ${result.affected || 0} temporary files`);
359
+ return { deleted: result.affected || 0 };
360
+ });
361
+ }
362
+ /**
363
+ * 获取文件内容(二进制)
364
+ * 适用于服务间调用,获取完整文件内容
365
+ *
366
+ * @param fileId 文件ID
367
+ * @returns 文件缓冲区对象
368
+ * @throws NotFoundException 文件不存在
369
+ * @throws BadRequestException 文件未完成上传
370
+ */
371
+ getFileContent(fileId) {
372
+ return __awaiter(this, void 0, void 0, function* () {
373
+ const file = yield this.findById(fileId);
374
+ if (!file) {
375
+ throw new common_1.NotFoundException(`File not found: ${fileId}`);
376
+ }
377
+ if (file.status !== 'completed') {
378
+ throw new common_1.BadRequestException(`File not ready: ${fileId}, status: ${file.status}`);
379
+ }
380
+ const provider = this.getStorageProvider(file.storageProvider);
381
+ return provider.download(file.path);
382
+ });
383
+ }
384
+ /**
385
+ * 获取文件流(用于大文件)
386
+ * 适用于流式处理,避免一次性加载到内存
387
+ * 注意:仅支持本地存储,对象存储请使用 getSignedUrl
388
+ *
389
+ * @param fileId 文件ID
390
+ * @returns 可读流
391
+ * @throws NotFoundException 文件不存在或物理文件缺失
392
+ * @throws BadRequestException 文件未完成或存储类型不支持
393
+ */
394
+ getFileStream(fileId) {
395
+ return __awaiter(this, void 0, void 0, function* () {
396
+ const file = yield this.findById(fileId);
397
+ if (!file) {
398
+ throw new common_1.NotFoundException(`File not found: ${fileId}`);
399
+ }
400
+ if (file.status !== 'completed') {
401
+ throw new common_1.BadRequestException(`File not ready: ${fileId}`);
402
+ }
403
+ // 本地存储:返回文件流
404
+ if (file.storageProvider === 'local') {
405
+ const physicalPath = file.getPhysicalPath();
406
+ if (!(0, fs_1.existsSync)(physicalPath)) {
407
+ throw new common_1.NotFoundException(`Physical file not found: ${fileId}`);
408
+ }
409
+ return (0, fs_1.createReadStream)(physicalPath);
410
+ }
411
+ // 对象存储:不支持直接流,需要通过预签名 URL
412
+ throw new common_1.BadRequestException(`Stream access not supported for storage type: ${file.storageProvider}. Use getSignedUrl() instead.`);
413
+ });
414
+ }
415
+ /**
416
+ * 获取预签名 URL(对象存储)
417
+ * 适用于客户端直接下载,或临时授权访问
418
+ *
419
+ * @param fileId 文件ID
420
+ * @param expiresIn 过期时间(秒),默认 3600 秒(1小时)
421
+ * @returns 预签名 URL
422
+ * @throws NotFoundException 文件不存在
423
+ */
424
+ getSignedUrl(fileId_1) {
425
+ return __awaiter(this, arguments, void 0, function* (fileId, expiresIn = 3600) {
426
+ const file = yield this.findById(fileId);
427
+ if (!file) {
428
+ throw new common_1.NotFoundException(`File not found: ${fileId}`);
429
+ }
430
+ if (file.status !== 'completed') {
431
+ throw new common_1.BadRequestException(`File not ready: ${fileId}`);
432
+ }
433
+ const provider = this.getStorageProvider(file.storageProvider);
434
+ return provider.getSignedUrl(file.path, expiresIn);
435
+ });
436
+ }
437
+ /**
438
+ * 批量获取文件内容
439
+ * 适用于需要同时处理多个文件的场景
440
+ * 失败的文件会被跳过,不会中断整个流程
441
+ *
442
+ * @param fileIds 文件ID列表
443
+ * @returns Map<文件ID, 文件内容>
444
+ */
445
+ getFilesContent(fileIds) {
446
+ return __awaiter(this, void 0, void 0, function* () {
447
+ const results = new Map();
448
+ yield Promise.allSettled(fileIds.map((id) => __awaiter(this, void 0, void 0, function* () {
449
+ try {
450
+ const content = yield this.getFileContent(id);
451
+ results.set(id, content);
452
+ }
453
+ catch (error) {
454
+ this.logger.warn(`Failed to get file content for ${id}: ${error.message}`);
455
+ }
456
+ })));
457
+ return results;
458
+ });
459
+ }
460
+ /**
461
+ * 获取文件访问 URL
462
+ * 根据存储类型返回不同的 URL
463
+ *
464
+ * @param fileId 文件ID
465
+ * @param baseUrl 基础 URL(可选,用于本地存储)
466
+ * @returns 文件访问 URL
467
+ */
468
+ getFileUrl(fileId, baseUrl) {
469
+ return __awaiter(this, void 0, void 0, function* () {
470
+ const file = yield this.findById(fileId);
471
+ if (!file) {
472
+ throw new common_1.NotFoundException(`File not found: ${fileId}`);
473
+ }
474
+ // 对象存储:使用预签名 URL
475
+ if (['s3', 'oss', 'minio'].includes(file.storageProvider)) {
476
+ return this.getSignedUrl(fileId);
477
+ }
478
+ // 本地存储:使用 API URL
479
+ const apiBase = baseUrl || process.env.API_BASE_URL || '';
480
+ return apiBase ? `${apiBase}/files/${file.id}` : `/files/${file.id}`;
481
+ });
482
+ }
483
+ // ========== 私有辅助方法 ==========
484
+ /**
485
+ * 批量删除文件
486
+ * @param fileIds 文件ID列表
487
+ * @param deletePhysicalFile 是否同时删除物理文件,默认 true
488
+ * @returns 删除结果统计
489
+ */
490
+ batchDelete(fileIds_1) {
491
+ return __awaiter(this, arguments, void 0, function* (fileIds, deletePhysicalFile = true) {
492
+ const success = [];
493
+ const failed = [];
494
+ for (const id of fileIds) {
495
+ try {
496
+ yield this.hardDelete(id, deletePhysicalFile);
497
+ success.push(id);
498
+ }
499
+ catch (error) {
500
+ failed.push({ id, error: error.message });
501
+ this.logger.warn(`Failed to delete file ${id}: ${error.message}`);
502
+ }
503
+ }
504
+ this.logger.log(`Batch delete completed: ${success.length} success, ${failed.length} failed`);
505
+ return { success, failed };
506
+ });
507
+ }
508
+ /**
509
+ * 复制文件(创建新记录)
510
+ * @param sourceFileId 源文件ID
511
+ * @param userId 新文件的用户ID(可选)
512
+ * @returns 新的文件实体
513
+ */
514
+ copyFile(sourceFileId, userId) {
515
+ return __awaiter(this, void 0, void 0, function* () {
516
+ const sourceFile = yield this.findById(sourceFileId);
517
+ if (!sourceFile) {
518
+ throw new common_1.NotFoundException(`Source file not found: ${sourceFileId}`);
519
+ }
520
+ const provider = this.getStorageProvider(sourceFile.storageProvider);
521
+ // 生成新路径
522
+ const ext = path.extname(sourceFile.path);
523
+ const basePath = sourceFile.path.replace(ext, '');
524
+ const newPath = `${basePath}-copy-${Date.now()}${ext}`;
525
+ // 复制物理文件
526
+ const copyResult = yield provider.copy(sourceFile.path, newPath);
527
+ // 创建新记录
528
+ const newFile = yield this.create({
529
+ originalName: `${sourceFile.originalName} (copy)`,
530
+ filename: path.basename(newPath),
531
+ mimeType: sourceFile.mimeType,
532
+ size: Number(copyResult.size),
533
+ path: newPath,
534
+ storageProvider: sourceFile.storageProvider,
535
+ userId: userId || sourceFile.userId,
536
+ status: 'completed',
537
+ checksum: copyResult.etag,
538
+ metadata: Object.assign(Object.assign({}, sourceFile.metadata), { copiedFrom: sourceFileId }),
539
+ });
540
+ // 复制 fileType 和 extension
541
+ newFile.fileType = sourceFile.fileType;
542
+ newFile.extension = sourceFile.extension;
543
+ yield this.fileRepository.save(newFile);
544
+ this.logger.log(`File copied: ${sourceFileId} -> ${newFile.id}`);
545
+ return newFile;
546
+ });
547
+ }
548
+ /**
549
+ * 移动文件到新路径
550
+ * @param fileId 文件ID
551
+ * @param newPath 新路径
552
+ * @returns 更新后的文件实体
553
+ */
554
+ moveFile(fileId, newPath) {
555
+ return __awaiter(this, void 0, void 0, function* () {
556
+ const file = yield this.findById(fileId);
557
+ if (!file) {
558
+ throw new common_1.NotFoundException(`File not found: ${fileId}`);
559
+ }
560
+ const provider = this.getStorageProvider(file.storageProvider);
561
+ // 移动物理文件
562
+ const moveResult = yield provider.move(file.path, newPath);
563
+ // 更新记录
564
+ const updated = yield this.update(fileId, {
565
+ path: newPath,
566
+ filename: path.basename(newPath),
567
+ checksum: moveResult.etag,
568
+ });
569
+ this.logger.log(`File moved: ${file.path} -> ${newPath}`);
570
+ return updated;
571
+ });
572
+ }
573
+ /**
574
+ * 删除物理文件
575
+ * @private
576
+ */
577
+ deletePhysicalFile(file) {
578
+ return __awaiter(this, void 0, void 0, function* () {
579
+ try {
580
+ const provider = this.getStorageProvider(file.storageProvider);
581
+ yield provider.delete(file.path);
582
+ this.logger.debug(`Physical file deleted: ${file.path} (provider: ${file.storageProvider})`);
583
+ }
584
+ catch (error) {
585
+ this.logger.error(`Failed to delete physical file: ${file.path}`, error.stack);
586
+ // 不抛出异常,避免阻塞删除流程
587
+ }
588
+ });
589
+ }
590
+ /**
591
+ * 根据存储类型获取存储提供者
592
+ *
593
+ * @param storageType 存储类型
594
+ * @returns 存储提供者实例
595
+ * @throws Error 存储提供者未配置或不支持
596
+ */
597
+ getStorageProvider(storageType) {
598
+ switch (storageType) {
599
+ case 'local':
600
+ if (!this.localStorageProvider) {
601
+ throw new Error('Local storage provider not configured');
602
+ }
603
+ return this.localStorageProvider;
604
+ case 's3':
605
+ if (!this.s3StorageProvider) {
606
+ throw new Error('S3 storage provider not configured');
607
+ }
608
+ return this.s3StorageProvider;
609
+ default:
610
+ // 回退到默认提供者
611
+ if (this.storageProvider) {
612
+ return this.storageProvider;
613
+ }
614
+ throw new Error(`Unsupported storage provider: ${storageType}`);
615
+ }
616
+ }
617
+ /**
618
+ * 转义 LIKE 操作符中的特殊字符
619
+ */
620
+ escapeLikeString(input) {
621
+ // 转义 LIKE 通配符和反斜杠
622
+ return input.replace(/[%_\\]/g, '\\$&');
623
+ }
624
+ };
625
+ exports.FileService = FileService;
626
+ exports.FileService = FileService = FileService_1 = __decorate([
627
+ (0, common_1.Injectable)(),
628
+ __param(0, (0, typeorm_1.InjectRepository)(file_entity_1.FileEntity)),
629
+ __param(1, (0, typeorm_1.InjectRepository)(file_metadata_entity_1.FileMetadataEntity)),
630
+ __param(2, (0, common_1.Optional)()),
631
+ __param(2, (0, common_1.Inject)('STORAGE_PROVIDER')),
632
+ __param(3, (0, common_1.Optional)()),
633
+ __param(3, (0, common_1.Inject)('LOCAL_STORAGE_PROVIDER')),
634
+ __param(4, (0, common_1.Optional)()),
635
+ __param(4, (0, common_1.Inject)('S3_STORAGE_PROVIDER')),
636
+ __metadata("design:paramtypes", [typeorm_2.Repository,
637
+ typeorm_2.Repository, Object, Object, Object])
638
+ ], FileService);
@@ -0,0 +1,4 @@
1
+ export * from './mime-registry.service';
2
+ export * from './file-signature-validator.service';
3
+ export * from './malicious-file-detector.service';
4
+ export * from './file.service';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./mime-registry.service"), exports);
18
+ __exportStar(require("./file-signature-validator.service"), exports);
19
+ __exportStar(require("./malicious-file-detector.service"), exports);
20
+ __exportStar(require("./file.service"), exports);