@webiny/api-file-manager-s3 0.0.0-unstable.eb196ccd2f → 0.0.0-unstable.eb81deee7e

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 (232) hide show
  1. package/FileManagerS3Feature.d.ts +9 -0
  2. package/FileManagerS3Feature.js +27 -0
  3. package/FileManagerS3Feature.js.map +1 -0
  4. package/README.md +11 -1
  5. package/assetDelivery/abstractions.d.ts +11 -0
  6. package/assetDelivery/abstractions.js +7 -0
  7. package/assetDelivery/abstractions.js.map +1 -0
  8. package/assetDelivery/assetDeliveryConfig.d.ts +2 -2
  9. package/assetDelivery/assetDeliveryConfig.js +10 -49
  10. package/assetDelivery/assetDeliveryConfig.js.map +1 -1
  11. package/assetDelivery/createAssetDelivery.d.ts +3 -3
  12. package/assetDelivery/createAssetDelivery.js +7 -28
  13. package/assetDelivery/createAssetDelivery.js.map +1 -1
  14. package/assetDelivery/feature.d.ts +5 -0
  15. package/assetDelivery/feature.js +36 -0
  16. package/assetDelivery/feature.js.map +1 -0
  17. package/assetDelivery/index.d.ts +8 -9
  18. package/assetDelivery/index.js +8 -70
  19. package/assetDelivery/s3/LazySharpTransform.d.ts +34 -0
  20. package/assetDelivery/s3/LazySharpTransform.js +34 -0
  21. package/assetDelivery/s3/LazySharpTransform.js.map +1 -0
  22. package/assetDelivery/s3/S3AssetResolver.d.ts +9 -4
  23. package/assetDelivery/s3/S3AssetResolver.js +34 -32
  24. package/assetDelivery/s3/S3AssetResolver.js.map +1 -1
  25. package/assetDelivery/s3/S3ContentsReader.d.ts +1 -3
  26. package/assetDelivery/s3/S3ContentsReader.js +12 -22
  27. package/assetDelivery/s3/S3ContentsReader.js.map +1 -1
  28. package/assetDelivery/s3/S3ErrorAssetReply.js +11 -17
  29. package/assetDelivery/s3/S3ErrorAssetReply.js.map +1 -1
  30. package/assetDelivery/s3/S3OutputStrategy.d.ts +6 -6
  31. package/assetDelivery/s3/S3OutputStrategy.js +35 -35
  32. package/assetDelivery/s3/S3OutputStrategy.js.map +1 -1
  33. package/assetDelivery/s3/S3RedirectAssetReply.js +14 -20
  34. package/assetDelivery/s3/S3RedirectAssetReply.js.map +1 -1
  35. package/assetDelivery/s3/S3StreamAssetReply.js +14 -20
  36. package/assetDelivery/s3/S3StreamAssetReply.js.map +1 -1
  37. package/assetDelivery/s3/SharpTransform.d.ts +22 -14
  38. package/assetDelivery/s3/SharpTransform.js +163 -182
  39. package/assetDelivery/s3/SharpTransform.js.map +1 -1
  40. package/assetDelivery/s3/transformation/AssetKeyGenerator.js +17 -25
  41. package/assetDelivery/s3/transformation/AssetKeyGenerator.js.map +1 -1
  42. package/assetDelivery/s3/transformation/CallableContentsReader.d.ts +0 -2
  43. package/assetDelivery/s3/transformation/CallableContentsReader.js +7 -13
  44. package/assetDelivery/s3/transformation/CallableContentsReader.js.map +1 -1
  45. package/assetDelivery/s3/transformation/WidthCollection.js +14 -22
  46. package/assetDelivery/s3/transformation/WidthCollection.js.map +1 -1
  47. package/assetDelivery/s3/transformation/utils.d.ts +1 -3
  48. package/assetDelivery/s3/transformation/utils.js +26 -28
  49. package/assetDelivery/s3/transformation/utils.js.map +1 -1
  50. package/assetDelivery/threatDetection/ObjectKey.d.ts +7 -0
  51. package/assetDelivery/threatDetection/ObjectKey.js +18 -0
  52. package/assetDelivery/threatDetection/ObjectKey.js.map +1 -0
  53. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.d.ts +22 -2
  54. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js +49 -58
  55. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js.map +1 -1
  56. package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.d.ts +1 -1
  57. package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js +3 -11
  58. package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js.map +1 -1
  59. package/assetDelivery/threatDetection/index.d.ts +2 -2
  60. package/assetDelivery/threatDetection/index.js +2 -29
  61. package/assetDelivery/threatDetection/processThreatScanResult.d.ts +3 -2
  62. package/assetDelivery/threatDetection/processThreatScanResult.js +56 -61
  63. package/assetDelivery/threatDetection/processThreatScanResult.js.map +1 -1
  64. package/assetDelivery/threatDetection/types.d.ts +0 -4
  65. package/assetDelivery/threatDetection/types.js +0 -7
  66. package/assetDelivery/types.d.ts +4 -2
  67. package/assetDelivery/types.js +0 -7
  68. package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.d.ts +13 -0
  69. package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js +28 -0
  70. package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js.map +1 -0
  71. package/enterprise/ApplyThreatScanning/feature.d.ts +4 -0
  72. package/enterprise/ApplyThreatScanning/feature.js +11 -0
  73. package/enterprise/ApplyThreatScanning/feature.js.map +1 -0
  74. package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.d.ts +15 -0
  75. package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js +35 -0
  76. package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js.map +1 -0
  77. package/features/DeleteFileFromBucket/DeleteS3FolderTask.d.ts +37 -0
  78. package/features/DeleteFileFromBucket/DeleteS3FolderTask.js +57 -0
  79. package/features/DeleteFileFromBucket/DeleteS3FolderTask.js.map +1 -0
  80. package/features/DeleteFileFromBucket/feature.d.ts +4 -0
  81. package/features/DeleteFileFromBucket/feature.js +13 -0
  82. package/features/DeleteFileFromBucket/feature.js.map +1 -0
  83. package/features/ExtractMetadata/ExtractMetadataHandler.d.ts +11 -0
  84. package/features/ExtractMetadata/ExtractMetadataHandler.js +25 -0
  85. package/features/ExtractMetadata/ExtractMetadataHandler.js.map +1 -0
  86. package/features/ExtractMetadata/ExtractMetadataTask.d.ts +29 -0
  87. package/features/ExtractMetadata/ExtractMetadataTask.js +99 -0
  88. package/features/ExtractMetadata/ExtractMetadataTask.js.map +1 -0
  89. package/features/ExtractMetadata/feature.d.ts +4 -0
  90. package/features/ExtractMetadata/feature.js +13 -0
  91. package/features/ExtractMetadata/feature.js.map +1 -0
  92. package/features/FlushCache/FlushCacheOnFileDeleteHandler.d.ts +12 -0
  93. package/features/FlushCache/FlushCacheOnFileDeleteHandler.js +28 -0
  94. package/features/FlushCache/FlushCacheOnFileDeleteHandler.js.map +1 -0
  95. package/features/FlushCache/FlushCacheOnFileUpdateHandler.d.ts +12 -0
  96. package/features/FlushCache/FlushCacheOnFileUpdateHandler.js +31 -0
  97. package/features/FlushCache/FlushCacheOnFileUpdateHandler.js.map +1 -0
  98. package/features/FlushCache/InvalidateCacheTask.d.ts +31 -0
  99. package/features/FlushCache/InvalidateCacheTask.js +84 -0
  100. package/features/FlushCache/InvalidateCacheTask.js.map +1 -0
  101. package/features/FlushCache/feature.d.ts +4 -0
  102. package/features/FlushCache/feature.js +15 -0
  103. package/features/FlushCache/feature.js.map +1 -0
  104. package/features/GetFileContentsById/GetFileContentsByIdUseCase.d.ts +13 -0
  105. package/features/GetFileContentsById/GetFileContentsByIdUseCase.js +40 -0
  106. package/features/GetFileContentsById/GetFileContentsByIdUseCase.js.map +1 -0
  107. package/features/GetFileContentsById/feature.d.ts +4 -0
  108. package/features/GetFileContentsById/feature.js +11 -0
  109. package/features/GetFileContentsById/feature.js.map +1 -0
  110. package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.d.ts +13 -0
  111. package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.js +40 -0
  112. package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.js.map +1 -0
  113. package/features/GetFileContentsByKey/feature.d.ts +4 -0
  114. package/features/GetFileContentsByKey/feature.js +11 -0
  115. package/features/GetFileContentsByKey/feature.js.map +1 -0
  116. package/features/WriteFileMetadata/MetadataReader.d.ts +14 -0
  117. package/features/WriteFileMetadata/MetadataReader.js +13 -0
  118. package/features/WriteFileMetadata/MetadataReader.js.map +1 -0
  119. package/features/WriteFileMetadata/MetadataWriter.d.ts +10 -0
  120. package/features/WriteFileMetadata/MetadataWriter.js +28 -0
  121. package/features/WriteFileMetadata/MetadataWriter.js.map +1 -0
  122. package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.d.ts +12 -0
  123. package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js +23 -0
  124. package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js.map +1 -0
  125. package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.d.ts +12 -0
  126. package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js +25 -0
  127. package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js.map +1 -0
  128. package/features/WriteFileMetadata/feature.d.ts +4 -0
  129. package/features/WriteFileMetadata/feature.js +13 -0
  130. package/features/WriteFileMetadata/feature.js.map +1 -0
  131. package/graphql/S3GraphQLSchema.d.ts +10 -0
  132. package/graphql/S3GraphQLSchema.js +233 -0
  133. package/graphql/S3GraphQLSchema.js.map +1 -0
  134. package/graphql/checkPermissions.d.ts +5 -0
  135. package/graphql/checkPermissions.js +22 -0
  136. package/graphql/checkPermissions.js.map +1 -0
  137. package/index.d.ts +4 -5
  138. package/index.js +3 -36
  139. package/multiPartUpload/CompleteMultiPartUploadUseCase.d.ts +1 -1
  140. package/multiPartUpload/CompleteMultiPartUploadUseCase.js +49 -59
  141. package/multiPartUpload/CompleteMultiPartUploadUseCase.js.map +1 -1
  142. package/multiPartUpload/CreateMultiPartUploadUseCase.d.ts +2 -2
  143. package/multiPartUpload/CreateMultiPartUploadUseCase.js +30 -44
  144. package/multiPartUpload/CreateMultiPartUploadUseCase.js.map +1 -1
  145. package/package.json +36 -34
  146. package/types.d.ts +2 -1
  147. package/types.js +1 -7
  148. package/utils/CdnPathsGenerator.d.ts +3 -0
  149. package/utils/CdnPathsGenerator.js +11 -0
  150. package/utils/CdnPathsGenerator.js.map +1 -0
  151. package/utils/FileExtension.d.ts +1 -1
  152. package/utils/FileExtension.js +11 -19
  153. package/utils/FileExtension.js.map +1 -1
  154. package/utils/FileKey.d.ts +1 -1
  155. package/utils/FileKey.js +29 -29
  156. package/utils/FileKey.js.map +1 -1
  157. package/utils/FileKey.test.js +50 -51
  158. package/utils/FileKey.test.js.map +1 -1
  159. package/utils/FileNormalizer.d.ts +2 -2
  160. package/utils/FileNormalizer.js +35 -43
  161. package/utils/FileNormalizer.js.map +1 -1
  162. package/utils/FileUploadModifier.d.ts +9 -3
  163. package/utils/FileUploadModifier.js +36 -44
  164. package/utils/FileUploadModifier.js.map +1 -1
  165. package/utils/createFileNormalizerFromContext.d.ts +2 -2
  166. package/utils/createFileNormalizerFromContext.js +6 -12
  167. package/utils/createFileNormalizerFromContext.js.map +1 -1
  168. package/utils/getPresignedPostPayload.d.ts +4 -3
  169. package/utils/getPresignedPostPayload.js +38 -40
  170. package/utils/getPresignedPostPayload.js.map +1 -1
  171. package/utils/mimeTypes.js +6 -20
  172. package/utils/mimeTypes.js.map +1 -1
  173. package/utils/uploadFileToS3.d.ts +2 -5
  174. package/utils/uploadFileToS3.js +11 -23
  175. package/utils/uploadFileToS3.js.map +1 -1
  176. package/assetDelivery/createCustomAssetDelivery.d.ts +0 -12
  177. package/assetDelivery/createCustomAssetDelivery.js +0 -28
  178. package/assetDelivery/createCustomAssetDelivery.js.map +0 -1
  179. package/assetDelivery/customAssets/CustomAsset.d.ts +0 -6
  180. package/assetDelivery/customAssets/CustomAsset.js +0 -14
  181. package/assetDelivery/customAssets/CustomAsset.js.map +0 -1
  182. package/assetDelivery/customAssets/CustomAssetProcessor.d.ts +0 -10
  183. package/assetDelivery/customAssets/CustomAssetProcessor.js +0 -25
  184. package/assetDelivery/customAssets/CustomAssetProcessor.js.map +0 -1
  185. package/assetDelivery/customAssets/S3CustomAssetResolver.d.ts +0 -15
  186. package/assetDelivery/customAssets/S3CustomAssetResolver.js +0 -90
  187. package/assetDelivery/customAssets/S3CustomAssetResolver.js.map +0 -1
  188. package/assetDelivery/customAssets/customAssetDeliveryConfig.d.ts +0 -1
  189. package/assetDelivery/customAssets/customAssetDeliveryConfig.js +0 -30
  190. package/assetDelivery/customAssets/customAssetDeliveryConfig.js.map +0 -1
  191. package/assetDelivery/index.js.map +0 -1
  192. package/assetDelivery/s3/S3AssetMetadataReader.d.ts +0 -15
  193. package/assetDelivery/s3/S3AssetMetadataReader.js +0 -36
  194. package/assetDelivery/s3/S3AssetMetadataReader.js.map +0 -1
  195. package/assetDelivery/s3/transformation/legacyUtils.d.ts +0 -12
  196. package/assetDelivery/s3/transformation/legacyUtils.js +0 -34
  197. package/assetDelivery/s3/transformation/legacyUtils.js.map +0 -1
  198. package/assetDelivery/threatDetection/index.js.map +0 -1
  199. package/assetDelivery/threatDetection/types.js.map +0 -1
  200. package/assetDelivery/types.js.map +0 -1
  201. package/flushCdnCache/CdnPathsGenerator.d.ts +0 -4
  202. package/flushCdnCache/CdnPathsGenerator.js +0 -14
  203. package/flushCdnCache/CdnPathsGenerator.js.map +0 -1
  204. package/flushCdnCache/InvalidateCacheTask.d.ts +0 -18
  205. package/flushCdnCache/InvalidateCacheTask.js +0 -78
  206. package/flushCdnCache/InvalidateCacheTask.js.map +0 -1
  207. package/flushCdnCache/flushCacheOnFileDelete.d.ts +0 -3
  208. package/flushCdnCache/flushCacheOnFileDelete.js +0 -34
  209. package/flushCdnCache/flushCacheOnFileDelete.js.map +0 -1
  210. package/flushCdnCache/flushCacheOnFileUpdate.d.ts +0 -3
  211. package/flushCdnCache/flushCacheOnFileUpdate.js +0 -40
  212. package/flushCdnCache/flushCacheOnFileUpdate.js.map +0 -1
  213. package/flushCdnCache/index.d.ts +0 -1
  214. package/flushCdnCache/index.js +0 -15
  215. package/flushCdnCache/index.js.map +0 -1
  216. package/flushCdnCache/invalidateCacheTaskDefinition.d.ts +0 -2
  217. package/flushCdnCache/invalidateCacheTaskDefinition.js +0 -22
  218. package/flushCdnCache/invalidateCacheTaskDefinition.js.map +0 -1
  219. package/index.js.map +0 -1
  220. package/plugins/addFileMetadata.d.ts +0 -10
  221. package/plugins/addFileMetadata.js +0 -67
  222. package/plugins/addFileMetadata.js.map +0 -1
  223. package/plugins/checkPermissions.d.ts +0 -4
  224. package/plugins/checkPermissions.js +0 -44
  225. package/plugins/checkPermissions.js.map +0 -1
  226. package/plugins/fileStorageS3.d.ts +0 -3
  227. package/plugins/fileStorageS3.js +0 -60
  228. package/plugins/fileStorageS3.js.map +0 -1
  229. package/plugins/graphqlFileStorageS3.d.ts +0 -4
  230. package/plugins/graphqlFileStorageS3.js +0 -213
  231. package/plugins/graphqlFileStorageS3.js.map +0 -1
  232. package/types.js.map +0 -1
@@ -0,0 +1,28 @@
1
+ import { CreateFileUseCase } from "@webiny/api-file-manager/features/file/CreateFile/abstractions.js";
2
+ import { FeatureFlags } from "@webiny/api-core/features/featureFlags/abstractions.js";
3
+ class CreateFileWithThreatScanDecoratorImpl {
4
+ constructor(featureFlags, decoratee){
5
+ this.featureFlags = featureFlags;
6
+ this.decoratee = decoratee;
7
+ }
8
+ async execute(input, meta) {
9
+ if (!this.featureFlags.get().isEnabled("fileManager.threatDetection")) return this.decoratee.execute(input, meta);
10
+ const modifiedInput = {
11
+ ...input,
12
+ tags: [
13
+ ...input.tags || [],
14
+ "threatScanInProgress"
15
+ ]
16
+ };
17
+ return this.decoratee.execute(modifiedInput, meta);
18
+ }
19
+ }
20
+ const CreateFileWithThreatScanDecorator = CreateFileUseCase.createDecorator({
21
+ decorator: CreateFileWithThreatScanDecoratorImpl,
22
+ dependencies: [
23
+ FeatureFlags
24
+ ]
25
+ });
26
+ export { CreateFileWithThreatScanDecorator };
27
+
28
+ //# sourceMappingURL=CreateFileWithThreatScanDecorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js","sources":["../../../src/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.ts"],"sourcesContent":["import { CreateFileUseCase } from \"@webiny/api-file-manager/features/file/CreateFile/abstractions.js\";\nimport type { CreateFileInput } from \"@webiny/api-file-manager/features/file/CreateFile/abstractions.js\";\nimport { FeatureFlags } from \"@webiny/api-core/features/featureFlags/abstractions.js\";\n\nclass CreateFileWithThreatScanDecoratorImpl implements CreateFileUseCase.Interface {\n constructor(\n private featureFlags: FeatureFlags.Interface,\n private decoratee: CreateFileUseCase.Interface\n ) {}\n\n async execute(\n input: CreateFileInput,\n meta?: Record<string, any>\n ): ReturnType<CreateFileUseCase.Interface[\"execute\"]> {\n if (!this.featureFlags.get().isEnabled(\"fileManager.threatDetection\")) {\n return this.decoratee.execute(input, meta);\n }\n\n const modifiedInput: CreateFileInput = {\n ...input,\n tags: [...(input.tags || []), \"threatScanInProgress\"]\n };\n\n return this.decoratee.execute(modifiedInput, meta);\n }\n}\n\nexport const CreateFileWithThreatScanDecorator = CreateFileUseCase.createDecorator({\n decorator: CreateFileWithThreatScanDecoratorImpl,\n dependencies: [FeatureFlags]\n});\n"],"names":["CreateFileWithThreatScanDecoratorImpl","featureFlags","decoratee","input","meta","modifiedInput","CreateFileWithThreatScanDecorator","CreateFileUseCase","FeatureFlags"],"mappings":";;AAIA,MAAMA;IACF,YACYC,YAAoC,EACpCC,SAAsC,CAChD;aAFUD,YAAY,GAAZA;aACAC,SAAS,GAATA;IACT;IAEH,MAAM,QACFC,KAAsB,EACtBC,IAA0B,EACwB;QAClD,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,SAAS,CAAC,gCACnC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAACD,OAAOC;QAGzC,MAAMC,gBAAiC;YACnC,GAAGF,KAAK;YACR,MAAM;mBAAKA,MAAM,IAAI,IAAI,EAAE;gBAAG;aAAuB;QACzD;QAEA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAACE,eAAeD;IACjD;AACJ;AAEO,MAAME,oCAAoCC,kBAAkB,eAAe,CAAC;IAC/E,WAAWP;IACX,cAAc;QAACQ;KAAa;AAChC"}
@@ -0,0 +1,4 @@
1
+ export declare const ApplyThreatScanningFeature: {
2
+ name: string;
3
+ register(container: import("@webiny/di").Container): void;
4
+ };
@@ -0,0 +1,11 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { CreateFileWithThreatScanDecorator } from "./CreateFileWithThreatScanDecorator.js";
3
+ const ApplyThreatScanningFeature = createFeature({
4
+ name: "FileManagerS3/ApplyThreatScanning",
5
+ register (container) {
6
+ container.registerDecorator(CreateFileWithThreatScanDecorator);
7
+ }
8
+ });
9
+ export { ApplyThreatScanningFeature };
10
+
11
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"enterprise/ApplyThreatScanning/feature.js","sources":["../../../src/enterprise/ApplyThreatScanning/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { CreateFileWithThreatScanDecorator } from \"./CreateFileWithThreatScanDecorator.js\";\n\nexport const ApplyThreatScanningFeature = createFeature({\n name: \"FileManagerS3/ApplyThreatScanning\",\n register(container) {\n container.registerDecorator(CreateFileWithThreatScanDecorator);\n }\n});\n"],"names":["ApplyThreatScanningFeature","createFeature","container","CreateFileWithThreatScanDecorator"],"mappings":";;AAGO,MAAMA,6BAA6BC,cAAc;IACpD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,iBAAiB,CAACC;IAChC;AACJ"}
@@ -0,0 +1,15 @@
1
+ import { FileAfterDeleteEventHandler } from "@webiny/api-file-manager/features/file/DeleteFile/events.js";
2
+ import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js";
3
+ import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
4
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
5
+ declare class DeleteFileFromBucketHandlerImpl implements FileAfterDeleteEventHandler.Interface {
6
+ private tenantContext;
7
+ private taskService;
8
+ private keyValueStore;
9
+ constructor(tenantContext: TenantContext.Interface, taskService: TaskService.Interface, keyValueStore: GlobalKeyValueStore.Interface);
10
+ handle(event: FileAfterDeleteEventHandler.Event): Promise<void>;
11
+ }
12
+ export declare const DeleteFileFromBucketHandler: typeof DeleteFileFromBucketHandlerImpl & {
13
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher").IEventHandler<import("@webiny/api-file-manager/features/file/DeleteFile/events.js").FileAfterDeleteEvent>>;
14
+ };
15
+ export {};
@@ -0,0 +1,35 @@
1
+ import { FileAfterDeleteEventHandler } from "@webiny/api-file-manager/features/file/DeleteFile/events.js";
2
+ import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js";
3
+ import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
4
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
5
+ class DeleteFileFromBucketHandlerImpl {
6
+ constructor(tenantContext, taskService, keyValueStore){
7
+ this.tenantContext = tenantContext;
8
+ this.taskService = taskService;
9
+ this.keyValueStore = keyValueStore;
10
+ }
11
+ async handle(event) {
12
+ const { file } = event.payload;
13
+ const tenant = this.tenantContext.getTenant();
14
+ await this.taskService.trigger({
15
+ definition: "fileManagerFolderDelete",
16
+ input: {
17
+ caller: "fm-after-delete",
18
+ bucket: String(process.env.S3_BUCKET),
19
+ folderKey: `tenants/${tenant.id}/files/${file.id}`
20
+ }
21
+ });
22
+ await this.keyValueStore.delete(`FileManager/File/${file.id}/Metadata`);
23
+ }
24
+ }
25
+ const DeleteFileFromBucketHandler = FileAfterDeleteEventHandler.createImplementation({
26
+ implementation: DeleteFileFromBucketHandlerImpl,
27
+ dependencies: [
28
+ TenantContext,
29
+ TaskService,
30
+ GlobalKeyValueStore
31
+ ]
32
+ });
33
+ export { DeleteFileFromBucketHandler };
34
+
35
+ //# sourceMappingURL=DeleteFileFromBucketHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js","sources":["../../../src/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.ts"],"sourcesContent":["import { FileAfterDeleteEventHandler } from \"@webiny/api-file-manager/features/file/DeleteFile/events.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\nimport type { DeleteS3FolderInput } from \"~/features/DeleteFileFromBucket/DeleteS3FolderTask.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\n\nclass DeleteFileFromBucketHandlerImpl implements FileAfterDeleteEventHandler.Interface {\n constructor(\n private tenantContext: TenantContext.Interface,\n private taskService: TaskService.Interface,\n private keyValueStore: GlobalKeyValueStore.Interface\n ) {}\n\n async handle(event: FileAfterDeleteEventHandler.Event): Promise<void> {\n const { file } = event.payload;\n const tenant = this.tenantContext.getTenant();\n\n // Delete S3 folder recursively\n await this.taskService.trigger<DeleteS3FolderInput>({\n definition: \"fileManagerFolderDelete\",\n input: {\n caller: \"fm-after-delete\",\n bucket: String(process.env.S3_BUCKET),\n folderKey: `tenants/${tenant.id}/files/${file.id}`\n }\n });\n\n // Delete file metadata\n await this.keyValueStore.delete(`FileManager/File/${file.id}/Metadata`);\n }\n}\n\nexport const DeleteFileFromBucketHandler = FileAfterDeleteEventHandler.createImplementation({\n implementation: DeleteFileFromBucketHandlerImpl,\n dependencies: [TenantContext, TaskService, GlobalKeyValueStore]\n});\n"],"names":["DeleteFileFromBucketHandlerImpl","tenantContext","taskService","keyValueStore","event","file","tenant","String","process","DeleteFileFromBucketHandler","FileAfterDeleteEventHandler","TenantContext","TaskService","GlobalKeyValueStore"],"mappings":";;;;AAMA,MAAMA;IACF,YACYC,aAAsC,EACtCC,WAAkC,EAClCC,aAA4C,CACtD;aAHUF,aAAa,GAAbA;aACAC,WAAW,GAAXA;aACAC,aAAa,GAAbA;IACT;IAEH,MAAM,OAAOC,KAAwC,EAAiB;QAClE,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAM,OAAO;QAC9B,MAAME,SAAS,IAAI,CAAC,aAAa,CAAC,SAAS;QAG3C,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAsB;YAChD,YAAY;YACZ,OAAO;gBACH,QAAQ;gBACR,QAAQC,OAAOC,QAAQ,GAAG,CAAC,SAAS;gBACpC,WAAW,CAAC,QAAQ,EAAEF,OAAO,EAAE,CAAC,OAAO,EAAED,KAAK,EAAE,EAAE;YACtD;QACJ;QAGA,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,iBAAiB,EAAEA,KAAK,EAAE,CAAC,SAAS,CAAC;IAC1E;AACJ;AAEO,MAAMI,8BAA8BC,4BAA4B,oBAAoB,CAAC;IACxF,gBAAgBV;IAChB,cAAc;QAACW;QAAeC;QAAaC;KAAoB;AACnE"}
@@ -0,0 +1,37 @@
1
+ import { TaskDefinition, TaskHandler } from "@webiny/api-core/features/task/TaskDefinition/index.js";
2
+ export interface DeleteS3FolderInput {
3
+ /**
4
+ * Caller of the task (e.g., `fm-after-delete`).
5
+ */
6
+ caller: string;
7
+ /**
8
+ * Cache paths to invalidate.
9
+ */
10
+ bucket: string;
11
+ /**
12
+ * FM file directory key to delete.
13
+ */
14
+ folderKey: string;
15
+ /**
16
+ * Continuation token for pagination.
17
+ */
18
+ continuationToken?: string;
19
+ }
20
+ declare class DeleteS3FolderTaskHandlerImpl implements TaskHandler.Interface<DeleteS3FolderInput> {
21
+ run({ input, controller }: TaskHandler.RunParams<DeleteS3FolderInput>): Promise<TaskDefinition.Result<DeleteS3FolderInput>>;
22
+ }
23
+ declare class DeleteS3FolderTask implements TaskDefinition.Interface {
24
+ id: string;
25
+ title: string;
26
+ description: string;
27
+ maxIterations: number;
28
+ isPrivate: boolean;
29
+ readonly selfCleanup: ("onAbort" | "onSuccess")[];
30
+ handler: typeof DeleteS3FolderTaskHandlerImpl & {
31
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskHandler<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
32
+ };
33
+ }
34
+ export declare const DeleteS3FolderTaskDefinition: typeof DeleteS3FolderTask & {
35
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskDefinition<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
36
+ };
37
+ export {};
@@ -0,0 +1,57 @@
1
+ import { S3 } from "@webiny/aws-sdk/client-s3/index.js";
2
+ import { TaskDefinition, TaskHandler } from "@webiny/api-core/features/task/TaskDefinition/index.js";
3
+ class DeleteS3FolderTaskHandlerImpl {
4
+ async run({ input, controller }) {
5
+ if (controller.runtime.isAborted()) return controller.response.aborted();
6
+ if (!input.bucket) return controller.response.error({
7
+ message: "Bucket is not defined."
8
+ });
9
+ const s3 = new S3();
10
+ const filesList = await s3.listObjectsV2({
11
+ Bucket: input.bucket,
12
+ Prefix: `${input.folderKey}/`,
13
+ ContinuationToken: input.continuationToken
14
+ });
15
+ if (filesList.Contents && filesList.Contents.length > 0) {
16
+ const objectsToDelete = filesList.Contents.filter((file)=>file.Key).map((file)=>({
17
+ Key: file.Key
18
+ }));
19
+ if (objectsToDelete.length > 0) await s3.deleteObjects({
20
+ Bucket: input.bucket,
21
+ Delete: {
22
+ Objects: objectsToDelete
23
+ }
24
+ });
25
+ }
26
+ if (filesList.IsTruncated && filesList.NextContinuationToken) return controller.response.continue({
27
+ ...input,
28
+ continuationToken: filesList.NextContinuationToken
29
+ });
30
+ return controller.response.done();
31
+ }
32
+ }
33
+ const DeleteS3FolderTaskHandler = TaskHandler.createImplementation({
34
+ implementation: DeleteS3FolderTaskHandlerImpl,
35
+ dependencies: []
36
+ });
37
+ class DeleteS3FolderTask {
38
+ constructor(){
39
+ this.id = "fileManagerFolderDelete";
40
+ this.title = "Delete folder and all of its contents from the bucket.";
41
+ this.description = "A task to delete all files from a given folder.";
42
+ this.maxIterations = 5;
43
+ this.isPrivate = true;
44
+ this.selfCleanup = [
45
+ "onSuccess",
46
+ "onAbort"
47
+ ];
48
+ this.handler = DeleteS3FolderTaskHandler;
49
+ }
50
+ }
51
+ const DeleteS3FolderTaskDefinition = TaskDefinition.createImplementation({
52
+ implementation: DeleteS3FolderTask,
53
+ dependencies: []
54
+ });
55
+ export { DeleteS3FolderTaskDefinition };
56
+
57
+ //# sourceMappingURL=DeleteS3FolderTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/DeleteFileFromBucket/DeleteS3FolderTask.js","sources":["../../../src/features/DeleteFileFromBucket/DeleteS3FolderTask.ts"],"sourcesContent":["import { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport {\n TaskDefinition,\n TaskHandler\n} from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\nexport interface DeleteS3FolderInput {\n /**\n * Caller of the task (e.g., `fm-after-delete`).\n */\n caller: string;\n /**\n * Cache paths to invalidate.\n */\n bucket: string;\n /**\n * FM file directory key to delete.\n */\n folderKey: string;\n /**\n * Continuation token for pagination.\n */\n continuationToken?: string;\n}\n\nclass DeleteS3FolderTaskHandlerImpl implements TaskHandler.Interface<DeleteS3FolderInput> {\n public async run({\n input,\n controller\n }: TaskHandler.RunParams<DeleteS3FolderInput>): Promise<\n TaskDefinition.Result<DeleteS3FolderInput>\n > {\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n }\n\n if (!input.bucket) {\n return controller.response.error({ message: `Bucket is not defined.` });\n }\n\n const s3 = new S3();\n\n // List objects in the folder with pagination support.\n const filesList = await s3.listObjectsV2({\n Bucket: input.bucket,\n Prefix: `${input.folderKey}/`,\n ContinuationToken: input.continuationToken\n });\n\n // Delete all files in the folder using batch delete.\n if (filesList.Contents && filesList.Contents.length > 0) {\n const objectsToDelete = filesList.Contents.filter(file => file.Key).map(file => ({\n Key: file.Key!\n }));\n\n if (objectsToDelete.length > 0) {\n await s3.deleteObjects({\n Bucket: input.bucket,\n Delete: {\n Objects: objectsToDelete\n }\n });\n }\n }\n\n // If there are more objects to delete, continue in the next iteration.\n if (filesList.IsTruncated && filesList.NextContinuationToken) {\n return controller.response.continue({\n ...input,\n continuationToken: filesList.NextContinuationToken\n });\n }\n\n return controller.response.done();\n }\n}\n\nconst DeleteS3FolderTaskHandler = TaskHandler.createImplementation({\n implementation: DeleteS3FolderTaskHandlerImpl,\n dependencies: []\n});\n\nclass DeleteS3FolderTask implements TaskDefinition.Interface {\n id = \"fileManagerFolderDelete\";\n title = \"Delete folder and all of its contents from the bucket.\";\n description = \"A task to delete all files from a given folder.\";\n maxIterations = 5;\n isPrivate = true;\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n handler = DeleteS3FolderTaskHandler;\n}\n\nexport const DeleteS3FolderTaskDefinition = TaskDefinition.createImplementation({\n implementation: DeleteS3FolderTask,\n dependencies: []\n});\n"],"names":["DeleteS3FolderTaskHandlerImpl","input","controller","s3","S3","filesList","objectsToDelete","file","DeleteS3FolderTaskHandler","TaskHandler","DeleteS3FolderTask","DeleteS3FolderTaskDefinition","TaskDefinition"],"mappings":";;AAyBA,MAAMA;IACF,MAAa,IAAI,EACbC,KAAK,EACLC,UAAU,EAC+B,EAE3C;QACE,IAAIA,WAAW,OAAO,CAAC,SAAS,IAC5B,OAAOA,WAAW,QAAQ,CAAC,OAAO;QAGtC,IAAI,CAACD,MAAM,MAAM,EACb,OAAOC,WAAW,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QAAyB;QAGzE,MAAMC,KAAK,IAAIC;QAGf,MAAMC,YAAY,MAAMF,GAAG,aAAa,CAAC;YACrC,QAAQF,MAAM,MAAM;YACpB,QAAQ,GAAGA,MAAM,SAAS,CAAC,CAAC,CAAC;YAC7B,mBAAmBA,MAAM,iBAAiB;QAC9C;QAGA,IAAII,UAAU,QAAQ,IAAIA,UAAU,QAAQ,CAAC,MAAM,GAAG,GAAG;YACrD,MAAMC,kBAAkBD,UAAU,QAAQ,CAAC,MAAM,CAACE,CAAAA,OAAQA,KAAK,GAAG,EAAE,GAAG,CAACA,CAAAA,OAAS;oBAC7E,KAAKA,KAAK,GAAG;gBACjB;YAEA,IAAID,gBAAgB,MAAM,GAAG,GACzB,MAAMH,GAAG,aAAa,CAAC;gBACnB,QAAQF,MAAM,MAAM;gBACpB,QAAQ;oBACJ,SAASK;gBACb;YACJ;QAER;QAGA,IAAID,UAAU,WAAW,IAAIA,UAAU,qBAAqB,EACxD,OAAOH,WAAW,QAAQ,CAAC,QAAQ,CAAC;YAChC,GAAGD,KAAK;YACR,mBAAmBI,UAAU,qBAAqB;QACtD;QAGJ,OAAOH,WAAW,QAAQ,CAAC,IAAI;IACnC;AACJ;AAEA,MAAMM,4BAA4BC,YAAY,oBAAoB,CAAC;IAC/D,gBAAgBT;IAChB,cAAc,EAAE;AACpB;AAEA,MAAMU;;aACF,EAAE,GAAG;aACL,KAAK,GAAG;aACR,WAAW,GAAG;aACd,aAAa,GAAG;aAChB,SAAS,GAAG;aACI,WAAW,GAAG;YAAC;YAAsB;SAAmB;aAExE,OAAO,GAAGF;;AACd;AAEO,MAAMG,+BAA+BC,eAAe,oBAAoB,CAAC;IAC5E,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
@@ -0,0 +1,4 @@
1
+ export declare const DeleteFileFromBucketFeature: {
2
+ name: string;
3
+ register(container: import("@webiny/di").Container): void;
4
+ };
@@ -0,0 +1,13 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { DeleteFileFromBucketHandler } from "./DeleteFileFromBucketHandler.js";
3
+ import { DeleteS3FolderTaskDefinition } from "./DeleteS3FolderTask.js";
4
+ const DeleteFileFromBucketFeature = createFeature({
5
+ name: "FileManagerS3/DeleteFileFromBucket",
6
+ register (container) {
7
+ container.register(DeleteFileFromBucketHandler);
8
+ container.register(DeleteS3FolderTaskDefinition);
9
+ }
10
+ });
11
+ export { DeleteFileFromBucketFeature };
12
+
13
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/DeleteFileFromBucket/feature.js","sources":["../../../src/features/DeleteFileFromBucket/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { DeleteFileFromBucketHandler } from \"./DeleteFileFromBucketHandler.js\";\nimport { DeleteS3FolderTaskDefinition } from \"./DeleteS3FolderTask.js\";\n\nexport const DeleteFileFromBucketFeature = createFeature({\n name: \"FileManagerS3/DeleteFileFromBucket\",\n register(container) {\n container.register(DeleteFileFromBucketHandler);\n container.register(DeleteS3FolderTaskDefinition);\n }\n});\n"],"names":["DeleteFileFromBucketFeature","createFeature","container","DeleteFileFromBucketHandler","DeleteS3FolderTaskDefinition"],"mappings":";;;AAIO,MAAMA,8BAA8BC,cAAc;IACrD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;IACvB;AACJ"}
@@ -0,0 +1,11 @@
1
+ import { FileAfterCreateEventHandler } from "@webiny/api-file-manager/features/file/CreateFile/events.js";
2
+ import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js";
3
+ declare class ExtractMetadataHandlerImpl implements FileAfterCreateEventHandler.Interface {
4
+ private taskService;
5
+ constructor(taskService: TaskService.Interface);
6
+ handle(event: FileAfterCreateEventHandler.Event): Promise<void>;
7
+ }
8
+ export declare const ExtractMetadataHandler: typeof ExtractMetadataHandlerImpl & {
9
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher/abstractions.js").IEventHandler<import("@webiny/api-file-manager/features/file/CreateFile/events.js").FileAfterCreateEvent>>;
10
+ };
11
+ export {};
@@ -0,0 +1,25 @@
1
+ import { FileAfterCreateEventHandler } from "@webiny/api-file-manager/features/file/CreateFile/events.js";
2
+ import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js";
3
+ class ExtractMetadataHandlerImpl {
4
+ constructor(taskService){
5
+ this.taskService = taskService;
6
+ }
7
+ async handle(event) {
8
+ const { file } = event.payload;
9
+ await this.taskService.trigger({
10
+ definition: "fileManagerExtractMetadata",
11
+ input: {
12
+ fileId: file.id
13
+ }
14
+ });
15
+ }
16
+ }
17
+ const ExtractMetadataHandler = FileAfterCreateEventHandler.createImplementation({
18
+ implementation: ExtractMetadataHandlerImpl,
19
+ dependencies: [
20
+ TaskService
21
+ ]
22
+ });
23
+ export { ExtractMetadataHandler };
24
+
25
+ //# sourceMappingURL=ExtractMetadataHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/ExtractMetadata/ExtractMetadataHandler.js","sources":["../../../src/features/ExtractMetadata/ExtractMetadataHandler.ts"],"sourcesContent":["import { FileAfterCreateEventHandler } from \"@webiny/api-file-manager/features/file/CreateFile/events.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport type { ExtractMetadataInput } from \"./ExtractMetadataTask.js\";\n\nclass ExtractMetadataHandlerImpl implements FileAfterCreateEventHandler.Interface {\n constructor(private taskService: TaskService.Interface) {}\n\n async handle(event: FileAfterCreateEventHandler.Event): Promise<void> {\n const { file } = event.payload;\n\n // Trigger the metadata extraction task\n await this.taskService.trigger<ExtractMetadataInput>({\n definition: \"fileManagerExtractMetadata\",\n input: {\n fileId: file.id\n }\n });\n }\n}\n\nexport const ExtractMetadataHandler = FileAfterCreateEventHandler.createImplementation({\n implementation: ExtractMetadataHandlerImpl,\n dependencies: [TaskService]\n});\n"],"names":["ExtractMetadataHandlerImpl","taskService","event","file","ExtractMetadataHandler","FileAfterCreateEventHandler","TaskService"],"mappings":";;AAIA,MAAMA;IACF,YAAoBC,WAAkC,CAAE;aAApCA,WAAW,GAAXA;IAAqC;IAEzD,MAAM,OAAOC,KAAwC,EAAiB;QAClE,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAM,OAAO;QAG9B,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAuB;YACjD,YAAY;YACZ,OAAO;gBACH,QAAQC,KAAK,EAAE;YACnB;QACJ;IACJ;AACJ;AAEO,MAAMC,yBAAyBC,4BAA4B,oBAAoB,CAAC;IACnF,gBAAgBL;IAChB,cAAc;QAACM;KAAY;AAC/B"}
@@ -0,0 +1,29 @@
1
+ import { TaskDefinition, TaskHandler } from "@webiny/api-core/features/task/TaskDefinition/index.js";
2
+ import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
3
+ import { UpdateFileUseCase } from "@webiny/api-file-manager/features/file/UpdateFile/index.js";
4
+ export interface ExtractMetadataInput {
5
+ fileId: string;
6
+ }
7
+ declare class ExtractMetadataTaskHandlerImpl implements TaskHandler.Interface<ExtractMetadataInput> {
8
+ private keyValueStore;
9
+ private updateFileUseCase;
10
+ constructor(keyValueStore: GlobalKeyValueStore.Interface, updateFileUseCase: UpdateFileUseCase.Interface);
11
+ run({ input, controller }: TaskHandler.RunParams<ExtractMetadataInput>): Promise<TaskDefinition.Result<ExtractMetadataInput>>;
12
+ private cleanValues;
13
+ }
14
+ declare class ExtractMetadataTask implements TaskDefinition.Interface {
15
+ id: string;
16
+ title: string;
17
+ description: string;
18
+ maxIterations: number;
19
+ isPrivate: boolean;
20
+ databaseLogs: boolean;
21
+ selfCleanup: ("onAbort" | "onSuccess")[];
22
+ handler: typeof ExtractMetadataTaskHandlerImpl & {
23
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskHandler<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskOutput>>;
24
+ };
25
+ }
26
+ export declare const ExtractMetadataTaskDefinition: typeof ExtractMetadataTask & {
27
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskDefinition<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskOutput>>;
28
+ };
29
+ export {};
@@ -0,0 +1,99 @@
1
+ import { S3 } from "@webiny/aws-sdk/client-s3/index.js";
2
+ import { TaskDefinition, TaskHandler } from "@webiny/api-core/features/task/TaskDefinition/index.js";
3
+ import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
4
+ import { UpdateFileUseCase } from "@webiny/api-file-manager/features/file/UpdateFile/index.js";
5
+ import { MetadataReader } from "../WriteFileMetadata/MetadataReader.js";
6
+ class ExtractMetadataTaskHandlerImpl {
7
+ constructor(keyValueStore, updateFileUseCase){
8
+ this.keyValueStore = keyValueStore;
9
+ this.updateFileUseCase = updateFileUseCase;
10
+ }
11
+ async run({ input, controller }) {
12
+ if (controller.runtime.isAborted()) return controller.response.aborted();
13
+ const metadataReader = new MetadataReader(this.keyValueStore);
14
+ const fileMetadata = await metadataReader.read(input.fileId);
15
+ if (!fileMetadata) return controller.response.error({
16
+ message: `File metadata not found for file ID: ${input.fileId}`
17
+ });
18
+ if (!fileMetadata.contentType.startsWith("image/")) return controller.response.done();
19
+ const s3 = new S3();
20
+ const bucket = String(process.env.S3_BUCKET);
21
+ try {
22
+ const s3Object = await s3.getObject({
23
+ Bucket: bucket,
24
+ Key: fileMetadata.bucketKey
25
+ });
26
+ if (!s3Object.Body) return controller.response.error({
27
+ message: `S3 object body is empty for file: ${input.fileId}`
28
+ });
29
+ const sharp = await import("sharp").then((m)=>m.default);
30
+ const ExifReader = await import("exifreader").then((m)=>m.default);
31
+ const buffer = Buffer.from(await s3Object.Body.transformToByteArray());
32
+ const sharpInstance = sharp(buffer);
33
+ const sharpMetadata = await sharpInstance.metadata();
34
+ const tags = ExifReader.load(buffer, {
35
+ expanded: true
36
+ });
37
+ const metadata = {
38
+ image: {
39
+ width: sharpMetadata.width,
40
+ height: sharpMetadata.height,
41
+ format: sharpMetadata.format,
42
+ orientation: sharpMetadata.orientation ?? 1
43
+ }
44
+ };
45
+ if (tags.exif) metadata.exif = this.cleanValues(tags.exif);
46
+ if (tags.iptc) metadata.iptc = this.cleanValues(tags.iptc);
47
+ const updateResult = await this.updateFileUseCase.execute({
48
+ id: input.fileId,
49
+ metadata
50
+ });
51
+ if (updateResult.isFail()) return controller.response.error({
52
+ message: `Failed to update file with metadata: ${updateResult.error.message}`
53
+ });
54
+ return controller.response.done();
55
+ } catch (error) {
56
+ return controller.response.error({
57
+ message: `Failed to extract metadata: ${error instanceof Error ? error.message : String(error)}`
58
+ });
59
+ }
60
+ }
61
+ cleanValues(tags) {
62
+ const cleaned = {};
63
+ for (const [key, tag] of Object.entries(tags))if (tag && "object" == typeof tag) {
64
+ if (void 0 !== tag.description && null !== tag.description) cleaned[key] = tag.description;
65
+ else if (Array.isArray(tag.value) && tag.value.length > 20) ;
66
+ else if (void 0 !== tag.value) cleaned[key] = tag.value;
67
+ }
68
+ return cleaned;
69
+ }
70
+ }
71
+ const ExtractMetadataTaskHandler = TaskHandler.createImplementation({
72
+ implementation: ExtractMetadataTaskHandlerImpl,
73
+ dependencies: [
74
+ GlobalKeyValueStore,
75
+ UpdateFileUseCase
76
+ ]
77
+ });
78
+ class ExtractMetadataTask {
79
+ constructor(){
80
+ this.id = "fileManagerExtractMetadata";
81
+ this.title = "Extract image metadata (dimensions, EXIF, IPTC)";
82
+ this.description = "A task to extract metadata from uploaded image files";
83
+ this.maxIterations = 1;
84
+ this.isPrivate = true;
85
+ this.databaseLogs = false;
86
+ this.selfCleanup = [
87
+ "onSuccess",
88
+ "onAbort"
89
+ ];
90
+ this.handler = ExtractMetadataTaskHandler;
91
+ }
92
+ }
93
+ const ExtractMetadataTaskDefinition = TaskDefinition.createImplementation({
94
+ implementation: ExtractMetadataTask,
95
+ dependencies: []
96
+ });
97
+ export { ExtractMetadataTaskDefinition };
98
+
99
+ //# sourceMappingURL=ExtractMetadataTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/ExtractMetadata/ExtractMetadataTask.js","sources":["../../../src/features/ExtractMetadata/ExtractMetadataTask.ts"],"sourcesContent":["import type { ExifTags } from \"exifreader\";\nimport { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport {\n TaskDefinition,\n TaskHandler\n} from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\nimport { UpdateFileUseCase } from \"@webiny/api-file-manager/features/file/UpdateFile/index.js\";\nimport { MetadataReader } from \"../WriteFileMetadata/MetadataReader.js\";\n\nexport interface ExtractMetadataInput {\n fileId: string;\n}\n\nclass ExtractMetadataTaskHandlerImpl implements TaskHandler.Interface<ExtractMetadataInput> {\n constructor(\n private keyValueStore: GlobalKeyValueStore.Interface,\n private updateFileUseCase: UpdateFileUseCase.Interface\n ) {}\n\n public async run({\n input,\n controller\n }: TaskHandler.RunParams<ExtractMetadataInput>): Promise<\n TaskDefinition.Result<ExtractMetadataInput>\n > {\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n }\n\n // Load file metadata\n const metadataReader = new MetadataReader(this.keyValueStore);\n const fileMetadata = await metadataReader.read(input.fileId);\n\n if (!fileMetadata) {\n return controller.response.error({\n message: `File metadata not found for file ID: ${input.fileId}`\n });\n }\n\n // Check if it's an image file\n if (!fileMetadata.contentType.startsWith(\"image/\")) {\n return controller.response.done();\n }\n\n // Fetch the image from S3\n const s3 = new S3();\n const bucket = String(process.env.S3_BUCKET);\n\n try {\n const s3Object = await s3.getObject({\n Bucket: bucket,\n Key: fileMetadata.bucketKey\n });\n\n if (!s3Object.Body) {\n return controller.response.error({\n message: `S3 object body is empty for file: ${input.fileId}`\n });\n }\n\n const sharp = await import(/* webpackChunkName: \"sharp\" */ \"sharp\").then(\n m => m.default\n );\n\n const ExifReader = await import(/* webpackChunkName: \"exifreader\" */ \"exifreader\").then(\n m => m.default\n );\n\n // Convert S3 body to buffer\n const buffer = Buffer.from(await s3Object.Body.transformToByteArray());\n\n // Extract metadata using Sharp for image dimensions\n const sharpInstance = sharp(buffer);\n const sharpMetadata = await sharpInstance.metadata();\n\n // Use ExifReader to extract EXIF and IPTC data\n const tags = ExifReader.load(buffer, { expanded: true });\n\n // Build metadata object\n const metadata: Record<string, any> = {\n image: {\n width: sharpMetadata.width,\n height: sharpMetadata.height,\n format: sharpMetadata.format,\n orientation: sharpMetadata.orientation ?? 1\n }\n };\n\n // Extract EXIF data if available\n if (tags.exif) {\n metadata.exif = this.cleanValues(tags.exif);\n }\n\n // Extract IPTC data if available\n if (tags.iptc) {\n metadata.iptc = this.cleanValues(tags.iptc);\n }\n\n // Update the file with extracted metadata\n const updateResult = await this.updateFileUseCase.execute({\n id: input.fileId,\n metadata\n });\n\n if (updateResult.isFail()) {\n return controller.response.error({\n message: `Failed to update file with metadata: ${updateResult.error.message}`\n });\n }\n\n return controller.response.done();\n } catch (error) {\n return controller.response.error({\n message: `Failed to extract metadata: ${\n error instanceof Error ? error.message : String(error)\n }`\n });\n }\n }\n\n private cleanValues(tags: ExifTags) {\n const cleaned: Record<string, any> = {};\n\n for (const [key, tag] of Object.entries(tags)) {\n if (!tag || typeof tag !== \"object\") {\n continue;\n }\n\n // Use description if available, otherwise value\n if (tag.description !== undefined && tag.description !== null) {\n cleaned[key] = tag.description;\n } else if (Array.isArray(tag.value) && tag.value.length > 20) {\n // Skip large byte arrays\n } else if (tag.value !== undefined) {\n cleaned[key] = tag.value;\n }\n }\n\n return cleaned;\n }\n}\n\nconst ExtractMetadataTaskHandler = TaskHandler.createImplementation({\n implementation: ExtractMetadataTaskHandlerImpl,\n dependencies: [GlobalKeyValueStore, UpdateFileUseCase]\n});\n\nclass ExtractMetadataTask implements TaskDefinition.Interface {\n id = \"fileManagerExtractMetadata\";\n title = \"Extract image metadata (dimensions, EXIF, IPTC)\";\n description = \"A task to extract metadata from uploaded image files\";\n maxIterations = 1;\n isPrivate = true;\n databaseLogs = false;\n selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n handler = ExtractMetadataTaskHandler;\n}\n\nexport const ExtractMetadataTaskDefinition = TaskDefinition.createImplementation({\n implementation: ExtractMetadataTask,\n dependencies: []\n});\n"],"names":["ExtractMetadataTaskHandlerImpl","keyValueStore","updateFileUseCase","input","controller","metadataReader","MetadataReader","fileMetadata","s3","S3","bucket","String","process","s3Object","sharp","m","ExifReader","buffer","Buffer","sharpInstance","sharpMetadata","tags","metadata","updateResult","error","Error","cleaned","key","tag","Object","undefined","Array","ExtractMetadataTaskHandler","TaskHandler","GlobalKeyValueStore","UpdateFileUseCase","ExtractMetadataTask","ExtractMetadataTaskDefinition","TaskDefinition"],"mappings":";;;;;AAcA,MAAMA;IACF,YACYC,aAA4C,EAC5CC,iBAA8C,CACxD;aAFUD,aAAa,GAAbA;aACAC,iBAAiB,GAAjBA;IACT;IAEH,MAAa,IAAI,EACbC,KAAK,EACLC,UAAU,EACgC,EAE5C;QACE,IAAIA,WAAW,OAAO,CAAC,SAAS,IAC5B,OAAOA,WAAW,QAAQ,CAAC,OAAO;QAItC,MAAMC,iBAAiB,IAAIC,eAAe,IAAI,CAAC,aAAa;QAC5D,MAAMC,eAAe,MAAMF,eAAe,IAAI,CAACF,MAAM,MAAM;QAE3D,IAAI,CAACI,cACD,OAAOH,WAAW,QAAQ,CAAC,KAAK,CAAC;YAC7B,SAAS,CAAC,qCAAqC,EAAED,MAAM,MAAM,EAAE;QACnE;QAIJ,IAAI,CAACI,aAAa,WAAW,CAAC,UAAU,CAAC,WACrC,OAAOH,WAAW,QAAQ,CAAC,IAAI;QAInC,MAAMI,KAAK,IAAIC;QACf,MAAMC,SAASC,OAAOC,QAAQ,GAAG,CAAC,SAAS;QAE3C,IAAI;YACA,MAAMC,WAAW,MAAML,GAAG,SAAS,CAAC;gBAChC,QAAQE;gBACR,KAAKH,aAAa,SAAS;YAC/B;YAEA,IAAI,CAACM,SAAS,IAAI,EACd,OAAOT,WAAW,QAAQ,CAAC,KAAK,CAAC;gBAC7B,SAAS,CAAC,kCAAkC,EAAED,MAAM,MAAM,EAAE;YAChE;YAGJ,MAAMW,QAAQ,MAAM,MAAM,CAAiC,SAAS,IAAI,CACpEC,CAAAA,IAAKA,EAAE,OAAO;YAGlB,MAAMC,aAAa,MAAM,MAAM,CAAsC,cAAc,IAAI,CACnFD,CAAAA,IAAKA,EAAE,OAAO;YAIlB,MAAME,SAASC,OAAO,IAAI,CAAC,MAAML,SAAS,IAAI,CAAC,oBAAoB;YAGnE,MAAMM,gBAAgBL,MAAMG;YAC5B,MAAMG,gBAAgB,MAAMD,cAAc,QAAQ;YAGlD,MAAME,OAAOL,WAAW,IAAI,CAACC,QAAQ;gBAAE,UAAU;YAAK;YAGtD,MAAMK,WAAgC;gBAClC,OAAO;oBACH,OAAOF,cAAc,KAAK;oBAC1B,QAAQA,cAAc,MAAM;oBAC5B,QAAQA,cAAc,MAAM;oBAC5B,aAAaA,cAAc,WAAW,IAAI;gBAC9C;YACJ;YAGA,IAAIC,KAAK,IAAI,EACTC,SAAS,IAAI,GAAG,IAAI,CAAC,WAAW,CAACD,KAAK,IAAI;YAI9C,IAAIA,KAAK,IAAI,EACTC,SAAS,IAAI,GAAG,IAAI,CAAC,WAAW,CAACD,KAAK,IAAI;YAI9C,MAAME,eAAe,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;gBACtD,IAAIpB,MAAM,MAAM;gBAChBmB;YACJ;YAEA,IAAIC,aAAa,MAAM,IACnB,OAAOnB,WAAW,QAAQ,CAAC,KAAK,CAAC;gBAC7B,SAAS,CAAC,qCAAqC,EAAEmB,aAAa,KAAK,CAAC,OAAO,EAAE;YACjF;YAGJ,OAAOnB,WAAW,QAAQ,CAAC,IAAI;QACnC,EAAE,OAAOoB,OAAO;YACZ,OAAOpB,WAAW,QAAQ,CAAC,KAAK,CAAC;gBAC7B,SAAS,CAAC,4BAA4B,EAClCoB,iBAAiBC,QAAQD,MAAM,OAAO,GAAGb,OAAOa,QAClD;YACN;QACJ;IACJ;IAEQ,YAAYH,IAAc,EAAE;QAChC,MAAMK,UAA+B,CAAC;QAEtC,KAAK,MAAM,CAACC,KAAKC,IAAI,IAAIC,OAAO,OAAO,CAACR,MACpC,IAAI,AAACO,OAAO,AAAe,YAAf,OAAOA,KAKnB;YAAA,IAAIA,AAAoBE,WAApBF,IAAI,WAAW,IAAkBA,AAAoB,SAApBA,IAAI,WAAW,EAChDF,OAAO,CAACC,IAAI,GAAGC,IAAI,WAAW;iBAC3B,IAAIG,MAAM,OAAO,CAACH,IAAI,KAAK,KAAKA,IAAI,KAAK,CAAC,MAAM,GAAG;iBAEnD,IAAIA,AAAcE,WAAdF,IAAI,KAAK,EAChBF,OAAO,CAACC,IAAI,GAAGC,IAAI,KAAK;QAC5B;QAGJ,OAAOF;IACX;AACJ;AAEA,MAAMM,6BAA6BC,YAAY,oBAAoB,CAAC;IAChE,gBAAgBjC;IAChB,cAAc;QAACkC;QAAqBC;KAAkB;AAC1D;AAEA,MAAMC;;aACF,EAAE,GAAG;aACL,KAAK,GAAG;aACR,WAAW,GAAG;aACd,aAAa,GAAG;aAChB,SAAS,GAAG;aACZ,YAAY,GAAG;aACf,WAAW,GAAG;YAAC;YAAsB;SAAmB;aAExD,OAAO,GAAGJ;;AACd;AAEO,MAAMK,gCAAgCC,eAAe,oBAAoB,CAAC;IAC7E,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
@@ -0,0 +1,4 @@
1
+ export declare const ExtractMetadataFeature: {
2
+ name: string;
3
+ register(container: import("@webiny/di").Container): void;
4
+ };
@@ -0,0 +1,13 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { ExtractMetadataHandler } from "./ExtractMetadataHandler.js";
3
+ import { ExtractMetadataTaskDefinition } from "./ExtractMetadataTask.js";
4
+ const ExtractMetadataFeature = createFeature({
5
+ name: "FileManagerS3/ExtractMetadata",
6
+ register (container) {
7
+ container.register(ExtractMetadataHandler);
8
+ container.register(ExtractMetadataTaskDefinition);
9
+ }
10
+ });
11
+ export { ExtractMetadataFeature };
12
+
13
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/ExtractMetadata/feature.js","sources":["../../../src/features/ExtractMetadata/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { ExtractMetadataHandler } from \"./ExtractMetadataHandler.js\";\nimport { ExtractMetadataTaskDefinition } from \"./ExtractMetadataTask.js\";\n\nexport const ExtractMetadataFeature = createFeature({\n name: \"FileManagerS3/ExtractMetadata\",\n register(container) {\n container.register(ExtractMetadataHandler);\n container.register(ExtractMetadataTaskDefinition);\n }\n});\n"],"names":["ExtractMetadataFeature","createFeature","container","ExtractMetadataHandler","ExtractMetadataTaskDefinition"],"mappings":";;;AAIO,MAAMA,yBAAyBC,cAAc;IAChD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;IACvB;AACJ"}
@@ -0,0 +1,12 @@
1
+ import { FileAfterDeleteEventHandler } from "@webiny/api-file-manager/features/file/DeleteFile/events.js";
2
+ import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js";
3
+ declare class FlushCacheOnFileDeleteHandlerImpl implements FileAfterDeleteEventHandler.Interface {
4
+ private taskService;
5
+ private readonly pathsGenerator;
6
+ constructor(taskService: TaskService.Interface);
7
+ handle(event: FileAfterDeleteEventHandler.Event): Promise<void>;
8
+ }
9
+ export declare const FlushCacheOnFileDeleteHandler: typeof FlushCacheOnFileDeleteHandlerImpl & {
10
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher").IEventHandler<import("@webiny/api-file-manager/features/file/DeleteFile/events.js").FileAfterDeleteEvent>>;
11
+ };
12
+ export {};
@@ -0,0 +1,28 @@
1
+ import { FileAfterDeleteEventHandler } from "@webiny/api-file-manager/features/file/DeleteFile/events.js";
2
+ import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js";
3
+ import { CdnPathsGenerator } from "../../utils/CdnPathsGenerator.js";
4
+ class FlushCacheOnFileDeleteHandlerImpl {
5
+ constructor(taskService){
6
+ this.taskService = taskService;
7
+ this.pathsGenerator = new CdnPathsGenerator();
8
+ }
9
+ async handle(event) {
10
+ const { file } = event.payload;
11
+ await this.taskService.trigger({
12
+ definition: "invalidateAssetCache",
13
+ input: {
14
+ caller: "fm-before-delete",
15
+ paths: this.pathsGenerator.generate(file.id)
16
+ }
17
+ });
18
+ }
19
+ }
20
+ const FlushCacheOnFileDeleteHandler = FileAfterDeleteEventHandler.createImplementation({
21
+ implementation: FlushCacheOnFileDeleteHandlerImpl,
22
+ dependencies: [
23
+ TaskService
24
+ ]
25
+ });
26
+ export { FlushCacheOnFileDeleteHandler };
27
+
28
+ //# sourceMappingURL=FlushCacheOnFileDeleteHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/FlushCache/FlushCacheOnFileDeleteHandler.js","sources":["../../../src/features/FlushCache/FlushCacheOnFileDeleteHandler.ts"],"sourcesContent":["import { FileAfterDeleteEventHandler } from \"@webiny/api-file-manager/features/file/DeleteFile/events.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { CdnPathsGenerator } from \"~/utils/CdnPathsGenerator.js\";\n\nclass FlushCacheOnFileDeleteHandlerImpl implements FileAfterDeleteEventHandler.Interface {\n private readonly pathsGenerator: CdnPathsGenerator;\n\n constructor(private taskService: TaskService.Interface) {\n this.pathsGenerator = new CdnPathsGenerator();\n }\n\n async handle(event: FileAfterDeleteEventHandler.Event): Promise<void> {\n const { file } = event.payload;\n\n await this.taskService.trigger({\n definition: \"invalidateAssetCache\",\n input: {\n caller: \"fm-before-delete\",\n paths: this.pathsGenerator.generate(file.id)\n }\n });\n }\n}\n\nexport const FlushCacheOnFileDeleteHandler = FileAfterDeleteEventHandler.createImplementation({\n implementation: FlushCacheOnFileDeleteHandlerImpl,\n dependencies: [TaskService]\n});\n"],"names":["FlushCacheOnFileDeleteHandlerImpl","taskService","CdnPathsGenerator","event","file","FlushCacheOnFileDeleteHandler","FileAfterDeleteEventHandler","TaskService"],"mappings":";;;AAIA,MAAMA;IAGF,YAAoBC,WAAkC,CAAE;aAApCA,WAAW,GAAXA;QAChB,IAAI,CAAC,cAAc,GAAG,IAAIC;IAC9B;IAEA,MAAM,OAAOC,KAAwC,EAAiB;QAClE,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAM,OAAO;QAE9B,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;YAC3B,YAAY;YACZ,OAAO;gBACH,QAAQ;gBACR,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAACC,KAAK,EAAE;YAC/C;QACJ;IACJ;AACJ;AAEO,MAAMC,gCAAgCC,4BAA4B,oBAAoB,CAAC;IAC1F,gBAAgBN;IAChB,cAAc;QAACO;KAAY;AAC/B"}
@@ -0,0 +1,12 @@
1
+ import { FileBeforeUpdateEventHandler } from "@webiny/api-file-manager/features/file/UpdateFile/events.js";
2
+ import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js";
3
+ declare class FlushCacheOnFileUpdateHandlerImpl implements FileBeforeUpdateEventHandler.Interface {
4
+ private taskService;
5
+ private readonly pathsGenerator;
6
+ constructor(taskService: TaskService.Interface);
7
+ handle(event: FileBeforeUpdateEventHandler.Event): Promise<void>;
8
+ }
9
+ export declare const FlushCacheOnFileUpdateHandler: typeof FlushCacheOnFileUpdateHandlerImpl & {
10
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher").IEventHandler<import("@webiny/api-file-manager/features/file/UpdateFile/events.js").FileBeforeUpdateEvent>>;
11
+ };
12
+ export {};
@@ -0,0 +1,31 @@
1
+ import { FileBeforeUpdateEventHandler } from "@webiny/api-file-manager/features/file/UpdateFile/events.js";
2
+ import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js";
3
+ import { CdnPathsGenerator } from "../../utils/CdnPathsGenerator.js";
4
+ class FlushCacheOnFileUpdateHandlerImpl {
5
+ constructor(taskService){
6
+ this.taskService = taskService;
7
+ this.pathsGenerator = new CdnPathsGenerator();
8
+ }
9
+ async handle(event) {
10
+ const { file, original } = event.payload;
11
+ const prevAccessControl = original.accessControl;
12
+ const newAccessControl = file.accessControl;
13
+ if (prevAccessControl?.type === newAccessControl?.type) return;
14
+ await this.taskService.trigger({
15
+ definition: "invalidateAssetCache",
16
+ input: {
17
+ caller: "fm-before-update",
18
+ paths: this.pathsGenerator.generate(file.id)
19
+ }
20
+ });
21
+ }
22
+ }
23
+ const FlushCacheOnFileUpdateHandler = FileBeforeUpdateEventHandler.createImplementation({
24
+ implementation: FlushCacheOnFileUpdateHandlerImpl,
25
+ dependencies: [
26
+ TaskService
27
+ ]
28
+ });
29
+ export { FlushCacheOnFileUpdateHandler };
30
+
31
+ //# sourceMappingURL=FlushCacheOnFileUpdateHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/FlushCache/FlushCacheOnFileUpdateHandler.js","sources":["../../../src/features/FlushCache/FlushCacheOnFileUpdateHandler.ts"],"sourcesContent":["import { FileBeforeUpdateEventHandler } from \"@webiny/api-file-manager/features/file/UpdateFile/events.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { CdnPathsGenerator } from \"~/utils/CdnPathsGenerator.js\";\n\nclass FlushCacheOnFileUpdateHandlerImpl implements FileBeforeUpdateEventHandler.Interface {\n private readonly pathsGenerator: CdnPathsGenerator;\n\n constructor(private taskService: TaskService.Interface) {\n this.pathsGenerator = new CdnPathsGenerator();\n }\n\n async handle(event: FileBeforeUpdateEventHandler.Event): Promise<void> {\n const { file, original } = event.payload;\n\n const prevAccessControl = original.accessControl;\n const newAccessControl = file.accessControl;\n\n // Only trigger cache flush if access control type has changed\n if (prevAccessControl?.type === newAccessControl?.type) {\n return;\n }\n\n await this.taskService.trigger({\n definition: \"invalidateAssetCache\",\n input: {\n caller: \"fm-before-update\",\n paths: this.pathsGenerator.generate(file.id)\n }\n });\n }\n}\n\nexport const FlushCacheOnFileUpdateHandler = FileBeforeUpdateEventHandler.createImplementation({\n implementation: FlushCacheOnFileUpdateHandlerImpl,\n dependencies: [TaskService]\n});\n"],"names":["FlushCacheOnFileUpdateHandlerImpl","taskService","CdnPathsGenerator","event","file","original","prevAccessControl","newAccessControl","FlushCacheOnFileUpdateHandler","FileBeforeUpdateEventHandler","TaskService"],"mappings":";;;AAIA,MAAMA;IAGF,YAAoBC,WAAkC,CAAE;aAApCA,WAAW,GAAXA;QAChB,IAAI,CAAC,cAAc,GAAG,IAAIC;IAC9B;IAEA,MAAM,OAAOC,KAAyC,EAAiB;QACnE,MAAM,EAAEC,IAAI,EAAEC,QAAQ,EAAE,GAAGF,MAAM,OAAO;QAExC,MAAMG,oBAAoBD,SAAS,aAAa;QAChD,MAAME,mBAAmBH,KAAK,aAAa;QAG3C,IAAIE,mBAAmB,SAASC,kBAAkB,MAC9C;QAGJ,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;YAC3B,YAAY;YACZ,OAAO;gBACH,QAAQ;gBACR,OAAO,IAAI,CAAC,cAAc,CAAC,QAAQ,CAACH,KAAK,EAAE;YAC/C;QACJ;IACJ;AACJ;AAEO,MAAMI,gCAAgCC,6BAA6B,oBAAoB,CAAC;IAC3F,gBAAgBT;IAChB,cAAc;QAACU;KAAY;AAC/B"}
@@ -0,0 +1,31 @@
1
+ import { TaskDefinition, TaskHandler } from "@webiny/api-core/features/task/TaskDefinition/index.js";
2
+ export interface InvalidateCacheInput {
3
+ /**
4
+ * Caller of the task (e.g., `fm-before-update`, `fm-after-delete`).
5
+ */
6
+ caller: string;
7
+ /**
8
+ * Cache paths to invalidate.
9
+ */
10
+ paths: string[];
11
+ }
12
+ declare class InvalidateCloudfrontCacheTaskHandlerImpl implements TaskHandler.Interface<InvalidateCacheInput> {
13
+ private continueIfCode;
14
+ run({ input, controller }: TaskHandler.RunParams<InvalidateCacheInput>): Promise<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskResultAborted | import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskResultError | TaskDefinition.ResultContinue<InvalidateCacheInput> | TaskDefinition.ResultDone<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
15
+ private invalidateCache;
16
+ }
17
+ declare class InvalidateCloudfrontCacheTask implements TaskDefinition.Interface {
18
+ id: string;
19
+ title: string;
20
+ description: string;
21
+ maxIterations: number;
22
+ isPrivate: boolean;
23
+ selfCleanup: ("onAbort" | "onSuccess")[];
24
+ handler: typeof InvalidateCloudfrontCacheTaskHandlerImpl & {
25
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskHandler<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
26
+ };
27
+ }
28
+ export declare const InvalidateCloudfrontCacheTaskDefinition: typeof InvalidateCloudfrontCacheTask & {
29
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskDefinition<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
30
+ };
31
+ export {};