@webiny/api-file-manager-s3 6.3.0 → 6.4.0-beta.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 (121) hide show
  1. package/assetDelivery/assetDeliveryConfig.js +32 -39
  2. package/assetDelivery/assetDeliveryConfig.js.map +1 -1
  3. package/assetDelivery/createAssetDelivery.js +5 -19
  4. package/assetDelivery/createAssetDelivery.js.map +1 -1
  5. package/assetDelivery/index.js +0 -2
  6. package/assetDelivery/s3/S3AssetResolver.js +21 -22
  7. package/assetDelivery/s3/S3AssetResolver.js.map +1 -1
  8. package/assetDelivery/s3/S3ContentsReader.js +13 -16
  9. package/assetDelivery/s3/S3ContentsReader.js.map +1 -1
  10. package/assetDelivery/s3/S3ErrorAssetReply.js +10 -9
  11. package/assetDelivery/s3/S3ErrorAssetReply.js.map +1 -1
  12. package/assetDelivery/s3/S3OutputStrategy.js +23 -27
  13. package/assetDelivery/s3/S3OutputStrategy.js.map +1 -1
  14. package/assetDelivery/s3/S3RedirectAssetReply.js +12 -11
  15. package/assetDelivery/s3/S3RedirectAssetReply.js.map +1 -1
  16. package/assetDelivery/s3/S3StreamAssetReply.js +12 -11
  17. package/assetDelivery/s3/S3StreamAssetReply.js.map +1 -1
  18. package/assetDelivery/s3/SharpTransform.js +139 -169
  19. package/assetDelivery/s3/SharpTransform.js.map +1 -1
  20. package/assetDelivery/s3/transformation/AssetKeyGenerator.js +18 -17
  21. package/assetDelivery/s3/transformation/AssetKeyGenerator.js.map +1 -1
  22. package/assetDelivery/s3/transformation/CallableContentsReader.js +8 -7
  23. package/assetDelivery/s3/transformation/CallableContentsReader.js.map +1 -1
  24. package/assetDelivery/s3/transformation/WidthCollection.js +15 -16
  25. package/assetDelivery/s3/transformation/WidthCollection.js.map +1 -1
  26. package/assetDelivery/s3/transformation/utils.js +24 -30
  27. package/assetDelivery/s3/transformation/utils.js.map +1 -1
  28. package/assetDelivery/threatDetection/ObjectKey.js +15 -14
  29. package/assetDelivery/threatDetection/ObjectKey.js.map +1 -1
  30. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js +28 -42
  31. package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js.map +1 -1
  32. package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js +2 -3
  33. package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js.map +1 -1
  34. package/assetDelivery/threatDetection/index.js +0 -2
  35. package/assetDelivery/threatDetection/processThreatScanResult.js +48 -54
  36. package/assetDelivery/threatDetection/processThreatScanResult.js.map +1 -1
  37. package/assetDelivery/threatDetection/types.js +0 -3
  38. package/assetDelivery/types.js +0 -3
  39. package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js +17 -13
  40. package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js.map +1 -1
  41. package/enterprise/ApplyThreatScanning/feature.js +6 -5
  42. package/enterprise/ApplyThreatScanning/feature.js.map +1 -1
  43. package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js +26 -27
  44. package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js.map +1 -1
  45. package/features/DeleteFileFromBucket/DeleteS3FolderTask.js +40 -51
  46. package/features/DeleteFileFromBucket/DeleteS3FolderTask.js.map +1 -1
  47. package/features/DeleteFileFromBucket/feature.js +7 -6
  48. package/features/DeleteFileFromBucket/feature.js.map +1 -1
  49. package/features/ExtractMetadata/ExtractMetadataHandler.js +18 -19
  50. package/features/ExtractMetadata/ExtractMetadataHandler.js.map +1 -1
  51. package/features/ExtractMetadata/ExtractMetadataTask.js +75 -114
  52. package/features/ExtractMetadata/ExtractMetadataTask.js.map +1 -1
  53. package/features/ExtractMetadata/feature.js +7 -6
  54. package/features/ExtractMetadata/feature.js.map +1 -1
  55. package/features/FlushCache/FlushCacheOnFileDeleteHandler.js +20 -19
  56. package/features/FlushCache/FlushCacheOnFileDeleteHandler.js.map +1 -1
  57. package/features/FlushCache/FlushCacheOnFileUpdateHandler.js +22 -26
  58. package/features/FlushCache/FlushCacheOnFileUpdateHandler.js.map +1 -1
  59. package/features/FlushCache/InvalidateCacheTask.js +63 -75
  60. package/features/FlushCache/InvalidateCacheTask.js.map +1 -1
  61. package/features/FlushCache/feature.js +8 -7
  62. package/features/FlushCache/feature.js.map +1 -1
  63. package/features/GetFileContentsById/GetFileContentsByIdUseCase.d.ts +13 -0
  64. package/features/GetFileContentsById/GetFileContentsByIdUseCase.js +40 -0
  65. package/features/GetFileContentsById/GetFileContentsByIdUseCase.js.map +1 -0
  66. package/features/GetFileContentsById/feature.d.ts +4 -0
  67. package/features/GetFileContentsById/feature.js +11 -0
  68. package/features/GetFileContentsById/feature.js.map +1 -0
  69. package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.d.ts +13 -0
  70. package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.js +40 -0
  71. package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.js.map +1 -0
  72. package/features/GetFileContentsByKey/feature.d.ts +4 -0
  73. package/features/GetFileContentsByKey/feature.js +11 -0
  74. package/features/GetFileContentsByKey/feature.js.map +1 -0
  75. package/features/WriteFileMetadata/MetadataReader.js +9 -10
  76. package/features/WriteFileMetadata/MetadataReader.js.map +1 -1
  77. package/features/WriteFileMetadata/MetadataWriter.js +23 -25
  78. package/features/WriteFileMetadata/MetadataWriter.js.map +1 -1
  79. package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js +14 -12
  80. package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js.map +1 -1
  81. package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js +16 -12
  82. package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js.map +1 -1
  83. package/features/WriteFileMetadata/feature.js +7 -6
  84. package/features/WriteFileMetadata/feature.js.map +1 -1
  85. package/graphql/checkPermissions.js +17 -32
  86. package/graphql/checkPermissions.js.map +1 -1
  87. package/graphql/schema.js +99 -102
  88. package/graphql/schema.js.map +1 -1
  89. package/index.js +19 -13
  90. package/index.js.map +1 -1
  91. package/multiPartUpload/CompleteMultiPartUploadUseCase.js +50 -53
  92. package/multiPartUpload/CompleteMultiPartUploadUseCase.js.map +1 -1
  93. package/multiPartUpload/CreateMultiPartUploadUseCase.js +31 -38
  94. package/multiPartUpload/CreateMultiPartUploadUseCase.js.map +1 -1
  95. package/package.json +17 -17
  96. package/types.js +0 -2
  97. package/utils/CdnPathsGenerator.js +8 -4
  98. package/utils/CdnPathsGenerator.js.map +1 -1
  99. package/utils/FileExtension.js +12 -13
  100. package/utils/FileExtension.js.map +1 -1
  101. package/utils/FileKey.js +29 -21
  102. package/utils/FileKey.js.map +1 -1
  103. package/utils/FileKey.test.js +49 -49
  104. package/utils/FileKey.test.js.map +1 -1
  105. package/utils/FileNormalizer.js +34 -35
  106. package/utils/FileNormalizer.js.map +1 -1
  107. package/utils/FileUploadModifier.js +32 -32
  108. package/utils/FileUploadModifier.js.map +1 -1
  109. package/utils/createFileNormalizerFromContext.js +5 -4
  110. package/utils/createFileNormalizerFromContext.js.map +1 -1
  111. package/utils/getPresignedPostPayload.js +36 -33
  112. package/utils/getPresignedPostPayload.js.map +1 -1
  113. package/utils/mimeTypes.js +6 -10
  114. package/utils/mimeTypes.js.map +1 -1
  115. package/utils/uploadFileToS3.js +11 -10
  116. package/utils/uploadFileToS3.js.map +1 -1
  117. package/assetDelivery/index.js.map +0 -1
  118. package/assetDelivery/threatDetection/index.js.map +0 -1
  119. package/assetDelivery/threatDetection/types.js.map +0 -1
  120. package/assetDelivery/types.js.map +0 -1
  121. package/types.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"names":["FileAfterCreateEventHandler","MetadataWriter","TenantContext","GlobalKeyValueStore","WriteMetadataAfterCreateHandlerImpl","constructor","tenantContext","keyValueStore","metadataWriter","handle","event","file","payload","write","WriteMetadataAfterCreateHandler","createImplementation","implementation","dependencies"],"sources":["WriteMetadataAfterCreateHandler.ts"],"sourcesContent":["import { FileAfterCreateEventHandler } 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 FileAfterCreateEventHandler.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: FileAfterCreateEventHandler.Event): Promise<void> {\n const { file } = event.payload;\n await this.metadataWriter.write([file]);\n }\n}\n\nexport const WriteMetadataAfterCreateHandler = FileAfterCreateEventHandler.createImplementation({\n implementation: WriteMetadataAfterCreateHandlerImpl,\n dependencies: [TenantContext, GlobalKeyValueStore]\n});\n"],"mappings":"AAAA,SAASA,2BAA2B,QAAQ,6DAA6D;AACzG,SAASC,cAAc;AACvB,SAASC,aAAa,QAAQ,0DAA0D;AACxF,SAASC,mBAAmB,QAAQ,kDAAkD;AAEtF,MAAMC,mCAAmC,CAAkD;EAGvFC,WAAWA,CACPC,aAAsC,EACtCC,aAA4C,EAC9C;IACE,IAAI,CAACC,cAAc,GAAG,IAAIP,cAAc,CAACK,aAAa,EAAEC,aAAa,CAAC;EAC1E;EAEA,MAAME,MAAMA,CAACC,KAAwC,EAAiB;IAClE,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,2BAA2B,CAACe,oBAAoB,CAAC;EAC5FC,cAAc,EAAEZ,mCAAmC;EACnDa,YAAY,EAAE,CAACf,aAAa,EAAEC,mBAAmB;AACrD,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js","sources":["../../../src/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.ts"],"sourcesContent":["import { FileAfterCreateEventHandler } 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 FileAfterCreateEventHandler.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: FileAfterCreateEventHandler.Event): Promise<void> {\n const { file } = event.payload;\n await this.metadataWriter.write([file]);\n }\n}\n\nexport const WriteMetadataAfterCreateHandler = FileAfterCreateEventHandler.createImplementation({\n implementation: WriteMetadataAfterCreateHandlerImpl,\n dependencies: [TenantContext, GlobalKeyValueStore]\n});\n"],"names":["WriteMetadataAfterCreateHandlerImpl","tenantContext","keyValueStore","MetadataWriter","event","file","WriteMetadataAfterCreateHandler","FileAfterCreateEventHandler","TenantContext","GlobalKeyValueStore"],"mappings":";;;;AAKA,MAAMA;IAGF,YACIC,aAAsC,EACtCC,aAA4C,CAC9C;QACE,IAAI,CAAC,cAAc,GAAG,IAAIC,eAAeF,eAAeC;IAC5D;IAEA,MAAM,OAAOE,KAAwC,EAAiB;QAClE,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAM,OAAO;QAC9B,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;YAACC;SAAK;IAC1C;AACJ;AAEO,MAAMC,kCAAkCC,4BAA4B,oBAAoB,CAAC;IAC5F,gBAAgBP;IAChB,cAAc;QAACQ;QAAeC;KAAoB;AACtD"}
@@ -1,12 +1,13 @@
1
1
  import { createFeature } from "@webiny/feature/api";
2
2
  import { WriteMetadataAfterCreateHandler } from "./WriteMetadataAfterCreateHandler.js";
3
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
- }
4
+ const WriteFileMetadataFeature = createFeature({
5
+ name: "FileManagerS3/WriteFileMetadata",
6
+ register (container) {
7
+ container.register(WriteMetadataAfterCreateHandler);
8
+ container.register(WriteMetadataAfterBatchCreateHandler);
9
+ }
10
10
  });
11
+ export { WriteFileMetadataFeature };
11
12
 
12
13
  //# sourceMappingURL=feature.js.map
@@ -1 +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":[]}
1
+ {"version":3,"file":"features/WriteFileMetadata/feature.js","sources":["../../../src/features/WriteFileMetadata/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"],"names":["WriteFileMetadataFeature","createFeature","container","WriteMetadataAfterCreateHandler","WriteMetadataAfterBatchCreateHandler"],"mappings":";;;AAIO,MAAMA,2BAA2BC,cAAc;IAClD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;IACvB;AACJ"}
@@ -1,37 +1,22 @@
1
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");
4
- const relevantFilePermissions = filePermissions.filter(current => {
5
- if (check.rwd && !hasRwd(current, check.rwd)) {
6
- return false;
7
- }
8
- return true;
9
- });
10
- if (relevantFilePermissions.length === 0) {
11
- throw new NotAuthorizedError();
12
- }
13
- return relevantFilePermissions;
2
+ const checkPermissions = async (identityContext, check = {})=>{
3
+ const filePermissions = await identityContext.getPermissions("fm.file");
4
+ const relevantFilePermissions = filePermissions.filter((current)=>{
5
+ if (check.rwd && !hasRwd(current, check.rwd)) return false;
6
+ return true;
7
+ });
8
+ if (0 === relevantFilePermissions.length) throw new NotAuthorizedError();
9
+ return relevantFilePermissions;
14
10
  };
15
- const hasRwd = (filesFilePermissions, rwd) => {
16
- if (!Array.isArray(filesFilePermissions)) {
17
- filesFilePermissions = [filesFilePermissions];
18
- }
19
- if (!rwd) {
20
- return true;
21
- }
22
-
23
- // Is there a permission that doesn't restrict RWD permissions, that means all RWD permissions are allowed.
24
- const permissionWithoutRwdRestrictions = filesFilePermissions.some(permission => {
25
- return typeof permission.rwd !== "string";
26
- });
27
- if (permissionWithoutRwdRestrictions) {
28
- return true;
29
- }
30
-
31
- // If there is no permission that doesn't restrict RWD permissions, that means we need to check if the RWD.
32
- return filesFilePermissions.some(permission => {
33
- return permission.rwd && permission.rwd.includes(rwd);
34
- });
11
+ const hasRwd = (filesFilePermissions, rwd)=>{
12
+ if (!Array.isArray(filesFilePermissions)) filesFilePermissions = [
13
+ filesFilePermissions
14
+ ];
15
+ if (!rwd) return true;
16
+ const permissionWithoutRwdRestrictions = filesFilePermissions.some((permission)=>"string" != typeof permission.rwd);
17
+ if (permissionWithoutRwdRestrictions) return true;
18
+ return filesFilePermissions.some((permission)=>permission.rwd && permission.rwd.includes(rwd));
35
19
  };
20
+ export { checkPermissions };
36
21
 
37
22
  //# sourceMappingURL=checkPermissions.js.map
@@ -1 +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/security/IdentityContext/index.js\";\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":[]}
1
+ {"version":3,"file":"graphql/checkPermissions.js","sources":["../../src/graphql/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/security/IdentityContext/index.js\";\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"],"names":["checkPermissions","identityContext","check","filePermissions","relevantFilePermissions","current","hasRwd","NotAuthorizedError","filesFilePermissions","rwd","Array","permissionWithoutRwdRestrictions","permission"],"mappings":";AAIO,MAAMA,mBAAmB,OAC5BC,iBACAC,QAA0B,CAAC,CAAC;IAE5B,MAAMC,kBAAkB,MAAMF,gBAAgB,cAAc,CAAiB;IAE7E,MAAMG,0BAA0BD,gBAAgB,MAAM,CAACE,CAAAA;QACnD,IAAIH,MAAM,GAAG,IAAI,CAACI,OAAOD,SAASH,MAAM,GAAG,GACvC,OAAO;QAGX,OAAO;IACX;IAEA,IAAIE,AAAmC,MAAnCA,wBAAwB,MAAM,EAC9B,MAAM,IAAIG;IAGd,OAAOH;AACX;AAEA,MAAME,SAAS,CAACE,sBAAyDC;IACrE,IAAI,CAACC,MAAM,OAAO,CAACF,uBACfA,uBAAuB;QAACA;KAAqB;IAGjD,IAAI,CAACC,KACD,OAAO;IAIX,MAAME,mCAAmCH,qBAAqB,IAAI,CAACI,CAAAA,aACxD,AAA0B,YAA1B,OAAOA,WAAW,GAAG;IAGhC,IAAID,kCACA,OAAO;IAIX,OAAOH,qBAAqB,IAAI,CAACI,CAAAA,aACtBA,WAAW,GAAG,IAAIA,WAAW,GAAG,CAAC,QAAQ,CAACH;AAEzD"}
package/graphql/schema.js CHANGED
@@ -1,4 +1,4 @@
1
- import pMap from "p-map";
1
+ import p_map from "p-map";
2
2
  import { createGraphQLSchemaPlugin } from "@webiny/handler-graphql";
3
3
  import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
4
4
  import { S3 } from "@webiny/aws-sdk/client-s3/index.js";
@@ -10,9 +10,8 @@ import { CompleteMultiPartUploadUseCase } from "../multiPartUpload/CompleteMulti
10
10
  import { createFileNormalizerFromContext } from "../utils/createFileNormalizerFromContext.js";
11
11
  import { GetSettingsUseCase } from "@webiny/api-file-manager/features/settings/GetSettings/abstractions.js";
12
12
  import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
13
- export const createS3GraphQLSchema = () => {
14
- return createGraphQLSchemaPlugin({
15
- typeDefs: /* GraphQL */`
13
+ const createS3GraphQLSchema = ()=>createGraphQLSchemaPlugin({
14
+ typeDefs: `
16
15
  type UploadFileResponseDataFile {
17
16
  id: ID!
18
17
  name: String!
@@ -101,104 +100,102 @@ export const createS3GraphQLSchema = () => {
101
100
  ): CompleteMultiPartUploadResponse
102
101
  }
103
102
  `,
104
- resolvers: {
105
- FmQuery: {
106
- getPreSignedPostPayload: async (_, args, context) => {
107
- const identityContext = context.container.resolve(IdentityContext);
108
- const getSettings = context.container.resolve(GetSettingsUseCase);
109
- try {
110
- await checkPermissions(identityContext, {
111
- rwd: "w"
112
- });
113
- const data = args.data;
114
- const settingsResult = await getSettings.execute();
115
- const settings = settingsResult.value;
116
- const normalizer = createFileNormalizerFromContext(context);
117
- const presignedPayload = await getPresignedPostPayload(await normalizer.normalizeFile(data), settings, context.container.resolve(TenantContext));
118
- return new Response(presignedPayload);
119
- } catch (e) {
120
- return new ErrorResponse({
121
- message: e.message,
122
- code: e.code,
123
- data: e.data
124
- });
125
- }
126
- },
127
- getPreSignedPostPayloads: async (_, args, context) => {
128
- const identityContext = context.container.resolve(IdentityContext);
129
- const getSettings = context.container.resolve(GetSettingsUseCase);
130
- await checkPermissions(identityContext, {
131
- rwd: "w"
132
- });
133
- const files = args.data;
134
- try {
135
- const settingsResult = await getSettings.execute();
136
- const settings = settingsResult.value;
137
- const normalizer = createFileNormalizerFromContext(context);
138
- const presignedPayloads = await pMap(files, async data => {
139
- return getPresignedPostPayload(await normalizer.normalizeFile(data), settings, context.container.resolve(TenantContext));
140
- });
141
- return new Response(presignedPayloads);
142
- } catch (e) {
143
- return new ErrorResponse({
144
- message: e.message,
145
- code: e.code,
146
- data: e.data
147
- });
148
- }
149
- }
150
- },
151
- FmMutation: {
152
- createMultiPartUpload: async (_, args, context) => {
153
- const identityContext = context.container.resolve(IdentityContext);
154
- await checkPermissions(identityContext, {
155
- rwd: "w"
156
- });
157
- const s3Client = new S3({
158
- region: process.env.AWS_REGION
159
- });
160
- try {
161
- const useCase = new CreateMultiPartUploadUseCase(String(process.env.S3_BUCKET), s3Client);
162
- const normalizer = createFileNormalizerFromContext(context);
163
- const multiPartUpload = await useCase.execute({
164
- file: await normalizer.normalizeFile(args.data),
165
- numberOfParts: args.numberOfParts
166
- });
167
- return new Response(multiPartUpload);
168
- } catch (e) {
169
- return new ErrorResponse({
170
- message: e.message,
171
- code: e.code,
172
- data: e.data
173
- });
174
- }
175
- },
176
- completeMultiPartUpload: async (_, args, context) => {
177
- const identityContext = context.container.resolve(IdentityContext);
178
- await checkPermissions(identityContext, {
179
- rwd: "w"
180
- });
181
- const s3Client = new S3({
182
- region: process.env.AWS_REGION
183
- });
184
- try {
185
- const useCase = new CompleteMultiPartUploadUseCase(String(process.env.S3_BUCKET), s3Client);
186
- await useCase.execute({
187
- fileKey: args.fileKey,
188
- uploadId: args.uploadId
189
- });
190
- return new Response(true);
191
- } catch (e) {
192
- return new ErrorResponse({
193
- message: e.message,
194
- code: e.code,
195
- data: e.data
196
- });
197
- }
103
+ resolvers: {
104
+ FmQuery: {
105
+ getPreSignedPostPayload: async (_, args, context)=>{
106
+ const identityContext = context.container.resolve(IdentityContext);
107
+ const getSettings = context.container.resolve(GetSettingsUseCase);
108
+ try {
109
+ await checkPermissions(identityContext, {
110
+ rwd: "w"
111
+ });
112
+ const data = args.data;
113
+ const settingsResult = await getSettings.execute();
114
+ const settings = settingsResult.value;
115
+ const normalizer = createFileNormalizerFromContext(context);
116
+ const presignedPayload = await getPresignedPostPayload(await normalizer.normalizeFile(data), settings, context.container.resolve(TenantContext));
117
+ return new Response(presignedPayload);
118
+ } catch (e) {
119
+ return new ErrorResponse({
120
+ message: e.message,
121
+ code: e.code,
122
+ data: e.data
123
+ });
124
+ }
125
+ },
126
+ getPreSignedPostPayloads: async (_, args, context)=>{
127
+ const identityContext = context.container.resolve(IdentityContext);
128
+ const getSettings = context.container.resolve(GetSettingsUseCase);
129
+ await checkPermissions(identityContext, {
130
+ rwd: "w"
131
+ });
132
+ const files = args.data;
133
+ try {
134
+ const settingsResult = await getSettings.execute();
135
+ const settings = settingsResult.value;
136
+ const normalizer = createFileNormalizerFromContext(context);
137
+ const presignedPayloads = await p_map(files, async (data)=>getPresignedPostPayload(await normalizer.normalizeFile(data), settings, context.container.resolve(TenantContext)));
138
+ return new Response(presignedPayloads);
139
+ } catch (e) {
140
+ return new ErrorResponse({
141
+ message: e.message,
142
+ code: e.code,
143
+ data: e.data
144
+ });
145
+ }
146
+ }
147
+ },
148
+ FmMutation: {
149
+ createMultiPartUpload: async (_, args, context)=>{
150
+ const identityContext = context.container.resolve(IdentityContext);
151
+ await checkPermissions(identityContext, {
152
+ rwd: "w"
153
+ });
154
+ const s3Client = new S3({
155
+ region: process.env.AWS_REGION
156
+ });
157
+ try {
158
+ const useCase = new CreateMultiPartUploadUseCase(String(process.env.S3_BUCKET), s3Client);
159
+ const normalizer = createFileNormalizerFromContext(context);
160
+ const multiPartUpload = await useCase.execute({
161
+ file: await normalizer.normalizeFile(args.data),
162
+ numberOfParts: args.numberOfParts
163
+ });
164
+ return new Response(multiPartUpload);
165
+ } catch (e) {
166
+ return new ErrorResponse({
167
+ message: e.message,
168
+ code: e.code,
169
+ data: e.data
170
+ });
171
+ }
172
+ },
173
+ completeMultiPartUpload: async (_, args, context)=>{
174
+ const identityContext = context.container.resolve(IdentityContext);
175
+ await checkPermissions(identityContext, {
176
+ rwd: "w"
177
+ });
178
+ const s3Client = new S3({
179
+ region: process.env.AWS_REGION
180
+ });
181
+ try {
182
+ const useCase = new CompleteMultiPartUploadUseCase(String(process.env.S3_BUCKET), s3Client);
183
+ await useCase.execute({
184
+ fileKey: args.fileKey,
185
+ uploadId: args.uploadId
186
+ });
187
+ return new Response(true);
188
+ } catch (e) {
189
+ return new ErrorResponse({
190
+ message: e.message,
191
+ code: e.code,
192
+ data: e.data
193
+ });
194
+ }
195
+ }
196
+ }
198
197
  }
199
- }
200
- }
201
- });
202
- };
198
+ });
199
+ export { createS3GraphQLSchema };
203
200
 
204
201
  //# sourceMappingURL=schema.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["pMap","createGraphQLSchemaPlugin","IdentityContext","S3","ErrorResponse","Response","getPresignedPostPayload","checkPermissions","CreateMultiPartUploadUseCase","CompleteMultiPartUploadUseCase","createFileNormalizerFromContext","GetSettingsUseCase","TenantContext","createS3GraphQLSchema","typeDefs","resolvers","FmQuery","getPreSignedPostPayload","_","args","context","identityContext","container","resolve","getSettings","rwd","data","settingsResult","execute","settings","value","normalizer","presignedPayload","normalizeFile","e","message","code","getPreSignedPostPayloads","files","presignedPayloads","FmMutation","createMultiPartUpload","s3Client","region","process","env","AWS_REGION","useCase","String","S3_BUCKET","multiPartUpload","file","numberOfParts","completeMultiPartUpload","fileKey","uploadId"],"sources":["schema.ts"],"sourcesContent":["import pMap from \"p-map\";\nimport { createGraphQLSchemaPlugin } from \"@webiny/handler-graphql\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport { ErrorResponse, Response } from \"@webiny/handler-graphql/responses.js\";\nimport { getPresignedPostPayload } from \"~/utils/getPresignedPostPayload.js\";\nimport { checkPermissions } from \"./checkPermissions.js\";\nimport type { PresignedPostPayloadData } from \"~/types.js\";\nimport { CreateMultiPartUploadUseCase } from \"~/multiPartUpload/CreateMultiPartUploadUseCase.js\";\nimport { CompleteMultiPartUploadUseCase } from \"~/multiPartUpload/CompleteMultiPartUploadUseCase.js\";\nimport { createFileNormalizerFromContext } from \"~/utils/createFileNormalizerFromContext.js\";\nimport { GetSettingsUseCase } from \"@webiny/api-file-manager/features/settings/GetSettings/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\n\nexport const createS3GraphQLSchema = () => {\n return createGraphQLSchemaPlugin({\n typeDefs: /* GraphQL */ `\n type UploadFileResponseDataFile {\n id: ID!\n name: String!\n type: String!\n size: Long!\n key: String!\n }\n\n input PreSignedPostPayloadInput {\n id: ID\n name: String!\n type: String!\n size: Long!\n key: String\n keyPrefix: String\n }\n\n type GetPreSignedPostPayloadResponseDataFile {\n id: ID!\n name: String!\n type: String!\n size: Long!\n key: String!\n }\n\n type GetPreSignedPostPayloadResponseData {\n # Contains data that is necessary for initiating a file upload.\n data: JSON!\n file: UploadFileResponseDataFile!\n }\n\n type GetPreSignedPostPayloadResponse {\n error: FmError\n data: GetPreSignedPostPayloadResponseData\n }\n\n type MultiPartUploadFilePart {\n partNumber: Int!\n url: String!\n }\n\n type CreateMultiPartUploadResponseData {\n file: GetPreSignedPostPayloadResponseDataFile!\n uploadId: String!\n parts: [MultiPartUploadFilePart!]!\n }\n\n type CompleteMultiPartUploadResponse {\n data: Boolean\n error: FmError\n }\n\n type GetPreSignedPostPayloadsResponse {\n error: FmError\n data: [GetPreSignedPostPayloadResponseData!]!\n }\n\n extend type FmQuery {\n getPreSignedPostPayload(\n data: PreSignedPostPayloadInput!\n ): GetPreSignedPostPayloadResponse\n getPreSignedPostPayloads(\n data: [PreSignedPostPayloadInput]!\n ): GetPreSignedPostPayloadsResponse\n }\n\n type CreateMultiPartUploadResponse {\n data: CreateMultiPartUploadResponseData\n error: FmError\n }\n\n input MultiPartUploadFilePartInput {\n partNumber: Int!\n etag: String!\n }\n\n extend type FmMutation {\n createMultiPartUpload(\n data: PreSignedPostPayloadInput!\n numberOfParts: Number!\n ): CreateMultiPartUploadResponse\n\n completeMultiPartUpload(\n fileKey: String!\n uploadId: String!\n ): CompleteMultiPartUploadResponse\n }\n `,\n resolvers: {\n FmQuery: {\n getPreSignedPostPayload: async (_, args: any, context) => {\n const identityContext = context.container.resolve(IdentityContext);\n const getSettings = context.container.resolve(GetSettingsUseCase);\n\n try {\n await checkPermissions(identityContext, { rwd: \"w\" });\n\n const data = args.data as PresignedPostPayloadData;\n\n const settingsResult = await getSettings.execute();\n const settings = settingsResult.value;\n\n const normalizer = createFileNormalizerFromContext(context);\n const presignedPayload = await getPresignedPostPayload(\n await normalizer.normalizeFile(data),\n settings,\n context.container.resolve(TenantContext)\n );\n\n return new Response(presignedPayload);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n },\n getPreSignedPostPayloads: async (_, args, context) => {\n const identityContext = context.container.resolve(IdentityContext);\n const getSettings = context.container.resolve(GetSettingsUseCase);\n await checkPermissions(identityContext, { rwd: \"w\" });\n\n const files = args.data as PresignedPostPayloadData[];\n\n try {\n const settingsResult = await getSettings.execute();\n const settings = settingsResult.value;\n\n const normalizer = createFileNormalizerFromContext(context);\n\n const presignedPayloads = await pMap(files, async data => {\n return getPresignedPostPayload(\n await normalizer.normalizeFile(data),\n settings,\n context.container.resolve(TenantContext)\n );\n });\n\n return new Response(presignedPayloads);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n }\n },\n FmMutation: {\n createMultiPartUpload: async (_, args, context) => {\n const identityContext = context.container.resolve(IdentityContext);\n await checkPermissions(identityContext, { rwd: \"w\" });\n\n const s3Client = new S3({\n region: process.env.AWS_REGION\n });\n\n try {\n const useCase = new CreateMultiPartUploadUseCase(\n String(process.env.S3_BUCKET),\n s3Client\n );\n\n const normalizer = createFileNormalizerFromContext(context);\n\n const multiPartUpload = await useCase.execute({\n file: await normalizer.normalizeFile(args.data),\n numberOfParts: args.numberOfParts\n });\n\n return new Response(multiPartUpload);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n },\n completeMultiPartUpload: async (_, args, context) => {\n const identityContext = context.container.resolve(IdentityContext);\n await checkPermissions(identityContext, { rwd: \"w\" });\n\n const s3Client = new S3({\n region: process.env.AWS_REGION\n });\n\n try {\n const useCase = new CompleteMultiPartUploadUseCase(\n String(process.env.S3_BUCKET),\n s3Client\n );\n\n await useCase.execute({\n fileKey: args.fileKey,\n uploadId: args.uploadId\n });\n\n return new Response(true);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n }\n }\n }\n });\n};\n"],"mappings":"AAAA,OAAOA,IAAI,MAAM,OAAO;AACxB,SAASC,yBAAyB,QAAQ,yBAAyB;AACnE,SAASC,eAAe,QAAQ,6DAA6D;AAC7F,SAASC,EAAE,QAAQ,oCAAoC;AACvD,SAASC,aAAa,EAAEC,QAAQ,QAAQ,sCAAsC;AAC9E,SAASC,uBAAuB;AAChC,SAASC,gBAAgB;AAEzB,SAASC,4BAA4B;AACrC,SAASC,8BAA8B;AACvC,SAASC,+BAA+B;AACxC,SAASC,kBAAkB,QAAQ,wEAAwE;AAC3G,SAASC,aAAa,QAAQ,0DAA0D;AAExF,OAAO,MAAMC,qBAAqB,GAAGA,CAAA,KAAM;EACvC,OAAOZ,yBAAyB,CAAC;IAC7Ba,QAAQ,EAAE,aAAc;AAChC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;IACDC,SAAS,EAAE;MACPC,OAAO,EAAE;QACLC,uBAAuB,EAAE,MAAAA,CAAOC,CAAC,EAAEC,IAAS,EAAEC,OAAO,KAAK;UACtD,MAAMC,eAAe,GAAGD,OAAO,CAACE,SAAS,CAACC,OAAO,CAACrB,eAAe,CAAC;UAClE,MAAMsB,WAAW,GAAGJ,OAAO,CAACE,SAAS,CAACC,OAAO,CAACZ,kBAAkB,CAAC;UAEjE,IAAI;YACA,MAAMJ,gBAAgB,CAACc,eAAe,EAAE;cAAEI,GAAG,EAAE;YAAI,CAAC,CAAC;YAErD,MAAMC,IAAI,GAAGP,IAAI,CAACO,IAAgC;YAElD,MAAMC,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","ignoreList":[]}
1
+ {"version":3,"file":"graphql/schema.js","sources":["../../src/graphql/schema.ts"],"sourcesContent":["import pMap from \"p-map\";\nimport { createGraphQLSchemaPlugin } from \"@webiny/handler-graphql\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport { ErrorResponse, Response } from \"@webiny/handler-graphql/responses.js\";\nimport { getPresignedPostPayload } from \"~/utils/getPresignedPostPayload.js\";\nimport { checkPermissions } from \"./checkPermissions.js\";\nimport type { PresignedPostPayloadData } from \"~/types.js\";\nimport { CreateMultiPartUploadUseCase } from \"~/multiPartUpload/CreateMultiPartUploadUseCase.js\";\nimport { CompleteMultiPartUploadUseCase } from \"~/multiPartUpload/CompleteMultiPartUploadUseCase.js\";\nimport { createFileNormalizerFromContext } from \"~/utils/createFileNormalizerFromContext.js\";\nimport { GetSettingsUseCase } from \"@webiny/api-file-manager/features/settings/GetSettings/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\n\nexport const createS3GraphQLSchema = () => {\n return createGraphQLSchemaPlugin({\n typeDefs: /* GraphQL */ `\n type UploadFileResponseDataFile {\n id: ID!\n name: String!\n type: String!\n size: Long!\n key: String!\n }\n\n input PreSignedPostPayloadInput {\n id: ID\n name: String!\n type: String!\n size: Long!\n key: String\n keyPrefix: String\n }\n\n type GetPreSignedPostPayloadResponseDataFile {\n id: ID!\n name: String!\n type: String!\n size: Long!\n key: String!\n }\n\n type GetPreSignedPostPayloadResponseData {\n # Contains data that is necessary for initiating a file upload.\n data: JSON!\n file: UploadFileResponseDataFile!\n }\n\n type GetPreSignedPostPayloadResponse {\n error: FmError\n data: GetPreSignedPostPayloadResponseData\n }\n\n type MultiPartUploadFilePart {\n partNumber: Int!\n url: String!\n }\n\n type CreateMultiPartUploadResponseData {\n file: GetPreSignedPostPayloadResponseDataFile!\n uploadId: String!\n parts: [MultiPartUploadFilePart!]!\n }\n\n type CompleteMultiPartUploadResponse {\n data: Boolean\n error: FmError\n }\n\n type GetPreSignedPostPayloadsResponse {\n error: FmError\n data: [GetPreSignedPostPayloadResponseData!]!\n }\n\n extend type FmQuery {\n getPreSignedPostPayload(\n data: PreSignedPostPayloadInput!\n ): GetPreSignedPostPayloadResponse\n getPreSignedPostPayloads(\n data: [PreSignedPostPayloadInput]!\n ): GetPreSignedPostPayloadsResponse\n }\n\n type CreateMultiPartUploadResponse {\n data: CreateMultiPartUploadResponseData\n error: FmError\n }\n\n input MultiPartUploadFilePartInput {\n partNumber: Int!\n etag: String!\n }\n\n extend type FmMutation {\n createMultiPartUpload(\n data: PreSignedPostPayloadInput!\n numberOfParts: Number!\n ): CreateMultiPartUploadResponse\n\n completeMultiPartUpload(\n fileKey: String!\n uploadId: String!\n ): CompleteMultiPartUploadResponse\n }\n `,\n resolvers: {\n FmQuery: {\n getPreSignedPostPayload: async (_, args: any, context) => {\n const identityContext = context.container.resolve(IdentityContext);\n const getSettings = context.container.resolve(GetSettingsUseCase);\n\n try {\n await checkPermissions(identityContext, { rwd: \"w\" });\n\n const data = args.data as PresignedPostPayloadData;\n\n const settingsResult = await getSettings.execute();\n const settings = settingsResult.value;\n\n const normalizer = createFileNormalizerFromContext(context);\n const presignedPayload = await getPresignedPostPayload(\n await normalizer.normalizeFile(data),\n settings,\n context.container.resolve(TenantContext)\n );\n\n return new Response(presignedPayload);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n },\n getPreSignedPostPayloads: async (_, args, context) => {\n const identityContext = context.container.resolve(IdentityContext);\n const getSettings = context.container.resolve(GetSettingsUseCase);\n await checkPermissions(identityContext, { rwd: \"w\" });\n\n const files = args.data as PresignedPostPayloadData[];\n\n try {\n const settingsResult = await getSettings.execute();\n const settings = settingsResult.value;\n\n const normalizer = createFileNormalizerFromContext(context);\n\n const presignedPayloads = await pMap(files, async data => {\n return getPresignedPostPayload(\n await normalizer.normalizeFile(data),\n settings,\n context.container.resolve(TenantContext)\n );\n });\n\n return new Response(presignedPayloads);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n }\n },\n FmMutation: {\n createMultiPartUpload: async (_, args, context) => {\n const identityContext = context.container.resolve(IdentityContext);\n await checkPermissions(identityContext, { rwd: \"w\" });\n\n const s3Client = new S3({\n region: process.env.AWS_REGION\n });\n\n try {\n const useCase = new CreateMultiPartUploadUseCase(\n String(process.env.S3_BUCKET),\n s3Client\n );\n\n const normalizer = createFileNormalizerFromContext(context);\n\n const multiPartUpload = await useCase.execute({\n file: await normalizer.normalizeFile(args.data),\n numberOfParts: args.numberOfParts\n });\n\n return new Response(multiPartUpload);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n },\n completeMultiPartUpload: async (_, args, context) => {\n const identityContext = context.container.resolve(IdentityContext);\n await checkPermissions(identityContext, { rwd: \"w\" });\n\n const s3Client = new S3({\n region: process.env.AWS_REGION\n });\n\n try {\n const useCase = new CompleteMultiPartUploadUseCase(\n String(process.env.S3_BUCKET),\n s3Client\n );\n\n await useCase.execute({\n fileKey: args.fileKey,\n uploadId: args.uploadId\n });\n\n return new Response(true);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n }\n }\n }\n });\n};\n"],"names":["createS3GraphQLSchema","createGraphQLSchemaPlugin","_","args","context","identityContext","IdentityContext","getSettings","GetSettingsUseCase","checkPermissions","data","settingsResult","settings","normalizer","createFileNormalizerFromContext","presignedPayload","getPresignedPostPayload","TenantContext","Response","e","ErrorResponse","files","presignedPayloads","pMap","s3Client","S3","process","useCase","CreateMultiPartUploadUseCase","String","multiPartUpload","CompleteMultiPartUploadUseCase"],"mappings":"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"}
package/index.js CHANGED
@@ -6,20 +6,26 @@ import { WriteFileMetadataFeature } from "./features/WriteFileMetadata/feature.j
6
6
  import { ApplyThreatScanningFeature } from "./enterprise/ApplyThreatScanning/feature.js";
7
7
  import { FlushCacheFeature } from "./features/FlushCache/feature.js";
8
8
  import { ExtractMetadataFeature } from "./features/ExtractMetadata/feature.js";
9
+ import { GetFileContentsByIdFeature } from "./features/GetFileContentsById/feature.js";
10
+ import { GetFileContentsByKeyFeature } from "./features/GetFileContentsByKey/feature.js";
11
+ const contextPlugin = new ContextPlugin((context)=>{
12
+ const container = context.container;
13
+ FlushCacheFeature.register(container);
14
+ DeleteFileFromBucketFeature.register(container);
15
+ ExtractMetadataFeature.register(container);
16
+ WriteFileMetadataFeature.register(container);
17
+ GetFileContentsByIdFeature.register(container);
18
+ GetFileContentsByKeyFeature.register(container);
19
+ const wcp = container.resolve(WcpContext);
20
+ if (wcp.canUseFileManagerThreatDetection()) ApplyThreatScanningFeature.register(container);
21
+ });
22
+ contextPlugin.name = "fileManagerS3.context";
23
+ const createFileManagerS3 = ()=>[
24
+ contextPlugin,
25
+ createS3GraphQLSchema()
26
+ ];
9
27
  export { createFileUploadModifier } from "./utils/FileUploadModifier.js";
10
28
  export { createAssetDelivery } from "./assetDelivery/createAssetDelivery.js";
11
- const contextPlugin = new ContextPlugin(context => {
12
- const container = context.container;
13
- FlushCacheFeature.register(container);
14
- DeleteFileFromBucketFeature.register(container);
15
- ExtractMetadataFeature.register(container);
16
- WriteFileMetadataFeature.register(container);
17
- const wcp = container.resolve(WcpContext);
18
- if (wcp.canUseFileManagerThreatDetection()) {
19
- ApplyThreatScanningFeature.register(container);
20
- }
21
- });
22
- contextPlugin.name = `fileManagerS3.context`;
23
- export const createFileManagerS3 = () => [contextPlugin, createS3GraphQLSchema()];
29
+ export { createFileManagerS3 };
24
30
 
25
31
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["ContextPlugin","WcpContext","createS3GraphQLSchema","DeleteFileFromBucketFeature","WriteFileMetadataFeature","ApplyThreatScanningFeature","FlushCacheFeature","ExtractMetadataFeature","createFileUploadModifier","createAssetDelivery","contextPlugin","context","container","register","wcp","resolve","canUseFileManagerThreatDetection","name","createFileManagerS3"],"sources":["index.ts"],"sourcesContent":["import { ContextPlugin } from \"@webiny/api\";\nimport { WcpContext } from \"@webiny/api-core/features/wcp/WcpContext/index.js\";\nimport { createS3GraphQLSchema } from \"./graphql/schema.js\";\nimport { DeleteFileFromBucketFeature } from \"~/features/DeleteFileFromBucket/feature.js\";\nimport { WriteFileMetadataFeature } from \"~/features/WriteFileMetadata/feature.js\";\nimport { ApplyThreatScanningFeature } from \"~/enterprise/ApplyThreatScanning/feature.js\";\nimport { FlushCacheFeature } from \"~/features/FlushCache/feature.js\";\nimport { ExtractMetadataFeature } from \"~/features/ExtractMetadata/feature.js\";\nexport { createFileUploadModifier } from \"./utils/FileUploadModifier.js\";\nexport { createAssetDelivery } from \"./assetDelivery/createAssetDelivery.js\";\n\nconst contextPlugin = new ContextPlugin(context => {\n const container = context.container;\n\n FlushCacheFeature.register(container);\n DeleteFileFromBucketFeature.register(container);\n ExtractMetadataFeature.register(container);\n WriteFileMetadataFeature.register(container);\n\n const wcp = container.resolve(WcpContext);\n if (wcp.canUseFileManagerThreatDetection()) {\n ApplyThreatScanningFeature.register(container);\n }\n});\n\ncontextPlugin.name = `fileManagerS3.context`;\n\nexport const createFileManagerS3 = () => [contextPlugin, createS3GraphQLSchema()];\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,aAAa;AAC3C,SAASC,UAAU,QAAQ,mDAAmD;AAC9E,SAASC,qBAAqB;AAC9B,SAASC,2BAA2B;AACpC,SAASC,wBAAwB;AACjC,SAASC,0BAA0B;AACnC,SAASC,iBAAiB;AAC1B,SAASC,sBAAsB;AAC/B,SAASC,wBAAwB;AACjC,SAASC,mBAAmB;AAE5B,MAAMC,aAAa,GAAG,IAAIV,aAAa,CAACW,OAAO,IAAI;EAC/C,MAAMC,SAAS,GAAGD,OAAO,CAACC,SAAS;EAEnCN,iBAAiB,CAACO,QAAQ,CAACD,SAAS,CAAC;EACrCT,2BAA2B,CAACU,QAAQ,CAACD,SAAS,CAAC;EAC/CL,sBAAsB,CAACM,QAAQ,CAACD,SAAS,CAAC;EAC1CR,wBAAwB,CAACS,QAAQ,CAACD,SAAS,CAAC;EAE5C,MAAME,GAAG,GAAGF,SAAS,CAACG,OAAO,CAACd,UAAU,CAAC;EACzC,IAAIa,GAAG,CAACE,gCAAgC,CAAC,CAAC,EAAE;IACxCX,0BAA0B,CAACQ,QAAQ,CAACD,SAAS,CAAC;EAClD;AACJ,CAAC,CAAC;AAEFF,aAAa,CAACO,IAAI,GAAG,uBAAuB;AAE5C,OAAO,MAAMC,mBAAmB,GAAGA,CAAA,KAAM,CAACR,aAAa,EAAER,qBAAqB,CAAC,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { ContextPlugin } from \"@webiny/api\";\nimport { WcpContext } from \"@webiny/api-core/features/wcp/WcpContext/index.js\";\nimport { createS3GraphQLSchema } from \"./graphql/schema.js\";\nimport { DeleteFileFromBucketFeature } from \"~/features/DeleteFileFromBucket/feature.js\";\nimport { WriteFileMetadataFeature } from \"~/features/WriteFileMetadata/feature.js\";\nimport { ApplyThreatScanningFeature } from \"~/enterprise/ApplyThreatScanning/feature.js\";\nimport { FlushCacheFeature } from \"~/features/FlushCache/feature.js\";\nimport { ExtractMetadataFeature } from \"~/features/ExtractMetadata/feature.js\";\nimport { GetFileContentsByIdFeature } from \"~/features/GetFileContentsById/feature.js\";\nimport { GetFileContentsByKeyFeature } from \"~/features/GetFileContentsByKey/feature.js\";\nexport { createFileUploadModifier } from \"./utils/FileUploadModifier.js\";\nexport { createAssetDelivery } from \"./assetDelivery/createAssetDelivery.js\";\n\nconst contextPlugin = new ContextPlugin(context => {\n const container = context.container;\n\n FlushCacheFeature.register(container);\n DeleteFileFromBucketFeature.register(container);\n ExtractMetadataFeature.register(container);\n WriteFileMetadataFeature.register(container);\n GetFileContentsByIdFeature.register(container);\n GetFileContentsByKeyFeature.register(container);\n\n const wcp = container.resolve(WcpContext);\n if (wcp.canUseFileManagerThreatDetection()) {\n ApplyThreatScanningFeature.register(container);\n }\n});\n\ncontextPlugin.name = `fileManagerS3.context`;\n\nexport const createFileManagerS3 = () => [contextPlugin, createS3GraphQLSchema()];\n"],"names":["contextPlugin","ContextPlugin","context","container","FlushCacheFeature","DeleteFileFromBucketFeature","ExtractMetadataFeature","WriteFileMetadataFeature","GetFileContentsByIdFeature","GetFileContentsByKeyFeature","wcp","WcpContext","ApplyThreatScanningFeature","createFileManagerS3","createS3GraphQLSchema"],"mappings":";;;;;;;;;;AAaA,MAAMA,gBAAgB,IAAIC,cAAcC,CAAAA;IACpC,MAAMC,YAAYD,QAAQ,SAAS;IAEnCE,kBAAkB,QAAQ,CAACD;IAC3BE,4BAA4B,QAAQ,CAACF;IACrCG,uBAAuB,QAAQ,CAACH;IAChCI,yBAAyB,QAAQ,CAACJ;IAClCK,2BAA2B,QAAQ,CAACL;IACpCM,4BAA4B,QAAQ,CAACN;IAErC,MAAMO,MAAMP,UAAU,OAAO,CAACQ;IAC9B,IAAID,IAAI,gCAAgC,IACpCE,2BAA2B,QAAQ,CAACT;AAE5C;AAEAH,cAAc,IAAI,GAAG;AAEd,MAAMa,sBAAsB,IAAM;QAACb;QAAec;KAAwB"}
@@ -1,58 +1,55 @@
1
- import { ListPartsCommand, CompleteMultipartUploadCommand } from "@webiny/aws-sdk/client-s3/index.js";
2
- export class CompleteMultiPartUploadUseCase {
3
- emptyMarkerValues = [undefined, "0"];
4
- constructor(bucket, s3Client) {
5
- this.bucket = bucket;
6
- this.s3 = s3Client;
7
- }
8
- async execute(params) {
9
- const uploadParams = {
10
- Bucket: this.bucket,
11
- Key: params.fileKey,
12
- UploadId: params.uploadId
13
- };
14
- const allParts = await this.getAllUploadParts(uploadParams);
15
- const s3Params = {
16
- ...uploadParams,
17
- MultipartUpload: {
18
- Parts: allParts
19
- }
20
- };
21
- try {
22
- const command = new CompleteMultipartUploadCommand(s3Params);
23
- await this.s3.send(command);
24
- } catch (err) {
25
- console.error(err);
26
- throw err;
1
+ import { CompleteMultipartUploadCommand, ListPartsCommand } from "@webiny/aws-sdk/client-s3/index.js";
2
+ class CompleteMultiPartUploadUseCase {
3
+ constructor(bucket, s3Client){
4
+ this.emptyMarkerValues = [
5
+ void 0,
6
+ "0"
7
+ ];
8
+ this.bucket = bucket;
9
+ this.s3 = s3Client;
27
10
  }
28
- }
29
- async getAllUploadParts(params) {
30
- const parts = [];
31
- let marker = undefined;
32
- while (true) {
33
- const {
34
- Parts,
35
- PartNumberMarker
36
- } = await this.s3.send(new ListPartsCommand({
37
- ...params,
38
- PartNumberMarker: marker
39
- }));
40
- if (Parts) {
41
- Parts.forEach(part => parts.push(part));
42
- }
43
- marker = PartNumberMarker || undefined;
44
- if (this.isMarkerEmpty(marker)) {
45
- break;
46
- }
11
+ async execute(params) {
12
+ const uploadParams = {
13
+ Bucket: this.bucket,
14
+ Key: params.fileKey,
15
+ UploadId: params.uploadId
16
+ };
17
+ const allParts = await this.getAllUploadParts(uploadParams);
18
+ const s3Params = {
19
+ ...uploadParams,
20
+ MultipartUpload: {
21
+ Parts: allParts
22
+ }
23
+ };
24
+ try {
25
+ const command = new CompleteMultipartUploadCommand(s3Params);
26
+ await this.s3.send(command);
27
+ } catch (err) {
28
+ console.error(err);
29
+ throw err;
30
+ }
31
+ }
32
+ async getAllUploadParts(params) {
33
+ const parts = [];
34
+ let marker;
35
+ while(true){
36
+ const { Parts, PartNumberMarker } = await this.s3.send(new ListPartsCommand({
37
+ ...params,
38
+ PartNumberMarker: marker
39
+ }));
40
+ if (Parts) Parts.forEach((part)=>parts.push(part));
41
+ marker = PartNumberMarker || void 0;
42
+ if (this.isMarkerEmpty(marker)) break;
43
+ }
44
+ return parts.map((part)=>({
45
+ ETag: part.ETag,
46
+ PartNumber: part.PartNumber
47
+ }));
48
+ }
49
+ isMarkerEmpty(marker) {
50
+ return this.emptyMarkerValues.includes(marker);
47
51
  }
48
- return parts.map(part => ({
49
- ETag: part.ETag,
50
- PartNumber: part.PartNumber
51
- }));
52
- }
53
- isMarkerEmpty(marker) {
54
- return this.emptyMarkerValues.includes(marker);
55
- }
56
52
  }
53
+ export { CompleteMultiPartUploadUseCase };
57
54
 
58
55
  //# sourceMappingURL=CompleteMultiPartUploadUseCase.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["ListPartsCommand","CompleteMultipartUploadCommand","CompleteMultiPartUploadUseCase","emptyMarkerValues","undefined","constructor","bucket","s3Client","s3","execute","params","uploadParams","Bucket","Key","fileKey","UploadId","uploadId","allParts","getAllUploadParts","s3Params","MultipartUpload","Parts","command","send","err","console","error","parts","marker","PartNumberMarker","forEach","part","push","isMarkerEmpty","map","ETag","PartNumber","includes"],"sources":["CompleteMultiPartUploadUseCase.ts"],"sourcesContent":["import type { S3, Part, ListPartsOutput } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport {\n ListPartsCommand,\n CompleteMultipartUploadCommand\n} from \"@webiny/aws-sdk/client-s3/index.js\";\n\ninterface CompleteMultiPartUploadParams {\n fileKey: string;\n uploadId: string;\n}\n\ninterface GetAllUploadPartsParams {\n Bucket: string;\n Key: string;\n UploadId: string;\n}\n\nexport class CompleteMultiPartUploadUseCase {\n private readonly s3: S3;\n private readonly bucket: string;\n private readonly emptyMarkerValues = [undefined, \"0\"];\n\n constructor(bucket: string, s3Client: S3) {\n this.bucket = bucket;\n this.s3 = s3Client;\n }\n\n async execute(params: CompleteMultiPartUploadParams) {\n const uploadParams = {\n Bucket: this.bucket,\n Key: params.fileKey,\n UploadId: params.uploadId\n };\n\n const allParts = await this.getAllUploadParts(uploadParams);\n\n const s3Params = {\n ...uploadParams,\n MultipartUpload: {\n Parts: allParts\n }\n };\n\n try {\n const command = new CompleteMultipartUploadCommand(s3Params);\n await this.s3.send(command);\n } catch (err) {\n console.error(err);\n throw err;\n }\n }\n\n private async getAllUploadParts(params: GetAllUploadPartsParams) {\n const parts: Part[] = [];\n\n let marker: string | undefined = undefined;\n while (true) {\n const { Parts, PartNumberMarker }: ListPartsOutput = await this.s3.send(\n new ListPartsCommand({\n ...params,\n PartNumberMarker: marker\n })\n );\n\n if (Parts) {\n Parts.forEach(part => parts.push(part));\n }\n\n marker = PartNumberMarker || undefined;\n if (this.isMarkerEmpty(marker)) {\n break;\n }\n }\n\n return parts.map(part => ({\n ETag: part.ETag as string,\n PartNumber: part.PartNumber as number\n }));\n }\n\n private isMarkerEmpty(marker: string | undefined) {\n return this.emptyMarkerValues.includes(marker);\n }\n}\n"],"mappings":"AACA,SACIA,gBAAgB,EAChBC,8BAA8B,QAC3B,oCAAoC;AAa3C,OAAO,MAAMC,8BAA8B,CAAC;EAGvBC,iBAAiB,GAAG,CAACC,SAAS,EAAE,GAAG,CAAC;EAErDC,WAAWA,CAACC,MAAc,EAAEC,QAAY,EAAE;IACtC,IAAI,CAACD,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACE,EAAE,GAAGD,QAAQ;EACtB;EAEA,MAAME,OAAOA,CAACC,MAAqC,EAAE;IACjD,MAAMC,YAAY,GAAG;MACjBC,MAAM,EAAE,IAAI,CAACN,MAAM;MACnBO,GAAG,EAAEH,MAAM,CAACI,OAAO;MACnBC,QAAQ,EAAEL,MAAM,CAACM;IACrB,CAAC;IAED,MAAMC,QAAQ,GAAG,MAAM,IAAI,CAACC,iBAAiB,CAACP,YAAY,CAAC;IAE3D,MAAMQ,QAAQ,GAAG;MACb,GAAGR,YAAY;MACfS,eAAe,EAAE;QACbC,KAAK,EAAEJ;MACX;IACJ,CAAC;IAED,IAAI;MACA,MAAMK,OAAO,GAAG,IAAIrB,8BAA8B,CAACkB,QAAQ,CAAC;MAC5D,MAAM,IAAI,CAACX,EAAE,CAACe,IAAI,CAACD,OAAO,CAAC;IAC/B,CAAC,CAAC,OAAOE,GAAG,EAAE;MACVC,OAAO,CAACC,KAAK,CAACF,GAAG,CAAC;MAClB,MAAMA,GAAG;IACb;EACJ;EAEA,MAAcN,iBAAiBA,CAACR,MAA+B,EAAE;IAC7D,MAAMiB,KAAa,GAAG,EAAE;IAExB,IAAIC,MAA0B,GAAGxB,SAAS;IAC1C,OAAO,IAAI,EAAE;MACT,MAAM;QAAEiB,KAAK;QAAEQ;MAAkC,CAAC,GAAG,MAAM,IAAI,CAACrB,EAAE,CAACe,IAAI,CACnE,IAAIvB,gBAAgB,CAAC;QACjB,GAAGU,MAAM;QACTmB,gBAAgB,EAAED;MACtB,CAAC,CACL,CAAC;MAED,IAAIP,KAAK,EAAE;QACPA,KAAK,CAACS,OAAO,CAACC,IAAI,IAAIJ,KAAK,CAACK,IAAI,CAACD,IAAI,CAAC,CAAC;MAC3C;MAEAH,MAAM,GAAGC,gBAAgB,IAAIzB,SAAS;MACtC,IAAI,IAAI,CAAC6B,aAAa,CAACL,MAAM,CAAC,EAAE;QAC5B;MACJ;IACJ;IAEA,OAAOD,KAAK,CAACO,GAAG,CAACH,IAAI,KAAK;MACtBI,IAAI,EAAEJ,IAAI,CAACI,IAAc;MACzBC,UAAU,EAAEL,IAAI,CAACK;IACrB,CAAC,CAAC,CAAC;EACP;EAEQH,aAAaA,CAACL,MAA0B,EAAE;IAC9C,OAAO,IAAI,CAACzB,iBAAiB,CAACkC,QAAQ,CAACT,MAAM,CAAC;EAClD;AACJ","ignoreList":[]}
1
+ {"version":3,"file":"multiPartUpload/CompleteMultiPartUploadUseCase.js","sources":["../../src/multiPartUpload/CompleteMultiPartUploadUseCase.ts"],"sourcesContent":["import type { S3, Part, ListPartsOutput } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport {\n ListPartsCommand,\n CompleteMultipartUploadCommand\n} from \"@webiny/aws-sdk/client-s3/index.js\";\n\ninterface CompleteMultiPartUploadParams {\n fileKey: string;\n uploadId: string;\n}\n\ninterface GetAllUploadPartsParams {\n Bucket: string;\n Key: string;\n UploadId: string;\n}\n\nexport class CompleteMultiPartUploadUseCase {\n private readonly s3: S3;\n private readonly bucket: string;\n private readonly emptyMarkerValues = [undefined, \"0\"];\n\n constructor(bucket: string, s3Client: S3) {\n this.bucket = bucket;\n this.s3 = s3Client;\n }\n\n async execute(params: CompleteMultiPartUploadParams) {\n const uploadParams = {\n Bucket: this.bucket,\n Key: params.fileKey,\n UploadId: params.uploadId\n };\n\n const allParts = await this.getAllUploadParts(uploadParams);\n\n const s3Params = {\n ...uploadParams,\n MultipartUpload: {\n Parts: allParts\n }\n };\n\n try {\n const command = new CompleteMultipartUploadCommand(s3Params);\n await this.s3.send(command);\n } catch (err) {\n console.error(err);\n throw err;\n }\n }\n\n private async getAllUploadParts(params: GetAllUploadPartsParams) {\n const parts: Part[] = [];\n\n let marker: string | undefined = undefined;\n while (true) {\n const { Parts, PartNumberMarker }: ListPartsOutput = await this.s3.send(\n new ListPartsCommand({\n ...params,\n PartNumberMarker: marker\n })\n );\n\n if (Parts) {\n Parts.forEach(part => parts.push(part));\n }\n\n marker = PartNumberMarker || undefined;\n if (this.isMarkerEmpty(marker)) {\n break;\n }\n }\n\n return parts.map(part => ({\n ETag: part.ETag as string,\n PartNumber: part.PartNumber as number\n }));\n }\n\n private isMarkerEmpty(marker: string | undefined) {\n return this.emptyMarkerValues.includes(marker);\n }\n}\n"],"names":["CompleteMultiPartUploadUseCase","bucket","s3Client","undefined","params","uploadParams","allParts","s3Params","command","CompleteMultipartUploadCommand","err","console","parts","marker","Parts","PartNumberMarker","ListPartsCommand","part"],"mappings":";AAiBO,MAAMA;IAKT,YAAYC,MAAc,EAAEC,QAAY,CAAE;aAFzB,iBAAiB,GAAG;YAACC;YAAW;SAAI;QAGjD,IAAI,CAAC,MAAM,GAAGF;QACd,IAAI,CAAC,EAAE,GAAGC;IACd;IAEA,MAAM,QAAQE,MAAqC,EAAE;QACjD,MAAMC,eAAe;YACjB,QAAQ,IAAI,CAAC,MAAM;YACnB,KAAKD,OAAO,OAAO;YACnB,UAAUA,OAAO,QAAQ;QAC7B;QAEA,MAAME,WAAW,MAAM,IAAI,CAAC,iBAAiB,CAACD;QAE9C,MAAME,WAAW;YACb,GAAGF,YAAY;YACf,iBAAiB;gBACb,OAAOC;YACX;QACJ;QAEA,IAAI;YACA,MAAME,UAAU,IAAIC,+BAA+BF;YACnD,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAACC;QACvB,EAAE,OAAOE,KAAK;YACVC,QAAQ,KAAK,CAACD;YACd,MAAMA;QACV;IACJ;IAEA,MAAc,kBAAkBN,MAA+B,EAAE;QAC7D,MAAMQ,QAAgB,EAAE;QAExB,IAAIC;QACJ,MAAO,KAAM;YACT,MAAM,EAAEC,KAAK,EAAEC,gBAAgB,EAAE,GAAoB,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CACnE,IAAIC,iBAAiB;gBACjB,GAAGZ,MAAM;gBACT,kBAAkBS;YACtB;YAGJ,IAAIC,OACAA,MAAM,OAAO,CAACG,CAAAA,OAAQL,MAAM,IAAI,CAACK;YAGrCJ,SAASE,oBAAoBZ;YAC7B,IAAI,IAAI,CAAC,aAAa,CAACU,SACnB;QAER;QAEA,OAAOD,MAAM,GAAG,CAACK,CAAAA,OAAS;gBACtB,MAAMA,KAAK,IAAI;gBACf,YAAYA,KAAK,UAAU;YAC/B;IACJ;IAEQ,cAAcJ,MAA0B,EAAE;QAC9C,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAACA;IAC3C;AACJ"}