@webiny/api-file-manager-s3 6.0.0-beta.0 → 6.0.0-rc.0

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 (208) hide show
  1. package/README.md +11 -1
  2. package/assetDelivery/assetDeliveryConfig.d.ts +2 -6
  3. package/assetDelivery/assetDeliveryConfig.js +24 -23
  4. package/assetDelivery/assetDeliveryConfig.js.map +1 -1
  5. package/assetDelivery/createAssetDelivery.d.ts +3 -3
  6. package/assetDelivery/createAssetDelivery.js +15 -12
  7. package/assetDelivery/createAssetDelivery.js.map +1 -1
  8. package/assetDelivery/index.d.ts +8 -9
  9. package/assetDelivery/index.js +8 -68
  10. package/assetDelivery/index.js.map +1 -1
  11. package/assetDelivery/s3/S3AssetResolver.d.ts +8 -5
  12. package/assetDelivery/s3/S3AssetResolver.js +19 -27
  13. package/assetDelivery/s3/S3AssetResolver.js.map +1 -1
  14. package/assetDelivery/s3/S3ContentsReader.d.ts +2 -3
  15. package/assetDelivery/s3/S3ContentsReader.js +1 -8
  16. package/assetDelivery/s3/S3ContentsReader.js.map +1 -1
  17. package/assetDelivery/s3/S3ErrorAssetReply.js +2 -9
  18. package/assetDelivery/s3/S3ErrorAssetReply.js.map +1 -1
  19. package/assetDelivery/s3/S3OutputStrategy.d.ts +4 -3
  20. package/assetDelivery/s3/S3OutputStrategy.js +12 -17
  21. package/assetDelivery/s3/S3OutputStrategy.js.map +1 -1
  22. package/assetDelivery/s3/S3RedirectAssetReply.js +4 -11
  23. package/assetDelivery/s3/S3RedirectAssetReply.js.map +1 -1
  24. package/assetDelivery/s3/S3StreamAssetReply.d.ts +2 -1
  25. package/assetDelivery/s3/S3StreamAssetReply.js +4 -11
  26. package/assetDelivery/s3/S3StreamAssetReply.js.map +1 -1
  27. package/assetDelivery/s3/SharpTransform.d.ts +2 -2
  28. package/assetDelivery/s3/SharpTransform.js +63 -37
  29. package/assetDelivery/s3/SharpTransform.js.map +1 -1
  30. package/assetDelivery/s3/transformation/AssetKeyGenerator.d.ts +1 -1
  31. package/assetDelivery/s3/transformation/AssetKeyGenerator.js +3 -12
  32. package/assetDelivery/s3/transformation/AssetKeyGenerator.js.map +1 -1
  33. package/assetDelivery/s3/transformation/CallableContentsReader.d.ts +1 -2
  34. package/assetDelivery/s3/transformation/CallableContentsReader.js +1 -8
  35. package/assetDelivery/s3/transformation/CallableContentsReader.js.map +1 -1
  36. package/assetDelivery/s3/transformation/WidthCollection.js +1 -8
  37. package/assetDelivery/s3/transformation/WidthCollection.js.map +1 -1
  38. package/assetDelivery/s3/transformation/utils.d.ts +1 -3
  39. package/assetDelivery/s3/transformation/utils.js +23 -19
  40. package/assetDelivery/s3/transformation/utils.js.map +1 -1
  41. package/assetDelivery/threatDetection/ObjectKey.d.ts +7 -0
  42. package/assetDelivery/threatDetection/ObjectKey.js +17 -0
  43. package/assetDelivery/threatDetection/ObjectKey.js.map +1 -0
  44. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.d.ts +2 -0
  45. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js +51 -0
  46. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js.map +1 -0
  47. package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.d.ts +2 -0
  48. package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js +6 -0
  49. package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js.map +1 -0
  50. package/assetDelivery/threatDetection/index.d.ts +2 -0
  51. package/assetDelivery/threatDetection/index.js +4 -0
  52. package/assetDelivery/threatDetection/index.js.map +1 -0
  53. package/assetDelivery/threatDetection/processThreatScanResult.d.ts +3 -0
  54. package/assetDelivery/threatDetection/processThreatScanResult.js +65 -0
  55. package/assetDelivery/threatDetection/processThreatScanResult.js.map +1 -0
  56. package/assetDelivery/threatDetection/types.d.ts +9 -0
  57. package/assetDelivery/threatDetection/types.js +3 -0
  58. package/assetDelivery/threatDetection/types.js.map +1 -0
  59. package/assetDelivery/types.d.ts +10 -0
  60. package/assetDelivery/types.js +3 -0
  61. package/assetDelivery/types.js.map +1 -0
  62. package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.d.ts +11 -0
  63. package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js +19 -0
  64. package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js.map +1 -0
  65. package/enterprise/ApplyThreatScanning/feature.d.ts +1 -0
  66. package/enterprise/ApplyThreatScanning/feature.js +10 -0
  67. package/enterprise/ApplyThreatScanning/feature.js.map +1 -0
  68. package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.d.ts +15 -0
  69. package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js +36 -0
  70. package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js.map +1 -0
  71. package/features/DeleteFileFromBucket/DeleteS3FolderTask.d.ts +31 -0
  72. package/features/DeleteFileFromBucket/DeleteS3FolderTask.js +60 -0
  73. package/features/DeleteFileFromBucket/DeleteS3FolderTask.js.map +1 -0
  74. package/features/DeleteFileFromBucket/feature.d.ts +1 -0
  75. package/features/DeleteFileFromBucket/feature.js +12 -0
  76. package/features/DeleteFileFromBucket/feature.js.map +1 -0
  77. package/features/ExtractMetadata/ExtractMetadataHandler.d.ts +11 -0
  78. package/features/ExtractMetadata/ExtractMetadataHandler.js +26 -0
  79. package/features/ExtractMetadata/ExtractMetadataHandler.js.map +1 -0
  80. package/features/ExtractMetadata/ExtractMetadataTask.d.ts +23 -0
  81. package/features/ExtractMetadata/ExtractMetadataTask.js +128 -0
  82. package/features/ExtractMetadata/ExtractMetadataTask.js.map +1 -0
  83. package/features/ExtractMetadata/feature.d.ts +1 -0
  84. package/features/ExtractMetadata/feature.js +12 -0
  85. package/features/ExtractMetadata/feature.js.map +1 -0
  86. package/features/FlushCache/FlushCacheOnFileDeleteHandler.d.ts +12 -0
  87. package/features/FlushCache/FlushCacheOnFileDeleteHandler.js +27 -0
  88. package/features/FlushCache/FlushCacheOnFileDeleteHandler.js.map +1 -0
  89. package/features/FlushCache/FlushCacheOnFileUpdateHandler.d.ts +12 -0
  90. package/features/FlushCache/FlushCacheOnFileUpdateHandler.js +35 -0
  91. package/features/FlushCache/FlushCacheOnFileUpdateHandler.js.map +1 -0
  92. package/features/FlushCache/InvalidateCacheTask.d.ts +25 -0
  93. package/features/FlushCache/InvalidateCacheTask.js +86 -0
  94. package/features/FlushCache/InvalidateCacheTask.js.map +1 -0
  95. package/features/FlushCache/feature.d.ts +1 -0
  96. package/features/FlushCache/feature.js +14 -0
  97. package/features/FlushCache/feature.js.map +1 -0
  98. package/features/WriteFileMetadata/MetadataReader.d.ts +14 -0
  99. package/features/WriteFileMetadata/MetadataReader.js +14 -0
  100. package/features/WriteFileMetadata/MetadataReader.js.map +1 -0
  101. package/features/WriteFileMetadata/MetadataWriter.d.ts +10 -0
  102. package/features/WriteFileMetadata/MetadataWriter.js +28 -0
  103. package/features/WriteFileMetadata/MetadataWriter.js.map +1 -0
  104. package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.d.ts +12 -0
  105. package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js +21 -0
  106. package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js.map +1 -0
  107. package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.d.ts +12 -0
  108. package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js +21 -0
  109. package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js.map +1 -0
  110. package/features/WriteFileMetadata/feature.d.ts +1 -0
  111. package/features/WriteFileMetadata/feature.js +12 -0
  112. package/features/WriteFileMetadata/feature.js.map +1 -0
  113. package/graphql/checkPermissions.d.ts +5 -0
  114. package/{plugins → graphql}/checkPermissions.js +4 -11
  115. package/graphql/checkPermissions.js.map +1 -0
  116. package/graphql/schema.d.ts +1 -0
  117. package/{plugins/graphqlFileStorageS3.js → graphql/schema.js} +49 -57
  118. package/graphql/schema.js.map +1 -0
  119. package/index.d.ts +4 -5
  120. package/index.js +21 -32
  121. package/index.js.map +1 -1
  122. package/multiPartUpload/CompleteMultiPartUploadUseCase.d.ts +1 -1
  123. package/multiPartUpload/CompleteMultiPartUploadUseCase.js +4 -11
  124. package/multiPartUpload/CompleteMultiPartUploadUseCase.js.map +1 -1
  125. package/multiPartUpload/CreateMultiPartUploadUseCase.d.ts +2 -2
  126. package/multiPartUpload/CreateMultiPartUploadUseCase.js +3 -10
  127. package/multiPartUpload/CreateMultiPartUploadUseCase.js.map +1 -1
  128. package/package.json +23 -29
  129. package/types.d.ts +1 -1
  130. package/types.js +1 -5
  131. package/types.js.map +1 -1
  132. package/utils/CdnPathsGenerator.d.ts +3 -0
  133. package/utils/CdnPathsGenerator.js +7 -0
  134. package/utils/CdnPathsGenerator.js.map +1 -0
  135. package/utils/FileExtension.d.ts +1 -1
  136. package/utils/FileExtension.js +3 -10
  137. package/utils/FileExtension.js.map +1 -1
  138. package/utils/FileKey.d.ts +1 -1
  139. package/utils/FileKey.js +5 -13
  140. package/utils/FileKey.js.map +1 -1
  141. package/utils/FileKey.test.js +8 -9
  142. package/utils/FileKey.test.js.map +1 -1
  143. package/utils/FileNormalizer.d.ts +2 -2
  144. package/utils/FileNormalizer.js +5 -12
  145. package/utils/FileNormalizer.js.map +1 -1
  146. package/utils/FileUploadModifier.d.ts +1 -1
  147. package/utils/FileUploadModifier.js +6 -16
  148. package/utils/FileUploadModifier.js.map +1 -1
  149. package/utils/createFileNormalizerFromContext.d.ts +2 -2
  150. package/utils/createFileNormalizerFromContext.js +5 -12
  151. package/utils/createFileNormalizerFromContext.js.map +1 -1
  152. package/utils/getPresignedPostPayload.d.ts +4 -3
  153. package/utils/getPresignedPostPayload.js +10 -15
  154. package/utils/getPresignedPostPayload.js.map +1 -1
  155. package/utils/mimeTypes.js +5 -13
  156. package/utils/mimeTypes.js.map +1 -1
  157. package/utils/uploadFileToS3.d.ts +1 -3
  158. package/utils/uploadFileToS3.js +7 -20
  159. package/utils/uploadFileToS3.js.map +1 -1
  160. package/assetDelivery/createCustomAssetDelivery.d.ts +0 -12
  161. package/assetDelivery/createCustomAssetDelivery.js +0 -28
  162. package/assetDelivery/createCustomAssetDelivery.js.map +0 -1
  163. package/assetDelivery/customAssets/CustomAsset.d.ts +0 -6
  164. package/assetDelivery/customAssets/CustomAsset.js +0 -14
  165. package/assetDelivery/customAssets/CustomAsset.js.map +0 -1
  166. package/assetDelivery/customAssets/CustomAssetProcessor.d.ts +0 -10
  167. package/assetDelivery/customAssets/CustomAssetProcessor.js +0 -25
  168. package/assetDelivery/customAssets/CustomAssetProcessor.js.map +0 -1
  169. package/assetDelivery/customAssets/S3CustomAssetResolver.d.ts +0 -15
  170. package/assetDelivery/customAssets/S3CustomAssetResolver.js +0 -90
  171. package/assetDelivery/customAssets/S3CustomAssetResolver.js.map +0 -1
  172. package/assetDelivery/customAssets/customAssetDeliveryConfig.d.ts +0 -1
  173. package/assetDelivery/customAssets/customAssetDeliveryConfig.js +0 -30
  174. package/assetDelivery/customAssets/customAssetDeliveryConfig.js.map +0 -1
  175. package/assetDelivery/s3/S3AssetMetadataReader.d.ts +0 -15
  176. package/assetDelivery/s3/S3AssetMetadataReader.js +0 -36
  177. package/assetDelivery/s3/S3AssetMetadataReader.js.map +0 -1
  178. package/assetDelivery/s3/transformation/legacyUtils.d.ts +0 -12
  179. package/assetDelivery/s3/transformation/legacyUtils.js +0 -34
  180. package/assetDelivery/s3/transformation/legacyUtils.js.map +0 -1
  181. package/flushCdnCache/CdnPathsGenerator.d.ts +0 -4
  182. package/flushCdnCache/CdnPathsGenerator.js +0 -14
  183. package/flushCdnCache/CdnPathsGenerator.js.map +0 -1
  184. package/flushCdnCache/InvalidateCacheTask.d.ts +0 -18
  185. package/flushCdnCache/InvalidateCacheTask.js +0 -78
  186. package/flushCdnCache/InvalidateCacheTask.js.map +0 -1
  187. package/flushCdnCache/flushCacheOnFileDelete.d.ts +0 -3
  188. package/flushCdnCache/flushCacheOnFileDelete.js +0 -34
  189. package/flushCdnCache/flushCacheOnFileDelete.js.map +0 -1
  190. package/flushCdnCache/flushCacheOnFileUpdate.d.ts +0 -3
  191. package/flushCdnCache/flushCacheOnFileUpdate.js +0 -40
  192. package/flushCdnCache/flushCacheOnFileUpdate.js.map +0 -1
  193. package/flushCdnCache/index.d.ts +0 -1
  194. package/flushCdnCache/index.js +0 -15
  195. package/flushCdnCache/index.js.map +0 -1
  196. package/flushCdnCache/invalidateCacheTaskDefinition.d.ts +0 -2
  197. package/flushCdnCache/invalidateCacheTaskDefinition.js +0 -22
  198. package/flushCdnCache/invalidateCacheTaskDefinition.js.map +0 -1
  199. package/plugins/addFileMetadata.d.ts +0 -10
  200. package/plugins/addFileMetadata.js +0 -67
  201. package/plugins/addFileMetadata.js.map +0 -1
  202. package/plugins/checkPermissions.d.ts +0 -4
  203. package/plugins/checkPermissions.js.map +0 -1
  204. package/plugins/fileStorageS3.d.ts +0 -3
  205. package/plugins/fileStorageS3.js +0 -60
  206. package/plugins/fileStorageS3.js.map +0 -1
  207. package/plugins/graphqlFileStorageS3.d.ts +0 -4
  208. package/plugins/graphqlFileStorageS3.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createFeature","ExtractMetadataHandler","ExtractMetadataTaskDefinition","ExtractMetadataFeature","name","register","container"],"sources":["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"],"mappings":"AAAA,SAASA,aAAa,QAAQ,qBAAqB;AACnD,SAASC,sBAAsB;AAC/B,SAASC,6BAA6B;AAEtC,OAAO,MAAMC,sBAAsB,GAAGH,aAAa,CAAC;EAChDI,IAAI,EAAE,+BAA+B;EACrCC,QAAQA,CAACC,SAAS,EAAE;IAChBA,SAAS,CAACD,QAAQ,CAACJ,sBAAsB,CAAC;IAC1CK,SAAS,CAACD,QAAQ,CAACH,6BAA6B,CAAC;EACrD;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,12 @@
1
+ import { FileAfterDeleteHandler } 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 FileAfterDeleteHandler.Interface {
4
+ private taskService;
5
+ private readonly pathsGenerator;
6
+ constructor(taskService: TaskService.Interface);
7
+ handle(event: FileAfterDeleteHandler.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,27 @@
1
+ import { FileAfterDeleteHandler } 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 {
11
+ file
12
+ } = event.payload;
13
+ await this.taskService.trigger({
14
+ definition: "cloudfrontInvalidateCache",
15
+ input: {
16
+ caller: "fm-before-delete",
17
+ paths: this.pathsGenerator.generate(file.id)
18
+ }
19
+ });
20
+ }
21
+ }
22
+ export const FlushCacheOnFileDeleteHandler = FileAfterDeleteHandler.createImplementation({
23
+ implementation: FlushCacheOnFileDeleteHandlerImpl,
24
+ dependencies: [TaskService]
25
+ });
26
+
27
+ //# sourceMappingURL=FlushCacheOnFileDeleteHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["FileAfterDeleteHandler","TaskService","CdnPathsGenerator","FlushCacheOnFileDeleteHandlerImpl","constructor","taskService","pathsGenerator","handle","event","file","payload","trigger","definition","input","caller","paths","generate","id","FlushCacheOnFileDeleteHandler","createImplementation","implementation","dependencies"],"sources":["FlushCacheOnFileDeleteHandler.ts"],"sourcesContent":["import { FileAfterDeleteHandler } 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 FileAfterDeleteHandler.Interface {\n private readonly pathsGenerator: CdnPathsGenerator;\n\n constructor(private taskService: TaskService.Interface) {\n this.pathsGenerator = new CdnPathsGenerator();\n }\n\n async handle(event: FileAfterDeleteHandler.Event): Promise<void> {\n const { file } = event.payload;\n\n await this.taskService.trigger({\n definition: \"cloudfrontInvalidateCache\",\n input: {\n caller: \"fm-before-delete\",\n paths: this.pathsGenerator.generate(file.id)\n }\n });\n }\n}\n\nexport const FlushCacheOnFileDeleteHandler = FileAfterDeleteHandler.createImplementation({\n implementation: FlushCacheOnFileDeleteHandlerImpl,\n dependencies: [TaskService]\n});\n"],"mappings":"AAAA,SAASA,sBAAsB,QAAQ,6DAA6D;AACpG,SAASC,WAAW,QAAQ,qDAAqD;AACjF,SAASC,iBAAiB;AAE1B,MAAMC,iCAAiC,CAA6C;EAGhFC,WAAWA,CAASC,WAAkC,EAAE;IAAA,KAApCA,WAAkC,GAAlCA,WAAkC;IAClD,IAAI,CAACC,cAAc,GAAG,IAAIJ,iBAAiB,CAAC,CAAC;EACjD;EAEA,MAAMK,MAAMA,CAACC,KAAmC,EAAiB;IAC7D,MAAM;MAAEC;IAAK,CAAC,GAAGD,KAAK,CAACE,OAAO;IAE9B,MAAM,IAAI,CAACL,WAAW,CAACM,OAAO,CAAC;MAC3BC,UAAU,EAAE,2BAA2B;MACvCC,KAAK,EAAE;QACHC,MAAM,EAAE,kBAAkB;QAC1BC,KAAK,EAAE,IAAI,CAACT,cAAc,CAACU,QAAQ,CAACP,IAAI,CAACQ,EAAE;MAC/C;IACJ,CAAC,CAAC;EACN;AACJ;AAEA,OAAO,MAAMC,6BAA6B,GAAGlB,sBAAsB,CAACmB,oBAAoB,CAAC;EACrFC,cAAc,EAAEjB,iCAAiC;EACjDkB,YAAY,EAAE,CAACpB,WAAW;AAC9B,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,12 @@
1
+ import { FileBeforeUpdateHandler } 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 FileBeforeUpdateHandler.Interface {
4
+ private taskService;
5
+ private readonly pathsGenerator;
6
+ constructor(taskService: TaskService.Interface);
7
+ handle(event: FileBeforeUpdateHandler.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,35 @@
1
+ import { FileBeforeUpdateHandler } 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 {
11
+ file,
12
+ original
13
+ } = event.payload;
14
+ const prevAccessControl = original.accessControl;
15
+ const newAccessControl = file.accessControl;
16
+
17
+ // Only trigger cache flush if access control type has changed
18
+ if (prevAccessControl?.type === newAccessControl?.type) {
19
+ return;
20
+ }
21
+ await this.taskService.trigger({
22
+ definition: "cloudfrontInvalidateCache",
23
+ input: {
24
+ caller: "fm-before-update",
25
+ paths: this.pathsGenerator.generate(file.id)
26
+ }
27
+ });
28
+ }
29
+ }
30
+ export const FlushCacheOnFileUpdateHandler = FileBeforeUpdateHandler.createImplementation({
31
+ implementation: FlushCacheOnFileUpdateHandlerImpl,
32
+ dependencies: [TaskService]
33
+ });
34
+
35
+ //# sourceMappingURL=FlushCacheOnFileUpdateHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["FileBeforeUpdateHandler","TaskService","CdnPathsGenerator","FlushCacheOnFileUpdateHandlerImpl","constructor","taskService","pathsGenerator","handle","event","file","original","payload","prevAccessControl","accessControl","newAccessControl","type","trigger","definition","input","caller","paths","generate","id","FlushCacheOnFileUpdateHandler","createImplementation","implementation","dependencies"],"sources":["FlushCacheOnFileUpdateHandler.ts"],"sourcesContent":["import { FileBeforeUpdateHandler } 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 FileBeforeUpdateHandler.Interface {\n private readonly pathsGenerator: CdnPathsGenerator;\n\n constructor(private taskService: TaskService.Interface) {\n this.pathsGenerator = new CdnPathsGenerator();\n }\n\n async handle(event: FileBeforeUpdateHandler.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: \"cloudfrontInvalidateCache\",\n input: {\n caller: \"fm-before-update\",\n paths: this.pathsGenerator.generate(file.id)\n }\n });\n }\n}\n\nexport const FlushCacheOnFileUpdateHandler = FileBeforeUpdateHandler.createImplementation({\n implementation: FlushCacheOnFileUpdateHandlerImpl,\n dependencies: [TaskService]\n});\n"],"mappings":"AAAA,SAASA,uBAAuB,QAAQ,6DAA6D;AACrG,SAASC,WAAW,QAAQ,qDAAqD;AACjF,SAASC,iBAAiB;AAE1B,MAAMC,iCAAiC,CAA8C;EAGjFC,WAAWA,CAASC,WAAkC,EAAE;IAAA,KAApCA,WAAkC,GAAlCA,WAAkC;IAClD,IAAI,CAACC,cAAc,GAAG,IAAIJ,iBAAiB,CAAC,CAAC;EACjD;EAEA,MAAMK,MAAMA,CAACC,KAAoC,EAAiB;IAC9D,MAAM;MAAEC,IAAI;MAAEC;IAAS,CAAC,GAAGF,KAAK,CAACG,OAAO;IAExC,MAAMC,iBAAiB,GAAGF,QAAQ,CAACG,aAAa;IAChD,MAAMC,gBAAgB,GAAGL,IAAI,CAACI,aAAa;;IAE3C;IACA,IAAID,iBAAiB,EAAEG,IAAI,KAAKD,gBAAgB,EAAEC,IAAI,EAAE;MACpD;IACJ;IAEA,MAAM,IAAI,CAACV,WAAW,CAACW,OAAO,CAAC;MAC3BC,UAAU,EAAE,2BAA2B;MACvCC,KAAK,EAAE;QACHC,MAAM,EAAE,kBAAkB;QAC1BC,KAAK,EAAE,IAAI,CAACd,cAAc,CAACe,QAAQ,CAACZ,IAAI,CAACa,EAAE;MAC/C;IACJ,CAAC,CAAC;EACN;AACJ;AAEA,OAAO,MAAMC,6BAA6B,GAAGvB,uBAAuB,CAACwB,oBAAoB,CAAC;EACtFC,cAAc,EAAEtB,iCAAiC;EACjDuB,YAAY,EAAE,CAACzB,WAAW;AAC9B,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,25 @@
1
+ import { TaskDefinition } 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 InvalidateCloudfrontCacheTask implements TaskDefinition.Interface<InvalidateCacheInput> {
13
+ id: string;
14
+ title: string;
15
+ description: string;
16
+ maxIterations: number;
17
+ isPrivate: boolean;
18
+ private continueIfCode;
19
+ run({ input, controller }: TaskDefinition.RunParams<InvalidateCacheInput>): Promise<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskResultError | import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskResultAborted | TaskDefinition.ResultDone<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput> | TaskDefinition.ResultContinue<InvalidateCacheInput>>;
20
+ private invalidateCache;
21
+ }
22
+ export declare const InvalidateCloudfrontCacheTaskDefinition: typeof InvalidateCloudfrontCacheTask & {
23
+ __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>>;
24
+ };
25
+ export {};
@@ -0,0 +1,86 @@
1
+ import { ServiceDiscovery } from "@webiny/api";
2
+ import { CloudFront } from "@webiny/aws-sdk/client-cloudfront/index.js";
3
+ import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
4
+ import { executeWithRetry } from "@webiny/utils";
5
+ class ReturnContinue extends Error {}
6
+ class InvalidateCloudfrontCacheTask {
7
+ id = "cloudfrontInvalidateCache";
8
+ title = "Invalidate CloudFront Cache";
9
+ description = "A task to invalidate Cloudfront cache by given paths.";
10
+ maxIterations = 100;
11
+ isPrivate = true;
12
+ continueIfCode = ["TooManyInvalidationsInProgress", "Throttling"];
13
+ async run({
14
+ input,
15
+ controller
16
+ }) {
17
+ if (controller.runtime.isAborted()) {
18
+ return controller.response.aborted();
19
+ }
20
+ const manifest = await ServiceDiscovery.load();
21
+ if (!manifest) {
22
+ return controller.response.error({
23
+ message: `Unable to invalidate cache due to a missing service manifest.`,
24
+ code: "MISSING_SERVICE_MANIFEST",
25
+ data: {
26
+ manifest: "api"
27
+ }
28
+ });
29
+ }
30
+ const {
31
+ distributionId
32
+ } = manifest.api.cloudfront;
33
+ const invalidateCache = () => {
34
+ return this.invalidateCache(input.caller, distributionId, input.paths);
35
+ };
36
+ try {
37
+ await executeWithRetry(invalidateCache, {
38
+ minTimeout: 2000,
39
+ // instead of forever: true
40
+ retries: 10000,
41
+ onFailedAttempt: ({
42
+ error
43
+ }) => {
44
+ if (this.continueIfCode.includes(error.name)) {
45
+ throw new ReturnContinue();
46
+ }
47
+ if (error.message.includes("not authorized to perform")) {
48
+ throw error;
49
+ }
50
+ if (controller.runtime.isCloseToTimeout()) {
51
+ throw new ReturnContinue();
52
+ }
53
+ }
54
+ });
55
+ } catch (error) {
56
+ if (error instanceof ReturnContinue) {
57
+ return controller.response.continue(input);
58
+ }
59
+ return controller.response.error({
60
+ message: error.message,
61
+ code: "EXECUTE_WITH_RETRY_FAILED",
62
+ data: input.paths
63
+ });
64
+ }
65
+ return controller.response.done();
66
+ }
67
+ async invalidateCache(caller, distributionId, paths) {
68
+ const cloudfront = new CloudFront();
69
+ await cloudfront.createInvalidation({
70
+ DistributionId: distributionId,
71
+ InvalidationBatch: {
72
+ CallerReference: `${new Date().getTime()}-${caller}`,
73
+ Paths: {
74
+ Quantity: paths.length,
75
+ Items: paths
76
+ }
77
+ }
78
+ });
79
+ }
80
+ }
81
+ export const InvalidateCloudfrontCacheTaskDefinition = TaskDefinition.createImplementation({
82
+ implementation: InvalidateCloudfrontCacheTask,
83
+ dependencies: []
84
+ });
85
+
86
+ //# sourceMappingURL=InvalidateCacheTask.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ServiceDiscovery","CloudFront","TaskDefinition","executeWithRetry","ReturnContinue","Error","InvalidateCloudfrontCacheTask","id","title","description","maxIterations","isPrivate","continueIfCode","run","input","controller","runtime","isAborted","response","aborted","manifest","load","error","message","code","data","distributionId","api","cloudfront","invalidateCache","caller","paths","minTimeout","retries","onFailedAttempt","includes","name","isCloseToTimeout","continue","done","createInvalidation","DistributionId","InvalidationBatch","CallerReference","Date","getTime","Paths","Quantity","length","Items","InvalidateCloudfrontCacheTaskDefinition","createImplementation","implementation","dependencies"],"sources":["InvalidateCacheTask.ts"],"sourcesContent":["import { ServiceDiscovery } from \"@webiny/api\";\nimport { CloudFront } from \"@webiny/aws-sdk/client-cloudfront/index.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { executeWithRetry } from \"@webiny/utils\";\n\nclass ReturnContinue extends Error {}\n\nexport interface InvalidateCacheInput {\n /**\n * Caller of the task (e.g., `fm-before-update`, `fm-after-delete`).\n */\n caller: string;\n /**\n * Cache paths to invalidate.\n */\n paths: string[];\n}\n\nclass InvalidateCloudfrontCacheTask implements TaskDefinition.Interface<InvalidateCacheInput> {\n id = \"cloudfrontInvalidateCache\";\n title = \"Invalidate CloudFront Cache\";\n description = \"A task to invalidate Cloudfront cache by given paths.\";\n maxIterations = 100;\n isPrivate = true;\n\n private continueIfCode = [\"TooManyInvalidationsInProgress\", \"Throttling\"];\n\n public async run({ input, controller }: TaskDefinition.RunParams<InvalidateCacheInput>) {\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n }\n\n const manifest = await ServiceDiscovery.load();\n\n if (!manifest) {\n return controller.response.error({\n message: `Unable to invalidate cache due to a missing service manifest.`,\n code: \"MISSING_SERVICE_MANIFEST\",\n data: {\n manifest: \"api\"\n }\n });\n }\n\n const { distributionId } = manifest.api.cloudfront;\n\n const invalidateCache = () => {\n return this.invalidateCache(input.caller, distributionId as string, input.paths);\n };\n\n try {\n await executeWithRetry(invalidateCache, {\n minTimeout: 2000,\n // instead of forever: true\n retries: 10000,\n onFailedAttempt: ({ error }) => {\n if (this.continueIfCode.includes(error.name)) {\n throw new ReturnContinue();\n }\n\n if (error.message.includes(\"not authorized to perform\")) {\n throw error;\n }\n\n if (controller.runtime.isCloseToTimeout()) {\n throw new ReturnContinue();\n }\n }\n });\n } catch (error) {\n if (error instanceof ReturnContinue) {\n return controller.response.continue(input);\n }\n\n return controller.response.error({\n message: error.message,\n code: \"EXECUTE_WITH_RETRY_FAILED\",\n data: input.paths\n });\n }\n\n return controller.response.done();\n }\n\n private async invalidateCache(\n caller: string,\n distributionId: string,\n paths: string[]\n ): Promise<void> {\n const cloudfront = new CloudFront();\n await cloudfront.createInvalidation({\n DistributionId: distributionId,\n InvalidationBatch: {\n CallerReference: `${new Date().getTime()}-${caller}`,\n Paths: {\n Quantity: paths.length,\n Items: paths\n }\n }\n });\n }\n}\n\nexport const InvalidateCloudfrontCacheTaskDefinition = TaskDefinition.createImplementation({\n implementation: InvalidateCloudfrontCacheTask,\n dependencies: []\n});\n"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,aAAa;AAC9C,SAASC,UAAU,QAAQ,4CAA4C;AACvE,SAASC,cAAc,QAAQ,wDAAwD;AACvF,SAASC,gBAAgB,QAAQ,eAAe;AAEhD,MAAMC,cAAc,SAASC,KAAK,CAAC;AAanC,MAAMC,6BAA6B,CAA2D;EAC1FC,EAAE,GAAG,2BAA2B;EAChCC,KAAK,GAAG,6BAA6B;EACrCC,WAAW,GAAG,uDAAuD;EACrEC,aAAa,GAAG,GAAG;EACnBC,SAAS,GAAG,IAAI;EAERC,cAAc,GAAG,CAAC,gCAAgC,EAAE,YAAY,CAAC;EAEzE,MAAaC,GAAGA,CAAC;IAAEC,KAAK;IAAEC;EAA2D,CAAC,EAAE;IACpF,IAAIA,UAAU,CAACC,OAAO,CAACC,SAAS,CAAC,CAAC,EAAE;MAChC,OAAOF,UAAU,CAACG,QAAQ,CAACC,OAAO,CAAC,CAAC;IACxC;IAEA,MAAMC,QAAQ,GAAG,MAAMpB,gBAAgB,CAACqB,IAAI,CAAC,CAAC;IAE9C,IAAI,CAACD,QAAQ,EAAE;MACX,OAAOL,UAAU,CAACG,QAAQ,CAACI,KAAK,CAAC;QAC7BC,OAAO,EAAE,+DAA+D;QACxEC,IAAI,EAAE,0BAA0B;QAChCC,IAAI,EAAE;UACFL,QAAQ,EAAE;QACd;MACJ,CAAC,CAAC;IACN;IAEA,MAAM;MAAEM;IAAe,CAAC,GAAGN,QAAQ,CAACO,GAAG,CAACC,UAAU;IAElD,MAAMC,eAAe,GAAGA,CAAA,KAAM;MAC1B,OAAO,IAAI,CAACA,eAAe,CAACf,KAAK,CAACgB,MAAM,EAAEJ,cAAc,EAAYZ,KAAK,CAACiB,KAAK,CAAC;IACpF,CAAC;IAED,IAAI;MACA,MAAM5B,gBAAgB,CAAC0B,eAAe,EAAE;QACpCG,UAAU,EAAE,IAAI;QAChB;QACAC,OAAO,EAAE,KAAK;QACdC,eAAe,EAAEA,CAAC;UAAEZ;QAAM,CAAC,KAAK;UAC5B,IAAI,IAAI,CAACV,cAAc,CAACuB,QAAQ,CAACb,KAAK,CAACc,IAAI,CAAC,EAAE;YAC1C,MAAM,IAAIhC,cAAc,CAAC,CAAC;UAC9B;UAEA,IAAIkB,KAAK,CAACC,OAAO,CAACY,QAAQ,CAAC,2BAA2B,CAAC,EAAE;YACrD,MAAMb,KAAK;UACf;UAEA,IAAIP,UAAU,CAACC,OAAO,CAACqB,gBAAgB,CAAC,CAAC,EAAE;YACvC,MAAM,IAAIjC,cAAc,CAAC,CAAC;UAC9B;QACJ;MACJ,CAAC,CAAC;IACN,CAAC,CAAC,OAAOkB,KAAK,EAAE;MACZ,IAAIA,KAAK,YAAYlB,cAAc,EAAE;QACjC,OAAOW,UAAU,CAACG,QAAQ,CAACoB,QAAQ,CAACxB,KAAK,CAAC;MAC9C;MAEA,OAAOC,UAAU,CAACG,QAAQ,CAACI,KAAK,CAAC;QAC7BC,OAAO,EAAED,KAAK,CAACC,OAAO;QACtBC,IAAI,EAAE,2BAA2B;QACjCC,IAAI,EAAEX,KAAK,CAACiB;MAChB,CAAC,CAAC;IACN;IAEA,OAAOhB,UAAU,CAACG,QAAQ,CAACqB,IAAI,CAAC,CAAC;EACrC;EAEA,MAAcV,eAAeA,CACzBC,MAAc,EACdJ,cAAsB,EACtBK,KAAe,EACF;IACb,MAAMH,UAAU,GAAG,IAAI3B,UAAU,CAAC,CAAC;IACnC,MAAM2B,UAAU,CAACY,kBAAkB,CAAC;MAChCC,cAAc,EAAEf,cAAc;MAC9BgB,iBAAiB,EAAE;QACfC,eAAe,EAAE,GAAG,IAAIC,IAAI,CAAC,CAAC,CAACC,OAAO,CAAC,CAAC,IAAIf,MAAM,EAAE;QACpDgB,KAAK,EAAE;UACHC,QAAQ,EAAEhB,KAAK,CAACiB,MAAM;UACtBC,KAAK,EAAElB;QACX;MACJ;IACJ,CAAC,CAAC;EACN;AACJ;AAEA,OAAO,MAAMmB,uCAAuC,GAAGhD,cAAc,CAACiD,oBAAoB,CAAC;EACvFC,cAAc,EAAE9C,6BAA6B;EAC7C+C,YAAY,EAAE;AAClB,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1 @@
1
+ export declare const FlushCacheFeature: import("@webiny/feature/api/createFeature.js").FeatureDefinition<unknown>;
@@ -0,0 +1,14 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { FlushCacheOnFileDeleteHandler } from "./FlushCacheOnFileDeleteHandler.js";
3
+ import { FlushCacheOnFileUpdateHandler } from "./FlushCacheOnFileUpdateHandler.js";
4
+ import { InvalidateCloudfrontCacheTaskDefinition } from "./InvalidateCacheTask.js";
5
+ export const FlushCacheFeature = createFeature({
6
+ name: "FileManagerS3/FlushCache",
7
+ register(container) {
8
+ container.register(FlushCacheOnFileDeleteHandler);
9
+ container.register(FlushCacheOnFileUpdateHandler);
10
+ container.register(InvalidateCloudfrontCacheTaskDefinition);
11
+ }
12
+ });
13
+
14
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createFeature","FlushCacheOnFileDeleteHandler","FlushCacheOnFileUpdateHandler","InvalidateCloudfrontCacheTaskDefinition","FlushCacheFeature","name","register","container"],"sources":["feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { FlushCacheOnFileDeleteHandler } from \"./FlushCacheOnFileDeleteHandler.js\";\nimport { FlushCacheOnFileUpdateHandler } from \"./FlushCacheOnFileUpdateHandler.js\";\nimport { InvalidateCloudfrontCacheTaskDefinition } from \"./InvalidateCacheTask.js\";\n\nexport const FlushCacheFeature = createFeature({\n name: \"FileManagerS3/FlushCache\",\n register(container) {\n container.register(FlushCacheOnFileDeleteHandler);\n container.register(FlushCacheOnFileUpdateHandler);\n container.register(InvalidateCloudfrontCacheTaskDefinition);\n }\n});\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,qBAAqB;AACnD,SAASC,6BAA6B;AACtC,SAASC,6BAA6B;AACtC,SAASC,uCAAuC;AAEhD,OAAO,MAAMC,iBAAiB,GAAGJ,aAAa,CAAC;EAC3CK,IAAI,EAAE,0BAA0B;EAChCC,QAAQA,CAACC,SAAS,EAAE;IAChBA,SAAS,CAACD,QAAQ,CAACL,6BAA6B,CAAC;IACjDM,SAAS,CAACD,QAAQ,CAACJ,6BAA6B,CAAC;IACjDK,SAAS,CAACD,QAAQ,CAACH,uCAAuC,CAAC;EAC/D;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,14 @@
1
+ import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
2
+ interface AssetMetadata {
3
+ id: string;
4
+ tenant: string;
5
+ size: number;
6
+ contentType: string;
7
+ bucketKey: string;
8
+ }
9
+ export declare class MetadataReader {
10
+ private keyValueStore;
11
+ constructor(keyValueStore: GlobalKeyValueStore.Interface);
12
+ read(fileId: string): Promise<AssetMetadata | undefined>;
13
+ }
14
+ export {};
@@ -0,0 +1,14 @@
1
+ export class MetadataReader {
2
+ constructor(keyValueStore) {
3
+ this.keyValueStore = keyValueStore;
4
+ }
5
+ async read(fileId) {
6
+ const result = await this.keyValueStore.get(`FileManager/File/${fileId}/Metadata`);
7
+ if (result.isFail()) {
8
+ return undefined;
9
+ }
10
+ return result.value;
11
+ }
12
+ }
13
+
14
+ //# sourceMappingURL=MetadataReader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MetadataReader","constructor","keyValueStore","read","fileId","result","get","isFail","undefined","value"],"sources":["MetadataReader.ts"],"sourcesContent":["import { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\n\ninterface AssetMetadata {\n id: string;\n tenant: string;\n size: number;\n contentType: string;\n bucketKey: string;\n}\n\nexport class MetadataReader {\n constructor(private keyValueStore: GlobalKeyValueStore.Interface) {}\n\n async read(fileId: string): Promise<AssetMetadata | undefined> {\n const result = await this.keyValueStore.get<AssetMetadata>(\n `FileManager/File/${fileId}/Metadata`\n );\n\n if (result.isFail()) {\n return undefined;\n }\n\n return result.value;\n }\n}\n"],"mappings":"AAUA,OAAO,MAAMA,cAAc,CAAC;EACxBC,WAAWA,CAASC,aAA4C,EAAE;IAAA,KAA9CA,aAA4C,GAA5CA,aAA4C;EAAG;EAEnE,MAAMC,IAAIA,CAACC,MAAc,EAAsC;IAC3D,MAAMC,MAAM,GAAG,MAAM,IAAI,CAACH,aAAa,CAACI,GAAG,CACvC,oBAAoBF,MAAM,WAC9B,CAAC;IAED,IAAIC,MAAM,CAACE,MAAM,CAAC,CAAC,EAAE;MACjB,OAAOC,SAAS;IACpB;IAEA,OAAOH,MAAM,CAACI,KAAK;EACvB;AACJ","ignoreList":[]}
@@ -0,0 +1,10 @@
1
+ import { TenantContext } from "@webiny/api-core/features/TenantContext";
2
+ import type { File } from "@webiny/api-file-manager/domain/file/types.js";
3
+ import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
4
+ export declare class MetadataWriter {
5
+ private tenantContext;
6
+ private keyValueStore;
7
+ constructor(tenantContext: TenantContext.Interface, keyValueStore: GlobalKeyValueStore.Interface);
8
+ write(files: File[]): Promise<void>;
9
+ private getMetadata;
10
+ }
@@ -0,0 +1,28 @@
1
+ export class MetadataWriter {
2
+ constructor(tenantContext, keyValueStore) {
3
+ this.tenantContext = tenantContext;
4
+ this.keyValueStore = keyValueStore;
5
+ }
6
+ async write(files) {
7
+ /**
8
+ * We need to write each file with retry.
9
+ */
10
+ const writers = files.map(async file => {
11
+ const metadata = this.getMetadata(file);
12
+ await this.keyValueStore.set(`FileManager/File/${file.id}/Metadata`, metadata);
13
+ });
14
+ await Promise.all(writers);
15
+ }
16
+ getMetadata(file) {
17
+ const tenant = this.tenantContext.getTenant();
18
+ return {
19
+ id: file.id,
20
+ bucketKey: `tenants/${tenant.id}/files/${file.key}`,
21
+ tenant: tenant.id,
22
+ size: file.size,
23
+ contentType: file.type
24
+ };
25
+ }
26
+ }
27
+
28
+ //# sourceMappingURL=MetadataWriter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MetadataWriter","constructor","tenantContext","keyValueStore","write","files","writers","map","file","metadata","getMetadata","set","id","Promise","all","tenant","getTenant","bucketKey","key","size","contentType","type"],"sources":["MetadataWriter.ts"],"sourcesContent":["import { TenantContext } from \"@webiny/api-core/features/TenantContext\";\nimport type { File } from \"@webiny/api-file-manager/domain/file/types.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\n\nexport class MetadataWriter {\n constructor(\n private tenantContext: TenantContext.Interface,\n private keyValueStore: GlobalKeyValueStore.Interface\n ) {}\n\n async write(files: File[]) {\n /**\n * We need to write each file with retry.\n */\n const writers = files.map(async file => {\n const metadata = this.getMetadata(file);\n await this.keyValueStore.set(`FileManager/File/${file.id}/Metadata`, metadata);\n });\n\n await Promise.all(writers);\n }\n\n private getMetadata(file: File) {\n const tenant = this.tenantContext.getTenant();\n return {\n id: file.id,\n bucketKey: `tenants/${tenant.id}/files/${file.key}`,\n tenant: tenant.id,\n size: file.size,\n contentType: file.type\n };\n }\n}\n"],"mappings":"AAIA,OAAO,MAAMA,cAAc,CAAC;EACxBC,WAAWA,CACCC,aAAsC,EACtCC,aAA4C,EACtD;IAAA,KAFUD,aAAsC,GAAtCA,aAAsC;IAAA,KACtCC,aAA4C,GAA5CA,aAA4C;EACrD;EAEH,MAAMC,KAAKA,CAACC,KAAa,EAAE;IACvB;AACR;AACA;IACQ,MAAMC,OAAO,GAAGD,KAAK,CAACE,GAAG,CAAC,MAAMC,IAAI,IAAI;MACpC,MAAMC,QAAQ,GAAG,IAAI,CAACC,WAAW,CAACF,IAAI,CAAC;MACvC,MAAM,IAAI,CAACL,aAAa,CAACQ,GAAG,CAAC,oBAAoBH,IAAI,CAACI,EAAE,WAAW,EAAEH,QAAQ,CAAC;IAClF,CAAC,CAAC;IAEF,MAAMI,OAAO,CAACC,GAAG,CAACR,OAAO,CAAC;EAC9B;EAEQI,WAAWA,CAACF,IAAU,EAAE;IAC5B,MAAMO,MAAM,GAAG,IAAI,CAACb,aAAa,CAACc,SAAS,CAAC,CAAC;IAC7C,OAAO;MACHJ,EAAE,EAAEJ,IAAI,CAACI,EAAE;MACXK,SAAS,EAAE,WAAWF,MAAM,CAACH,EAAE,UAAUJ,IAAI,CAACU,GAAG,EAAE;MACnDH,MAAM,EAAEA,MAAM,CAACH,EAAE;MACjBO,IAAI,EAAEX,IAAI,CAACW,IAAI;MACfC,WAAW,EAAEZ,IAAI,CAACa;IACtB,CAAC;EACL;AACJ","ignoreList":[]}
@@ -0,0 +1,12 @@
1
+ import { TenantContext } from "@webiny/api-core/features/TenantContext";
2
+ import { FileAfterBatchCreateHandler } from "@webiny/api-file-manager/features/file/CreateFilesInBatch/events.js";
3
+ import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
4
+ declare class WriteMetadataAfterBatchCreateHandlerImpl implements FileAfterBatchCreateHandler.Interface {
5
+ private readonly metadataWriter;
6
+ constructor(tenantContext: TenantContext.Interface, keyValueStore: GlobalKeyValueStore.Interface);
7
+ handle(event: FileAfterBatchCreateHandler.Event): Promise<void>;
8
+ }
9
+ export declare const WriteMetadataAfterBatchCreateHandler: typeof WriteMetadataAfterBatchCreateHandlerImpl & {
10
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/EventPublisher").IEventHandler<import("@webiny/api-file-manager/features/file/CreateFilesInBatch/events.js").FileAfterBatchCreateEvent>>;
11
+ };
12
+ export {};
@@ -0,0 +1,21 @@
1
+ import { TenantContext } from "@webiny/api-core/features/TenantContext";
2
+ import { FileAfterBatchCreateHandler } from "@webiny/api-file-manager/features/file/CreateFilesInBatch/events.js";
3
+ import { MetadataWriter } from "./MetadataWriter.js";
4
+ import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
5
+ class WriteMetadataAfterBatchCreateHandlerImpl {
6
+ constructor(tenantContext, keyValueStore) {
7
+ this.metadataWriter = new MetadataWriter(tenantContext, keyValueStore);
8
+ }
9
+ async handle(event) {
10
+ const {
11
+ files
12
+ } = event.payload;
13
+ await this.metadataWriter.write(files);
14
+ }
15
+ }
16
+ export const WriteMetadataAfterBatchCreateHandler = FileAfterBatchCreateHandler.createImplementation({
17
+ implementation: WriteMetadataAfterBatchCreateHandlerImpl,
18
+ dependencies: [TenantContext, GlobalKeyValueStore]
19
+ });
20
+
21
+ //# sourceMappingURL=WriteMetadataAfterBatchCreateHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["TenantContext","FileAfterBatchCreateHandler","MetadataWriter","GlobalKeyValueStore","WriteMetadataAfterBatchCreateHandlerImpl","constructor","tenantContext","keyValueStore","metadataWriter","handle","event","files","payload","write","WriteMetadataAfterBatchCreateHandler","createImplementation","implementation","dependencies"],"sources":["WriteMetadataAfterBatchCreateHandler.ts"],"sourcesContent":["import { TenantContext } from \"@webiny/api-core/features/TenantContext\";\nimport { FileAfterBatchCreateHandler } from \"@webiny/api-file-manager/features/file/CreateFilesInBatch/events.js\";\nimport { MetadataWriter } from \"./MetadataWriter.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\n\nclass WriteMetadataAfterBatchCreateHandlerImpl implements FileAfterBatchCreateHandler.Interface {\n private readonly metadataWriter: MetadataWriter;\n\n constructor(\n tenantContext: TenantContext.Interface,\n keyValueStore: GlobalKeyValueStore.Interface\n ) {\n this.metadataWriter = new MetadataWriter(tenantContext, keyValueStore);\n }\n\n async handle(event: FileAfterBatchCreateHandler.Event): Promise<void> {\n const { files } = event.payload;\n await this.metadataWriter.write(files);\n }\n}\n\nexport const WriteMetadataAfterBatchCreateHandler =\n FileAfterBatchCreateHandler.createImplementation({\n implementation: WriteMetadataAfterBatchCreateHandlerImpl,\n dependencies: [TenantContext, GlobalKeyValueStore]\n });\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,yCAAyC;AACvE,SAASC,2BAA2B,QAAQ,qEAAqE;AACjH,SAASC,cAAc;AACvB,SAASC,mBAAmB,QAAQ,kDAAkD;AAEtF,MAAMC,wCAAwC,CAAkD;EAG5FC,WAAWA,CACPC,aAAsC,EACtCC,aAA4C,EAC9C;IACE,IAAI,CAACC,cAAc,GAAG,IAAIN,cAAc,CAACI,aAAa,EAAEC,aAAa,CAAC;EAC1E;EAEA,MAAME,MAAMA,CAACC,KAAwC,EAAiB;IAClE,MAAM;MAAEC;IAAM,CAAC,GAAGD,KAAK,CAACE,OAAO;IAC/B,MAAM,IAAI,CAACJ,cAAc,CAACK,KAAK,CAACF,KAAK,CAAC;EAC1C;AACJ;AAEA,OAAO,MAAMG,oCAAoC,GAC7Cb,2BAA2B,CAACc,oBAAoB,CAAC;EAC7CC,cAAc,EAAEZ,wCAAwC;EACxDa,YAAY,EAAE,CAACjB,aAAa,EAAEG,mBAAmB;AACrD,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,12 @@
1
+ import { FileAfterCreateHandler } from "@webiny/api-file-manager/features/file/CreateFile/events.js";
2
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
3
+ import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
4
+ declare class WriteMetadataAfterCreateHandlerImpl implements FileAfterCreateHandler.Interface {
5
+ private readonly metadataWriter;
6
+ constructor(tenantContext: TenantContext.Interface, keyValueStore: GlobalKeyValueStore.Interface);
7
+ handle(event: FileAfterCreateHandler.Event): Promise<void>;
8
+ }
9
+ export declare const WriteMetadataAfterCreateHandler: typeof WriteMetadataAfterCreateHandlerImpl & {
10
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/EventPublisher").IEventHandler<import("@webiny/api-file-manager/features/file/CreateFile/events.js").FileAfterCreateEvent>>;
11
+ };
12
+ export {};
@@ -0,0 +1,21 @@
1
+ import { FileAfterCreateHandler } from "@webiny/api-file-manager/features/file/CreateFile/events.js";
2
+ import { MetadataWriter } from "./MetadataWriter.js";
3
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
4
+ import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
5
+ class WriteMetadataAfterCreateHandlerImpl {
6
+ constructor(tenantContext, keyValueStore) {
7
+ this.metadataWriter = new MetadataWriter(tenantContext, keyValueStore);
8
+ }
9
+ async handle(event) {
10
+ const {
11
+ file
12
+ } = event.payload;
13
+ await this.metadataWriter.write([file]);
14
+ }
15
+ }
16
+ export const WriteMetadataAfterCreateHandler = FileAfterCreateHandler.createImplementation({
17
+ implementation: WriteMetadataAfterCreateHandlerImpl,
18
+ dependencies: [TenantContext, GlobalKeyValueStore]
19
+ });
20
+
21
+ //# sourceMappingURL=WriteMetadataAfterCreateHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["FileAfterCreateHandler","MetadataWriter","TenantContext","GlobalKeyValueStore","WriteMetadataAfterCreateHandlerImpl","constructor","tenantContext","keyValueStore","metadataWriter","handle","event","file","payload","write","WriteMetadataAfterCreateHandler","createImplementation","implementation","dependencies"],"sources":["WriteMetadataAfterCreateHandler.ts"],"sourcesContent":["import { FileAfterCreateHandler } from \"@webiny/api-file-manager/features/file/CreateFile/events.js\";\nimport { MetadataWriter } from \"./MetadataWriter.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\n\nclass WriteMetadataAfterCreateHandlerImpl implements FileAfterCreateHandler.Interface {\n private readonly metadataWriter: MetadataWriter;\n\n constructor(\n tenantContext: TenantContext.Interface,\n keyValueStore: GlobalKeyValueStore.Interface\n ) {\n this.metadataWriter = new MetadataWriter(tenantContext, keyValueStore);\n }\n\n async handle(event: FileAfterCreateHandler.Event): Promise<void> {\n const { file } = event.payload;\n await this.metadataWriter.write([file]);\n }\n}\n\nexport const WriteMetadataAfterCreateHandler = FileAfterCreateHandler.createImplementation({\n implementation: WriteMetadataAfterCreateHandlerImpl,\n dependencies: [TenantContext, GlobalKeyValueStore]\n});\n"],"mappings":"AAAA,SAASA,sBAAsB,QAAQ,6DAA6D;AACpG,SAASC,cAAc;AACvB,SAASC,aAAa,QAAQ,0DAA0D;AACxF,SAASC,mBAAmB,QAAQ,kDAAkD;AAEtF,MAAMC,mCAAmC,CAA6C;EAGlFC,WAAWA,CACPC,aAAsC,EACtCC,aAA4C,EAC9C;IACE,IAAI,CAACC,cAAc,GAAG,IAAIP,cAAc,CAACK,aAAa,EAAEC,aAAa,CAAC;EAC1E;EAEA,MAAME,MAAMA,CAACC,KAAmC,EAAiB;IAC7D,MAAM;MAAEC;IAAK,CAAC,GAAGD,KAAK,CAACE,OAAO;IAC9B,MAAM,IAAI,CAACJ,cAAc,CAACK,KAAK,CAAC,CAACF,IAAI,CAAC,CAAC;EAC3C;AACJ;AAEA,OAAO,MAAMG,+BAA+B,GAAGd,sBAAsB,CAACe,oBAAoB,CAAC;EACvFC,cAAc,EAAEZ,mCAAmC;EACnDa,YAAY,EAAE,CAACf,aAAa,EAAEC,mBAAmB;AACrD,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1 @@
1
+ export declare const WriteFileMetadataFeature: import("@webiny/feature/api/createFeature.js").FeatureDefinition<unknown>;
@@ -0,0 +1,12 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { WriteMetadataAfterCreateHandler } from "./WriteMetadataAfterCreateHandler.js";
3
+ import { WriteMetadataAfterBatchCreateHandler } from "./WriteMetadataAfterBatchCreateHandler.js";
4
+ export const WriteFileMetadataFeature = createFeature({
5
+ name: "FileManagerS3/WriteFileMetadata",
6
+ register(container) {
7
+ container.register(WriteMetadataAfterCreateHandler);
8
+ container.register(WriteMetadataAfterBatchCreateHandler);
9
+ }
10
+ });
11
+
12
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createFeature","WriteMetadataAfterCreateHandler","WriteMetadataAfterBatchCreateHandler","WriteFileMetadataFeature","name","register","container"],"sources":["feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { WriteMetadataAfterCreateHandler } from \"./WriteMetadataAfterCreateHandler.js\";\nimport { WriteMetadataAfterBatchCreateHandler } from \"./WriteMetadataAfterBatchCreateHandler.js\";\n\nexport const WriteFileMetadataFeature = createFeature({\n name: \"FileManagerS3/WriteFileMetadata\",\n register(container) {\n container.register(WriteMetadataAfterCreateHandler);\n container.register(WriteMetadataAfterBatchCreateHandler);\n }\n});\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,qBAAqB;AACnD,SAASC,+BAA+B;AACxC,SAASC,oCAAoC;AAE7C,OAAO,MAAMC,wBAAwB,GAAGH,aAAa,CAAC;EAClDI,IAAI,EAAE,iCAAiC;EACvCC,QAAQA,CAACC,SAAS,EAAE;IAChBA,SAAS,CAACD,QAAQ,CAACJ,+BAA+B,CAAC;IACnDK,SAAS,CAACD,QAAQ,CAACH,oCAAoC,CAAC;EAC5D;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,5 @@
1
+ import type { FilePermission } from "@webiny/api-file-manager/types.js";
2
+ import { IdentityContext } from "@webiny/api-core/features/IdentityContext";
3
+ export declare const checkPermissions: (identityContext: IdentityContext.Interface, check?: {
4
+ rwd?: string;
5
+ }) => Promise<FilePermission[]>;
@@ -1,12 +1,6 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.checkPermissions = void 0;
7
- var _apiSecurity = require("@webiny/api-security");
8
- const checkPermissions = async (context, check = {}) => {
9
- const filePermissions = await context.security.getPermissions("fm.file");
1
+ import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/index.js";
2
+ export const checkPermissions = async (identityContext, check = {}) => {
3
+ const filePermissions = await identityContext.getPermissions("fm.file");
10
4
  const relevantFilePermissions = filePermissions.filter(current => {
11
5
  if (check.rwd && !hasRwd(current, check.rwd)) {
12
6
  return false;
@@ -14,11 +8,10 @@ const checkPermissions = async (context, check = {}) => {
14
8
  return true;
15
9
  });
16
10
  if (relevantFilePermissions.length === 0) {
17
- throw new _apiSecurity.NotAuthorizedError();
11
+ throw new NotAuthorizedError();
18
12
  }
19
13
  return relevantFilePermissions;
20
14
  };
21
- exports.checkPermissions = checkPermissions;
22
15
  const hasRwd = (filesFilePermissions, rwd) => {
23
16
  if (!Array.isArray(filesFilePermissions)) {
24
17
  filesFilePermissions = [filesFilePermissions];
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NotAuthorizedError","checkPermissions","identityContext","check","filePermissions","getPermissions","relevantFilePermissions","filter","current","rwd","hasRwd","length","filesFilePermissions","Array","isArray","permissionWithoutRwdRestrictions","some","permission","includes"],"sources":["checkPermissions.ts"],"sourcesContent":["import type { FilePermission } from \"@webiny/api-file-manager/types.js\";\nimport { NotAuthorizedError } from \"@webiny/api-core/features/security/shared/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/IdentityContext\";\n\nexport const checkPermissions = async (\n identityContext: IdentityContext.Interface,\n check: { rwd?: string } = {}\n) => {\n const filePermissions = await identityContext.getPermissions<FilePermission>(\"fm.file\");\n\n const relevantFilePermissions = filePermissions.filter(current => {\n if (check.rwd && !hasRwd(current, check.rwd)) {\n return false;\n }\n\n return true;\n });\n\n if (relevantFilePermissions.length === 0) {\n throw new NotAuthorizedError();\n }\n\n return relevantFilePermissions;\n};\n\nconst hasRwd = (filesFilePermissions: FilePermission | FilePermission[], rwd: string): boolean => {\n if (!Array.isArray(filesFilePermissions)) {\n filesFilePermissions = [filesFilePermissions];\n }\n\n if (!rwd) {\n return true;\n }\n\n // Is there a permission that doesn't restrict RWD permissions, that means all RWD permissions are allowed.\n const permissionWithoutRwdRestrictions = filesFilePermissions.some(permission => {\n return typeof permission.rwd !== \"string\";\n });\n\n if (permissionWithoutRwdRestrictions) {\n return true;\n }\n\n // If there is no permission that doesn't restrict RWD permissions, that means we need to check if the RWD.\n return filesFilePermissions.some(permission => {\n return permission.rwd && permission.rwd.includes(rwd);\n });\n};\n"],"mappings":"AACA,SAASA,kBAAkB,QAAQ,oDAAoD;AAGvF,OAAO,MAAMC,gBAAgB,GAAG,MAAAA,CAC5BC,eAA0C,EAC1CC,KAAuB,GAAG,CAAC,CAAC,KAC3B;EACD,MAAMC,eAAe,GAAG,MAAMF,eAAe,CAACG,cAAc,CAAiB,SAAS,CAAC;EAEvF,MAAMC,uBAAuB,GAAGF,eAAe,CAACG,MAAM,CAACC,OAAO,IAAI;IAC9D,IAAIL,KAAK,CAACM,GAAG,IAAI,CAACC,MAAM,CAACF,OAAO,EAAEL,KAAK,CAACM,GAAG,CAAC,EAAE;MAC1C,OAAO,KAAK;IAChB;IAEA,OAAO,IAAI;EACf,CAAC,CAAC;EAEF,IAAIH,uBAAuB,CAACK,MAAM,KAAK,CAAC,EAAE;IACtC,MAAM,IAAIX,kBAAkB,CAAC,CAAC;EAClC;EAEA,OAAOM,uBAAuB;AAClC,CAAC;AAED,MAAMI,MAAM,GAAGA,CAACE,oBAAuD,EAAEH,GAAW,KAAc;EAC9F,IAAI,CAACI,KAAK,CAACC,OAAO,CAACF,oBAAoB,CAAC,EAAE;IACtCA,oBAAoB,GAAG,CAACA,oBAAoB,CAAC;EACjD;EAEA,IAAI,CAACH,GAAG,EAAE;IACN,OAAO,IAAI;EACf;;EAEA;EACA,MAAMM,gCAAgC,GAAGH,oBAAoB,CAACI,IAAI,CAACC,UAAU,IAAI;IAC7E,OAAO,OAAOA,UAAU,CAACR,GAAG,KAAK,QAAQ;EAC7C,CAAC,CAAC;EAEF,IAAIM,gCAAgC,EAAE;IAClC,OAAO,IAAI;EACf;;EAEA;EACA,OAAOH,oBAAoB,CAACI,IAAI,CAACC,UAAU,IAAI;IAC3C,OAAOA,UAAU,CAACR,GAAG,IAAIQ,UAAU,CAACR,GAAG,CAACS,QAAQ,CAACT,GAAG,CAAC;EACzD,CAAC,CAAC;AACN,CAAC","ignoreList":[]}
@@ -0,0 +1 @@
1
+ export declare const createS3GraphQLSchema: () => import("@webiny/handler-graphql").GraphQLSchemaPlugin<import("@webiny/api/types.js").Context>;