@webiny/api-file-manager-s3 6.3.0 → 6.4.0-beta.1

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 +18 -18
  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
@@ -4,48 +4,34 @@ import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/ind
4
4
  import { processThreatScanResult } from "./processThreatScanResult.js";
5
5
  import { ObjectKey } from "./ObjectKey.js";
6
6
  const detailType = "GuardDuty Malware Protection Object Scan Result";
7
- export const createThreatDetectionEventHandler = () => {
8
- const handlerOnRequest = createHandlerOnRequest(async (request, _, context) => {
9
- const payload = request.body;
10
- if (payload["detail-type"] !== detailType) {
11
- return;
12
- }
13
- const objectKey = payload.detail.s3ObjectDetails.objectKey;
14
- const keyValueStore = context.container.resolve(GlobalKeyValueStore);
15
- try {
16
- // Extract file id from the absolute S3 object key
17
- const fileId = ObjectKey.from(objectKey).id();
18
- const result = await keyValueStore.get(`FileManager/File/${fileId}/Metadata`);
19
- if (result.isFail()) {
20
- return;
21
- }
22
- request.headers = {
23
- ...request.headers,
24
- "x-tenant": result.value.tenant
25
- };
26
- } catch {
27
- // If metadata can't be loaded, we ignore the file.
28
- // Most likely it's because the file is a rendition of the original file,
29
- // so we don't need to do anything with it.
30
- }
31
- });
32
- // Guard Duty event handler.
33
- const threatScanEventHandler = createEventBridgeEventHandler(async ({
34
- payload,
35
- next,
36
- ...rest
37
- }) => {
38
- const context = rest.context;
39
- const threatDetectionEnabled = context.wcp.canUseFileManagerThreatDetection();
40
- if (!threatDetectionEnabled || payload["detail-type"] !== detailType) {
41
- return next();
42
- }
43
- await processThreatScanResult(context, payload.detail);
44
- });
45
-
46
- // Assign a human-readable name for easier debugging.
47
- threatScanEventHandler.name = threatScanEventHandler.type + ".threatDetectionEventHandler";
48
- return [handlerOnRequest, threatScanEventHandler];
7
+ const createThreatDetectionEventHandler = ()=>{
8
+ const handlerOnRequest = createHandlerOnRequest(async (request, _, context)=>{
9
+ const payload = request.body;
10
+ if (payload["detail-type"] !== detailType) return;
11
+ const objectKey = payload.detail.s3ObjectDetails.objectKey;
12
+ const keyValueStore = context.container.resolve(GlobalKeyValueStore);
13
+ try {
14
+ const fileId = ObjectKey.from(objectKey).id();
15
+ const result = await keyValueStore.get(`FileManager/File/${fileId}/Metadata`);
16
+ if (result.isFail()) return;
17
+ request.headers = {
18
+ ...request.headers,
19
+ "x-tenant": result.value.tenant
20
+ };
21
+ } catch {}
22
+ });
23
+ const threatScanEventHandler = createEventBridgeEventHandler(async ({ payload, next, ...rest })=>{
24
+ const context = rest.context;
25
+ const threatDetectionEnabled = context.wcp.canUseFileManagerThreatDetection();
26
+ if (!threatDetectionEnabled || payload["detail-type"] !== detailType) return next();
27
+ await processThreatScanResult(context, payload.detail);
28
+ });
29
+ threatScanEventHandler.name = threatScanEventHandler.type + ".threatDetectionEventHandler";
30
+ return [
31
+ handlerOnRequest,
32
+ threatScanEventHandler
33
+ ];
49
34
  };
35
+ export { createThreatDetectionEventHandler };
50
36
 
51
37
  //# sourceMappingURL=createThreatDetectionEventHandler.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createEventBridgeEventHandler","createHandlerOnRequest","GlobalKeyValueStore","processThreatScanResult","ObjectKey","detailType","createThreatDetectionEventHandler","handlerOnRequest","request","_","context","payload","body","objectKey","detail","s3ObjectDetails","keyValueStore","container","resolve","fileId","from","id","result","get","isFail","headers","value","tenant","threatScanEventHandler","next","rest","threatDetectionEnabled","wcp","canUseFileManagerThreatDetection","name","type"],"sources":["createThreatDetectionEventHandler.ts"],"sourcesContent":["import { createEventBridgeEventHandler } from \"@webiny/handler-aws\";\nimport { createHandlerOnRequest } from \"@webiny/handler\";\nimport type { EventBridgeEvent } from \"@webiny/aws-sdk/types/index.js\";\nimport type { ApiCoreContext } from \"@webiny/api-core/types/core.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\nimport type { GuardDutyEvent } from \"./types.js\";\nimport { processThreatScanResult } from \"./processThreatScanResult.js\";\nimport { ObjectKey } from \"./ObjectKey.js\";\n\nconst detailType = \"GuardDuty Malware Protection Object Scan Result\";\n\nexport const createThreatDetectionEventHandler = () => {\n const handlerOnRequest = createHandlerOnRequest(async (request, _, context) => {\n const payload = request.body as EventBridgeEvent<string, GuardDutyEvent>;\n\n if (payload[\"detail-type\"] !== detailType) {\n return;\n }\n\n const objectKey = payload.detail.s3ObjectDetails.objectKey;\n const keyValueStore = context.container.resolve(GlobalKeyValueStore);\n\n try {\n // Extract file id from the absolute S3 object key\n const fileId = ObjectKey.from(objectKey).id();\n const result = await keyValueStore.get<{ tenant: string }>(\n `FileManager/File/${fileId}/Metadata`\n );\n\n if (result.isFail()) {\n return;\n }\n\n request.headers = {\n ...request.headers,\n \"x-tenant\": result.value.tenant\n };\n } catch {\n // If metadata can't be loaded, we ignore the file.\n // Most likely it's because the file is a rendition of the original file,\n // so we don't need to do anything with it.\n }\n });\n // Guard Duty event handler.\n const threatScanEventHandler = createEventBridgeEventHandler<typeof detailType, GuardDutyEvent>(\n async ({ payload, next, ...rest }) => {\n const context = rest.context as ApiCoreContext;\n\n const threatDetectionEnabled = context.wcp.canUseFileManagerThreatDetection();\n\n if (!threatDetectionEnabled || payload[\"detail-type\"] !== detailType) {\n return next();\n }\n\n await processThreatScanResult(context, payload.detail);\n }\n );\n\n // Assign a human-readable name for easier debugging.\n threatScanEventHandler.name = threatScanEventHandler.type + \".threatDetectionEventHandler\";\n\n return [handlerOnRequest, threatScanEventHandler];\n};\n"],"mappings":"AAAA,SAASA,6BAA6B,QAAQ,qBAAqB;AACnE,SAASC,sBAAsB,QAAQ,iBAAiB;AAGxD,SAASC,mBAAmB,QAAQ,kDAAkD;AAEtF,SAASC,uBAAuB;AAChC,SAASC,SAAS;AAElB,MAAMC,UAAU,GAAG,iDAAiD;AAEpE,OAAO,MAAMC,iCAAiC,GAAGA,CAAA,KAAM;EACnD,MAAMC,gBAAgB,GAAGN,sBAAsB,CAAC,OAAOO,OAAO,EAAEC,CAAC,EAAEC,OAAO,KAAK;IAC3E,MAAMC,OAAO,GAAGH,OAAO,CAACI,IAAgD;IAExE,IAAID,OAAO,CAAC,aAAa,CAAC,KAAKN,UAAU,EAAE;MACvC;IACJ;IAEA,MAAMQ,SAAS,GAAGF,OAAO,CAACG,MAAM,CAACC,eAAe,CAACF,SAAS;IAC1D,MAAMG,aAAa,GAAGN,OAAO,CAACO,SAAS,CAACC,OAAO,CAAChB,mBAAmB,CAAC;IAEpE,IAAI;MACA;MACA,MAAMiB,MAAM,GAAGf,SAAS,CAACgB,IAAI,CAACP,SAAS,CAAC,CAACQ,EAAE,CAAC,CAAC;MAC7C,MAAMC,MAAM,GAAG,MAAMN,aAAa,CAACO,GAAG,CAClC,oBAAoBJ,MAAM,WAC9B,CAAC;MAED,IAAIG,MAAM,CAACE,MAAM,CAAC,CAAC,EAAE;QACjB;MACJ;MAEAhB,OAAO,CAACiB,OAAO,GAAG;QACd,GAAGjB,OAAO,CAACiB,OAAO;QAClB,UAAU,EAAEH,MAAM,CAACI,KAAK,CAACC;MAC7B,CAAC;IACL,CAAC,CAAC,MAAM;MACJ;MACA;MACA;IAAA;EAER,CAAC,CAAC;EACF;EACA,MAAMC,sBAAsB,GAAG5B,6BAA6B,CACxD,OAAO;IAAEW,OAAO;IAAEkB,IAAI;IAAE,GAAGC;EAAK,CAAC,KAAK;IAClC,MAAMpB,OAAO,GAAGoB,IAAI,CAACpB,OAAyB;IAE9C,MAAMqB,sBAAsB,GAAGrB,OAAO,CAACsB,GAAG,CAACC,gCAAgC,CAAC,CAAC;IAE7E,IAAI,CAACF,sBAAsB,IAAIpB,OAAO,CAAC,aAAa,CAAC,KAAKN,UAAU,EAAE;MAClE,OAAOwB,IAAI,CAAC,CAAC;IACjB;IAEA,MAAM1B,uBAAuB,CAACO,OAAO,EAAEC,OAAO,CAACG,MAAM,CAAC;EAC1D,CACJ,CAAC;;EAED;EACAc,sBAAsB,CAACM,IAAI,GAAGN,sBAAsB,CAACO,IAAI,GAAG,8BAA8B;EAE1F,OAAO,CAAC5B,gBAAgB,EAAEqB,sBAAsB,CAAC;AACrD,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"assetDelivery/threatDetection/createThreatDetectionEventHandler.js","sources":["../../../src/assetDelivery/threatDetection/createThreatDetectionEventHandler.ts"],"sourcesContent":["import { createEventBridgeEventHandler } from \"@webiny/handler-aws\";\nimport { createHandlerOnRequest } from \"@webiny/handler\";\nimport type { EventBridgeEvent } from \"@webiny/aws-sdk/types/index.js\";\nimport type { ApiCoreContext } from \"@webiny/api-core/types/core.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\nimport type { GuardDutyEvent } from \"./types.js\";\nimport { processThreatScanResult } from \"./processThreatScanResult.js\";\nimport { ObjectKey } from \"./ObjectKey.js\";\n\nconst detailType = \"GuardDuty Malware Protection Object Scan Result\";\n\nexport const createThreatDetectionEventHandler = () => {\n const handlerOnRequest = createHandlerOnRequest(async (request, _, context) => {\n const payload = request.body as EventBridgeEvent<string, GuardDutyEvent>;\n\n if (payload[\"detail-type\"] !== detailType) {\n return;\n }\n\n const objectKey = payload.detail.s3ObjectDetails.objectKey;\n const keyValueStore = context.container.resolve(GlobalKeyValueStore);\n\n try {\n // Extract file id from the absolute S3 object key\n const fileId = ObjectKey.from(objectKey).id();\n const result = await keyValueStore.get<{ tenant: string }>(\n `FileManager/File/${fileId}/Metadata`\n );\n\n if (result.isFail()) {\n return;\n }\n\n request.headers = {\n ...request.headers,\n \"x-tenant\": result.value.tenant\n };\n } catch {\n // If metadata can't be loaded, we ignore the file.\n // Most likely it's because the file is a rendition of the original file,\n // so we don't need to do anything with it.\n }\n });\n // Guard Duty event handler.\n const threatScanEventHandler = createEventBridgeEventHandler<typeof detailType, GuardDutyEvent>(\n async ({ payload, next, ...rest }) => {\n const context = rest.context as ApiCoreContext;\n\n const threatDetectionEnabled = context.wcp.canUseFileManagerThreatDetection();\n\n if (!threatDetectionEnabled || payload[\"detail-type\"] !== detailType) {\n return next();\n }\n\n await processThreatScanResult(context, payload.detail);\n }\n );\n\n // Assign a human-readable name for easier debugging.\n threatScanEventHandler.name = threatScanEventHandler.type + \".threatDetectionEventHandler\";\n\n return [handlerOnRequest, threatScanEventHandler];\n};\n"],"names":["detailType","createThreatDetectionEventHandler","handlerOnRequest","createHandlerOnRequest","request","_","context","payload","objectKey","keyValueStore","GlobalKeyValueStore","fileId","ObjectKey","result","threatScanEventHandler","createEventBridgeEventHandler","next","rest","threatDetectionEnabled","processThreatScanResult"],"mappings":";;;;;AASA,MAAMA,aAAa;AAEZ,MAAMC,oCAAoC;IAC7C,MAAMC,mBAAmBC,uBAAuB,OAAOC,SAASC,GAAGC;QAC/D,MAAMC,UAAUH,QAAQ,IAAI;QAE5B,IAAIG,OAAO,CAAC,cAAc,KAAKP,YAC3B;QAGJ,MAAMQ,YAAYD,QAAQ,MAAM,CAAC,eAAe,CAAC,SAAS;QAC1D,MAAME,gBAAgBH,QAAQ,SAAS,CAAC,OAAO,CAACI;QAEhD,IAAI;YAEA,MAAMC,SAASC,UAAU,IAAI,CAACJ,WAAW,EAAE;YAC3C,MAAMK,SAAS,MAAMJ,cAAc,GAAG,CAClC,CAAC,iBAAiB,EAAEE,OAAO,SAAS,CAAC;YAGzC,IAAIE,OAAO,MAAM,IACb;YAGJT,QAAQ,OAAO,GAAG;gBACd,GAAGA,QAAQ,OAAO;gBAClB,YAAYS,OAAO,KAAK,CAAC,MAAM;YACnC;QACJ,EAAE,OAAM,CAIR;IACJ;IAEA,MAAMC,yBAAyBC,8BAC3B,OAAO,EAAER,OAAO,EAAES,IAAI,EAAE,GAAGC,MAAM;QAC7B,MAAMX,UAAUW,KAAK,OAAO;QAE5B,MAAMC,yBAAyBZ,QAAQ,GAAG,CAAC,gCAAgC;QAE3E,IAAI,CAACY,0BAA0BX,OAAO,CAAC,cAAc,KAAKP,YACtD,OAAOgB;QAGX,MAAMG,wBAAwBb,SAASC,QAAQ,MAAM;IACzD;IAIJO,uBAAuB,IAAI,GAAGA,uBAAuB,IAAI,GAAG;IAE5D,OAAO;QAACZ;QAAkBY;KAAuB;AACrD"}
@@ -1,6 +1,5 @@
1
1
  import { createConditionalPluginFactory } from "@webiny/api";
2
- export const createThreatDetectionPluginLoader = cb => {
3
- return createConditionalPluginFactory(() => process.env.WEBINY_FUNCTION_TYPE === "threat-detection-event-handler", cb);
4
- };
2
+ const createThreatDetectionPluginLoader = (cb)=>createConditionalPluginFactory(()=>"threat-detection-event-handler" === process.env.WEBINY_FUNCTION_TYPE, cb);
3
+ export { createThreatDetectionPluginLoader };
5
4
 
6
5
  //# sourceMappingURL=createThreatDetectionPluginLoader.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createConditionalPluginFactory","createThreatDetectionPluginLoader","cb","process","env","WEBINY_FUNCTION_TYPE"],"sources":["createThreatDetectionPluginLoader.ts"],"sourcesContent":["import type { PluginFactory } from \"@webiny/plugins/types.js\";\nimport { createConditionalPluginFactory } from \"@webiny/api\";\n\nexport const createThreatDetectionPluginLoader = (cb: PluginFactory) => {\n return createConditionalPluginFactory(\n () => process.env.WEBINY_FUNCTION_TYPE === \"threat-detection-event-handler\",\n cb\n );\n};\n"],"mappings":"AACA,SAASA,8BAA8B,QAAQ,aAAa;AAE5D,OAAO,MAAMC,iCAAiC,GAAIC,EAAiB,IAAK;EACpE,OAAOF,8BAA8B,CACjC,MAAMG,OAAO,CAACC,GAAG,CAACC,oBAAoB,KAAK,gCAAgC,EAC3EH,EACJ,CAAC;AACL,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"assetDelivery/threatDetection/createThreatDetectionPluginLoader.js","sources":["../../../src/assetDelivery/threatDetection/createThreatDetectionPluginLoader.ts"],"sourcesContent":["import type { PluginFactory } from \"@webiny/plugins/types.js\";\nimport { createConditionalPluginFactory } from \"@webiny/api\";\n\nexport const createThreatDetectionPluginLoader = (cb: PluginFactory) => {\n return createConditionalPluginFactory(\n () => process.env.WEBINY_FUNCTION_TYPE === \"threat-detection-event-handler\",\n cb\n );\n};\n"],"names":["createThreatDetectionPluginLoader","cb","createConditionalPluginFactory","process"],"mappings":";AAGO,MAAMA,oCAAoC,CAACC,KACvCC,+BACH,IAAMC,AAAqC,qCAArCA,QAAQ,GAAG,CAAC,oBAAoB,EACtCF"}
@@ -1,4 +1,2 @@
1
1
  export * from "./createThreatDetectionEventHandler.js";
2
2
  export * from "./createThreatDetectionPluginLoader.js";
3
-
4
- //# sourceMappingURL=index.js.map
@@ -3,63 +3,57 @@ import { DeleteFileUseCase } from "@webiny/api-file-manager/features/file/Delete
3
3
  import { WebsocketService } from "@webiny/api-websockets/features/WebsocketService/index.js";
4
4
  import { ObjectKey } from "./ObjectKey.js";
5
5
  import { GetFileUseCase } from "@webiny/api-file-manager/features/file/GetFile/index.js";
6
- export const processThreatScanResult = async (context, eventDetail) => {
7
- const websocketService = context.container.resolve(WebsocketService);
8
- const getFile = context.container.resolve(GetFileUseCase);
9
- const updateFile = context.container.resolve(UpdateFileUseCase);
10
- const deleteFile = context.container.resolve(DeleteFileUseCase);
11
- await context.security.withoutAuthorization(async () => {
12
- const scanStatus = eventDetail.scanResultDetails.scanResultStatus;
13
- const s3Object = eventDetail.s3ObjectDetails;
14
- const fileId = ObjectKey.from(s3Object.objectKey).id();
15
- const fileResult = await getFile.execute(fileId);
16
- if (fileResult.isFail()) {
17
- return;
18
- }
19
- const file = fileResult.value;
20
- let allConnections = [];
21
- const connectionsResult = await websocketService.listConnections();
22
- if (connectionsResult.isOk()) {
23
- allConnections = connectionsResult.value;
24
- }
25
- if (scanStatus === "NO_THREATS_FOUND") {
26
- const newTags = file.tags.filter(tag => tag !== "threatScanInProgress");
27
- await updateFile.execute({
28
- id: file.id,
29
- tags: newTags
30
- });
31
- await websocketService.sendToConnections(allConnections, {
32
- action: "fm.threatScan.noThreatFound",
33
- data: {
34
- id: file.id,
35
- tags: newTags
6
+ const processThreatScanResult = async (context, eventDetail)=>{
7
+ const websocketService = context.container.resolve(WebsocketService);
8
+ const getFile = context.container.resolve(GetFileUseCase);
9
+ const updateFile = context.container.resolve(UpdateFileUseCase);
10
+ const deleteFile = context.container.resolve(DeleteFileUseCase);
11
+ await context.security.withoutAuthorization(async ()=>{
12
+ const scanStatus = eventDetail.scanResultDetails.scanResultStatus;
13
+ const s3Object = eventDetail.s3ObjectDetails;
14
+ const fileId = ObjectKey.from(s3Object.objectKey).id();
15
+ const fileResult = await getFile.execute(fileId);
16
+ if (fileResult.isFail()) return;
17
+ const file = fileResult.value;
18
+ let allConnections = [];
19
+ const connectionsResult = await websocketService.listConnections();
20
+ if (connectionsResult.isOk()) allConnections = connectionsResult.value;
21
+ if ("NO_THREATS_FOUND" === scanStatus) {
22
+ const newTags = file.tags.filter((tag)=>"threatScanInProgress" !== tag);
23
+ await updateFile.execute({
24
+ id: file.id,
25
+ tags: newTags
26
+ });
27
+ await websocketService.sendToConnections(allConnections, {
28
+ action: "fm.threatScan.noThreatFound",
29
+ data: {
30
+ id: file.id,
31
+ tags: newTags
32
+ }
33
+ });
34
+ return;
36
35
  }
37
- });
38
- return;
39
- }
40
- if (scanStatus === "THREATS_FOUND") {
41
- // Delete the infected file.
42
- await deleteFile.execute(file.id);
43
- await websocketService.sendToConnections(allConnections, {
44
- action: "fm.threatScan.threatDetected",
45
- data: {
46
- id: file.id,
47
- name: file.name
36
+ if ("THREATS_FOUND" === scanStatus) {
37
+ await deleteFile.execute(file.id);
38
+ await websocketService.sendToConnections(allConnections, {
39
+ action: "fm.threatScan.threatDetected",
40
+ data: {
41
+ id: file.id,
42
+ name: file.name
43
+ }
44
+ });
45
+ return;
48
46
  }
49
- });
50
- return;
51
- }
52
-
53
- // For all other outcomes, we delete the file, until better logic is implemented.
54
- await deleteFile.execute(file.id);
55
- await websocketService.sendToConnections(allConnections, {
56
- action: "fm.threatScan.unsupported",
57
- data: {
58
- id: file.id,
59
- name: file.name
60
- }
47
+ await deleteFile.execute(file.id);
48
+ await websocketService.sendToConnections(allConnections, {
49
+ action: "fm.threatScan.unsupported",
50
+ data: {
51
+ id: file.id,
52
+ name: file.name
53
+ }
54
+ });
61
55
  });
62
- });
63
56
  };
57
+ export { processThreatScanResult };
64
58
 
65
59
  //# sourceMappingURL=processThreatScanResult.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["UpdateFileUseCase","DeleteFileUseCase","WebsocketService","ObjectKey","GetFileUseCase","processThreatScanResult","context","eventDetail","websocketService","container","resolve","getFile","updateFile","deleteFile","security","withoutAuthorization","scanStatus","scanResultDetails","scanResultStatus","s3Object","s3ObjectDetails","fileId","from","objectKey","id","fileResult","execute","isFail","file","value","allConnections","connectionsResult","listConnections","isOk","newTags","tags","filter","tag","sendToConnections","action","data","name"],"sources":["processThreatScanResult.ts"],"sourcesContent":["import type { ApiCoreContext } from \"@webiny/api-core/types/core.js\";\nimport { UpdateFileUseCase } from \"@webiny/api-file-manager/features/file/UpdateFile/index.js\";\nimport { DeleteFileUseCase } from \"@webiny/api-file-manager/features/file/DeleteFile/index.js\";\nimport { WebsocketService } from \"@webiny/api-websockets/features/WebsocketService/index.js\";\nimport type { GuardDutyEvent } from \"./types.js\";\nimport { ObjectKey } from \"./ObjectKey.js\";\nimport { GetFileUseCase } from \"@webiny/api-file-manager/features/file/GetFile/index.js\";\n\nexport const processThreatScanResult = async (\n context: ApiCoreContext,\n eventDetail: GuardDutyEvent\n) => {\n const websocketService = context.container.resolve(WebsocketService);\n const getFile = context.container.resolve(GetFileUseCase);\n const updateFile = context.container.resolve(UpdateFileUseCase);\n const deleteFile = context.container.resolve(DeleteFileUseCase);\n\n await context.security.withoutAuthorization(async () => {\n const scanStatus = eventDetail.scanResultDetails.scanResultStatus;\n const s3Object = eventDetail.s3ObjectDetails;\n\n const fileId = ObjectKey.from(s3Object.objectKey).id();\n const fileResult = await getFile.execute(fileId);\n\n if (fileResult.isFail()) {\n return;\n }\n\n const file = fileResult.value;\n\n let allConnections: WebsocketService.Connection[] = [];\n const connectionsResult = await websocketService.listConnections();\n if (connectionsResult.isOk()) {\n allConnections = connectionsResult.value;\n }\n\n if (scanStatus === \"NO_THREATS_FOUND\") {\n const newTags = file.tags.filter(tag => tag !== \"threatScanInProgress\");\n await updateFile.execute({\n id: file.id,\n tags: newTags\n });\n\n await websocketService.sendToConnections(allConnections, {\n action: \"fm.threatScan.noThreatFound\",\n data: {\n id: file.id,\n tags: newTags\n }\n });\n\n return;\n }\n\n if (scanStatus === \"THREATS_FOUND\") {\n // Delete the infected file.\n await deleteFile.execute(file.id);\n\n await websocketService.sendToConnections(allConnections, {\n action: \"fm.threatScan.threatDetected\",\n data: {\n id: file.id,\n name: file.name\n }\n });\n\n return;\n }\n\n // For all other outcomes, we delete the file, until better logic is implemented.\n await deleteFile.execute(file.id);\n\n await websocketService.sendToConnections(allConnections, {\n action: \"fm.threatScan.unsupported\",\n data: {\n id: file.id,\n name: file.name\n }\n });\n });\n};\n"],"mappings":"AACA,SAASA,iBAAiB,QAAQ,4DAA4D;AAC9F,SAASC,iBAAiB,QAAQ,4DAA4D;AAC9F,SAASC,gBAAgB,QAAQ,2DAA2D;AAE5F,SAASC,SAAS;AAClB,SAASC,cAAc,QAAQ,yDAAyD;AAExF,OAAO,MAAMC,uBAAuB,GAAG,MAAAA,CACnCC,OAAuB,EACvBC,WAA2B,KAC1B;EACD,MAAMC,gBAAgB,GAAGF,OAAO,CAACG,SAAS,CAACC,OAAO,CAACR,gBAAgB,CAAC;EACpE,MAAMS,OAAO,GAAGL,OAAO,CAACG,SAAS,CAACC,OAAO,CAACN,cAAc,CAAC;EACzD,MAAMQ,UAAU,GAAGN,OAAO,CAACG,SAAS,CAACC,OAAO,CAACV,iBAAiB,CAAC;EAC/D,MAAMa,UAAU,GAAGP,OAAO,CAACG,SAAS,CAACC,OAAO,CAACT,iBAAiB,CAAC;EAE/D,MAAMK,OAAO,CAACQ,QAAQ,CAACC,oBAAoB,CAAC,YAAY;IACpD,MAAMC,UAAU,GAAGT,WAAW,CAACU,iBAAiB,CAACC,gBAAgB;IACjE,MAAMC,QAAQ,GAAGZ,WAAW,CAACa,eAAe;IAE5C,MAAMC,MAAM,GAAGlB,SAAS,CAACmB,IAAI,CAACH,QAAQ,CAACI,SAAS,CAAC,CAACC,EAAE,CAAC,CAAC;IACtD,MAAMC,UAAU,GAAG,MAAMd,OAAO,CAACe,OAAO,CAACL,MAAM,CAAC;IAEhD,IAAII,UAAU,CAACE,MAAM,CAAC,CAAC,EAAE;MACrB;IACJ;IAEA,MAAMC,IAAI,GAAGH,UAAU,CAACI,KAAK;IAE7B,IAAIC,cAA6C,GAAG,EAAE;IACtD,MAAMC,iBAAiB,GAAG,MAAMvB,gBAAgB,CAACwB,eAAe,CAAC,CAAC;IAClE,IAAID,iBAAiB,CAACE,IAAI,CAAC,CAAC,EAAE;MAC1BH,cAAc,GAAGC,iBAAiB,CAACF,KAAK;IAC5C;IAEA,IAAIb,UAAU,KAAK,kBAAkB,EAAE;MACnC,MAAMkB,OAAO,GAAGN,IAAI,CAACO,IAAI,CAACC,MAAM,CAACC,GAAG,IAAIA,GAAG,KAAK,sBAAsB,CAAC;MACvE,MAAMzB,UAAU,CAACc,OAAO,CAAC;QACrBF,EAAE,EAAEI,IAAI,CAACJ,EAAE;QACXW,IAAI,EAAED;MACV,CAAC,CAAC;MAEF,MAAM1B,gBAAgB,CAAC8B,iBAAiB,CAACR,cAAc,EAAE;QACrDS,MAAM,EAAE,6BAA6B;QACrCC,IAAI,EAAE;UACFhB,EAAE,EAAEI,IAAI,CAACJ,EAAE;UACXW,IAAI,EAAED;QACV;MACJ,CAAC,CAAC;MAEF;IACJ;IAEA,IAAIlB,UAAU,KAAK,eAAe,EAAE;MAChC;MACA,MAAMH,UAAU,CAACa,OAAO,CAACE,IAAI,CAACJ,EAAE,CAAC;MAEjC,MAAMhB,gBAAgB,CAAC8B,iBAAiB,CAACR,cAAc,EAAE;QACrDS,MAAM,EAAE,8BAA8B;QACtCC,IAAI,EAAE;UACFhB,EAAE,EAAEI,IAAI,CAACJ,EAAE;UACXiB,IAAI,EAAEb,IAAI,CAACa;QACf;MACJ,CAAC,CAAC;MAEF;IACJ;;IAEA;IACA,MAAM5B,UAAU,CAACa,OAAO,CAACE,IAAI,CAACJ,EAAE,CAAC;IAEjC,MAAMhB,gBAAgB,CAAC8B,iBAAiB,CAACR,cAAc,EAAE;MACrDS,MAAM,EAAE,2BAA2B;MACnCC,IAAI,EAAE;QACFhB,EAAE,EAAEI,IAAI,CAACJ,EAAE;QACXiB,IAAI,EAAEb,IAAI,CAACa;MACf;IACJ,CAAC,CAAC;EACN,CAAC,CAAC;AACN,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"assetDelivery/threatDetection/processThreatScanResult.js","sources":["../../../src/assetDelivery/threatDetection/processThreatScanResult.ts"],"sourcesContent":["import type { ApiCoreContext } from \"@webiny/api-core/types/core.js\";\nimport { UpdateFileUseCase } from \"@webiny/api-file-manager/features/file/UpdateFile/index.js\";\nimport { DeleteFileUseCase } from \"@webiny/api-file-manager/features/file/DeleteFile/index.js\";\nimport { WebsocketService } from \"@webiny/api-websockets/features/WebsocketService/index.js\";\nimport type { GuardDutyEvent } from \"./types.js\";\nimport { ObjectKey } from \"./ObjectKey.js\";\nimport { GetFileUseCase } from \"@webiny/api-file-manager/features/file/GetFile/index.js\";\n\nexport const processThreatScanResult = async (\n context: ApiCoreContext,\n eventDetail: GuardDutyEvent\n) => {\n const websocketService = context.container.resolve(WebsocketService);\n const getFile = context.container.resolve(GetFileUseCase);\n const updateFile = context.container.resolve(UpdateFileUseCase);\n const deleteFile = context.container.resolve(DeleteFileUseCase);\n\n await context.security.withoutAuthorization(async () => {\n const scanStatus = eventDetail.scanResultDetails.scanResultStatus;\n const s3Object = eventDetail.s3ObjectDetails;\n\n const fileId = ObjectKey.from(s3Object.objectKey).id();\n const fileResult = await getFile.execute(fileId);\n\n if (fileResult.isFail()) {\n return;\n }\n\n const file = fileResult.value;\n\n let allConnections: WebsocketService.Connection[] = [];\n const connectionsResult = await websocketService.listConnections();\n if (connectionsResult.isOk()) {\n allConnections = connectionsResult.value;\n }\n\n if (scanStatus === \"NO_THREATS_FOUND\") {\n const newTags = file.tags.filter(tag => tag !== \"threatScanInProgress\");\n await updateFile.execute({\n id: file.id,\n tags: newTags\n });\n\n await websocketService.sendToConnections(allConnections, {\n action: \"fm.threatScan.noThreatFound\",\n data: {\n id: file.id,\n tags: newTags\n }\n });\n\n return;\n }\n\n if (scanStatus === \"THREATS_FOUND\") {\n // Delete the infected file.\n await deleteFile.execute(file.id);\n\n await websocketService.sendToConnections(allConnections, {\n action: \"fm.threatScan.threatDetected\",\n data: {\n id: file.id,\n name: file.name\n }\n });\n\n return;\n }\n\n // For all other outcomes, we delete the file, until better logic is implemented.\n await deleteFile.execute(file.id);\n\n await websocketService.sendToConnections(allConnections, {\n action: \"fm.threatScan.unsupported\",\n data: {\n id: file.id,\n name: file.name\n }\n });\n });\n};\n"],"names":["processThreatScanResult","context","eventDetail","websocketService","WebsocketService","getFile","GetFileUseCase","updateFile","UpdateFileUseCase","deleteFile","DeleteFileUseCase","scanStatus","s3Object","fileId","ObjectKey","fileResult","file","allConnections","connectionsResult","newTags","tag"],"mappings":";;;;;AAQO,MAAMA,0BAA0B,OACnCC,SACAC;IAEA,MAAMC,mBAAmBF,QAAQ,SAAS,CAAC,OAAO,CAACG;IACnD,MAAMC,UAAUJ,QAAQ,SAAS,CAAC,OAAO,CAACK;IAC1C,MAAMC,aAAaN,QAAQ,SAAS,CAAC,OAAO,CAACO;IAC7C,MAAMC,aAAaR,QAAQ,SAAS,CAAC,OAAO,CAACS;IAE7C,MAAMT,QAAQ,QAAQ,CAAC,oBAAoB,CAAC;QACxC,MAAMU,aAAaT,YAAY,iBAAiB,CAAC,gBAAgB;QACjE,MAAMU,WAAWV,YAAY,eAAe;QAE5C,MAAMW,SAASC,UAAU,IAAI,CAACF,SAAS,SAAS,EAAE,EAAE;QACpD,MAAMG,aAAa,MAAMV,QAAQ,OAAO,CAACQ;QAEzC,IAAIE,WAAW,MAAM,IACjB;QAGJ,MAAMC,OAAOD,WAAW,KAAK;QAE7B,IAAIE,iBAAgD,EAAE;QACtD,MAAMC,oBAAoB,MAAMf,iBAAiB,eAAe;QAChE,IAAIe,kBAAkB,IAAI,IACtBD,iBAAiBC,kBAAkB,KAAK;QAG5C,IAAIP,AAAe,uBAAfA,YAAmC;YACnC,MAAMQ,UAAUH,KAAK,IAAI,CAAC,MAAM,CAACI,CAAAA,MAAOA,AAAQ,2BAARA;YACxC,MAAMb,WAAW,OAAO,CAAC;gBACrB,IAAIS,KAAK,EAAE;gBACX,MAAMG;YACV;YAEA,MAAMhB,iBAAiB,iBAAiB,CAACc,gBAAgB;gBACrD,QAAQ;gBACR,MAAM;oBACF,IAAID,KAAK,EAAE;oBACX,MAAMG;gBACV;YACJ;YAEA;QACJ;QAEA,IAAIR,AAAe,oBAAfA,YAAgC;YAEhC,MAAMF,WAAW,OAAO,CAACO,KAAK,EAAE;YAEhC,MAAMb,iBAAiB,iBAAiB,CAACc,gBAAgB;gBACrD,QAAQ;gBACR,MAAM;oBACF,IAAID,KAAK,EAAE;oBACX,MAAMA,KAAK,IAAI;gBACnB;YACJ;YAEA;QACJ;QAGA,MAAMP,WAAW,OAAO,CAACO,KAAK,EAAE;QAEhC,MAAMb,iBAAiB,iBAAiB,CAACc,gBAAgB;YACrD,QAAQ;YACR,MAAM;gBACF,IAAID,KAAK,EAAE;gBACX,MAAMA,KAAK,IAAI;YACnB;QACJ;IACJ;AACJ"}
@@ -1,3 +0,0 @@
1
- export {};
2
-
3
- //# sourceMappingURL=types.js.map
@@ -1,3 +0,0 @@
1
- export {};
2
-
3
- //# sourceMappingURL=types.js.map
@@ -1,19 +1,23 @@
1
1
  import { CreateFileUseCase } from "@webiny/api-file-manager/features/file/CreateFile/abstractions.js";
2
2
  class CreateFileWithThreatScanDecoratorImpl {
3
- constructor(decoratee) {
4
- this.decoratee = decoratee;
5
- }
6
- async execute(input, meta) {
7
- const modifiedInput = {
8
- ...input,
9
- tags: [...(input.tags || []), "threatScanInProgress"]
10
- };
11
- return this.decoratee.execute(modifiedInput, meta);
12
- }
3
+ constructor(decoratee){
4
+ this.decoratee = decoratee;
5
+ }
6
+ async execute(input, meta) {
7
+ const modifiedInput = {
8
+ ...input,
9
+ tags: [
10
+ ...input.tags || [],
11
+ "threatScanInProgress"
12
+ ]
13
+ };
14
+ return this.decoratee.execute(modifiedInput, meta);
15
+ }
13
16
  }
14
- export const CreateFileWithThreatScanDecorator = CreateFileUseCase.createDecorator({
15
- decorator: CreateFileWithThreatScanDecoratorImpl,
16
- dependencies: []
17
+ const CreateFileWithThreatScanDecorator = CreateFileUseCase.createDecorator({
18
+ decorator: CreateFileWithThreatScanDecoratorImpl,
19
+ dependencies: []
17
20
  });
21
+ export { CreateFileWithThreatScanDecorator };
18
22
 
19
23
  //# sourceMappingURL=CreateFileWithThreatScanDecorator.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["CreateFileUseCase","CreateFileWithThreatScanDecoratorImpl","constructor","decoratee","execute","input","meta","modifiedInput","tags","CreateFileWithThreatScanDecorator","createDecorator","decorator","dependencies"],"sources":["CreateFileWithThreatScanDecorator.ts"],"sourcesContent":["import { CreateFileUseCase } from \"@webiny/api-file-manager/features/file/CreateFile/abstractions.js\";\nimport type { CreateFileInput } from \"@webiny/api-file-manager/features/file/CreateFile/abstractions.js\";\n\nclass CreateFileWithThreatScanDecoratorImpl implements CreateFileUseCase.Interface {\n constructor(private decoratee: CreateFileUseCase.Interface) {}\n\n async execute(\n input: CreateFileInput,\n meta?: Record<string, any>\n ): ReturnType<CreateFileUseCase.Interface[\"execute\"]> {\n const modifiedInput: CreateFileInput = {\n ...input,\n tags: [...(input.tags || []), \"threatScanInProgress\"]\n };\n\n return this.decoratee.execute(modifiedInput, meta);\n }\n}\n\nexport const CreateFileWithThreatScanDecorator = CreateFileUseCase.createDecorator({\n decorator: CreateFileWithThreatScanDecoratorImpl,\n dependencies: []\n});\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,mEAAmE;AAGrG,MAAMC,qCAAqC,CAAwC;EAC/EC,WAAWA,CAASC,SAAsC,EAAE;IAAA,KAAxCA,SAAsC,GAAtCA,SAAsC;EAAG;EAE7D,MAAMC,OAAOA,CACTC,KAAsB,EACtBC,IAA0B,EACwB;IAClD,MAAMC,aAA8B,GAAG;MACnC,GAAGF,KAAK;MACRG,IAAI,EAAE,CAAC,IAAIH,KAAK,CAACG,IAAI,IAAI,EAAE,CAAC,EAAE,sBAAsB;IACxD,CAAC;IAED,OAAO,IAAI,CAACL,SAAS,CAACC,OAAO,CAACG,aAAa,EAAED,IAAI,CAAC;EACtD;AACJ;AAEA,OAAO,MAAMG,iCAAiC,GAAGT,iBAAiB,CAACU,eAAe,CAAC;EAC/EC,SAAS,EAAEV,qCAAqC;EAChDW,YAAY,EAAE;AAClB,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js","sources":["../../../src/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.ts"],"sourcesContent":["import { CreateFileUseCase } from \"@webiny/api-file-manager/features/file/CreateFile/abstractions.js\";\nimport type { CreateFileInput } from \"@webiny/api-file-manager/features/file/CreateFile/abstractions.js\";\n\nclass CreateFileWithThreatScanDecoratorImpl implements CreateFileUseCase.Interface {\n constructor(private decoratee: CreateFileUseCase.Interface) {}\n\n async execute(\n input: CreateFileInput,\n meta?: Record<string, any>\n ): ReturnType<CreateFileUseCase.Interface[\"execute\"]> {\n const modifiedInput: CreateFileInput = {\n ...input,\n tags: [...(input.tags || []), \"threatScanInProgress\"]\n };\n\n return this.decoratee.execute(modifiedInput, meta);\n }\n}\n\nexport const CreateFileWithThreatScanDecorator = CreateFileUseCase.createDecorator({\n decorator: CreateFileWithThreatScanDecoratorImpl,\n dependencies: []\n});\n"],"names":["CreateFileWithThreatScanDecoratorImpl","decoratee","input","meta","modifiedInput","CreateFileWithThreatScanDecorator","CreateFileUseCase"],"mappings":";AAGA,MAAMA;IACF,YAAoBC,SAAsC,CAAE;aAAxCA,SAAS,GAATA;IAAyC;IAE7D,MAAM,QACFC,KAAsB,EACtBC,IAA0B,EACwB;QAClD,MAAMC,gBAAiC;YACnC,GAAGF,KAAK;YACR,MAAM;mBAAKA,MAAM,IAAI,IAAI,EAAE;gBAAG;aAAuB;QACzD;QAEA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAACE,eAAeD;IACjD;AACJ;AAEO,MAAME,oCAAoCC,kBAAkB,eAAe,CAAC;IAC/E,WAAWN;IACX,cAAc,EAAE;AACpB"}
@@ -1,10 +1,11 @@
1
1
  import { createFeature } from "@webiny/feature/api";
2
2
  import { CreateFileWithThreatScanDecorator } from "./CreateFileWithThreatScanDecorator.js";
3
- export const ApplyThreatScanningFeature = createFeature({
4
- name: "FileManagerS3/ApplyThreatScanning",
5
- register(container) {
6
- container.registerDecorator(CreateFileWithThreatScanDecorator);
7
- }
3
+ const ApplyThreatScanningFeature = createFeature({
4
+ name: "FileManagerS3/ApplyThreatScanning",
5
+ register (container) {
6
+ container.registerDecorator(CreateFileWithThreatScanDecorator);
7
+ }
8
8
  });
9
+ export { ApplyThreatScanningFeature };
9
10
 
10
11
  //# sourceMappingURL=feature.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["createFeature","CreateFileWithThreatScanDecorator","ApplyThreatScanningFeature","name","register","container","registerDecorator"],"sources":["feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { CreateFileWithThreatScanDecorator } from \"./CreateFileWithThreatScanDecorator.js\";\n\nexport const ApplyThreatScanningFeature = createFeature({\n name: \"FileManagerS3/ApplyThreatScanning\",\n register(container) {\n container.registerDecorator(CreateFileWithThreatScanDecorator);\n }\n});\n"],"mappings":"AAAA,SAASA,aAAa,QAAQ,qBAAqB;AACnD,SAASC,iCAAiC;AAE1C,OAAO,MAAMC,0BAA0B,GAAGF,aAAa,CAAC;EACpDG,IAAI,EAAE,mCAAmC;EACzCC,QAAQA,CAACC,SAAS,EAAE;IAChBA,SAAS,CAACC,iBAAiB,CAACL,iCAAiC,CAAC;EAClE;AACJ,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"enterprise/ApplyThreatScanning/feature.js","sources":["../../../src/enterprise/ApplyThreatScanning/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { CreateFileWithThreatScanDecorator } from \"./CreateFileWithThreatScanDecorator.js\";\n\nexport const ApplyThreatScanningFeature = createFeature({\n name: \"FileManagerS3/ApplyThreatScanning\",\n register(container) {\n container.registerDecorator(CreateFileWithThreatScanDecorator);\n }\n});\n"],"names":["ApplyThreatScanningFeature","createFeature","container","CreateFileWithThreatScanDecorator"],"mappings":";;AAGO,MAAMA,6BAA6BC,cAAc;IACpD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,iBAAiB,CAACC;IAChC;AACJ"}
@@ -3,34 +3,33 @@ import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js
3
3
  import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
4
4
  import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
5
5
  class DeleteFileFromBucketHandlerImpl {
6
- constructor(tenantContext, taskService, keyValueStore) {
7
- this.tenantContext = tenantContext;
8
- this.taskService = taskService;
9
- this.keyValueStore = keyValueStore;
10
- }
11
- async handle(event) {
12
- const {
13
- file
14
- } = event.payload;
15
- const tenant = this.tenantContext.getTenant();
16
-
17
- // Delete S3 folder recursively
18
- await this.taskService.trigger({
19
- definition: "fileManagerFolderDelete",
20
- input: {
21
- caller: "fm-after-delete",
22
- bucket: String(process.env.S3_BUCKET),
23
- folderKey: `tenants/${tenant.id}/files/${file.id}`
24
- }
25
- });
26
-
27
- // Delete file metadata
28
- await this.keyValueStore.delete(`FileManager/File/${file.id}/Metadata`);
29
- }
6
+ constructor(tenantContext, taskService, keyValueStore){
7
+ this.tenantContext = tenantContext;
8
+ this.taskService = taskService;
9
+ this.keyValueStore = keyValueStore;
10
+ }
11
+ async handle(event) {
12
+ const { file } = event.payload;
13
+ const tenant = this.tenantContext.getTenant();
14
+ await this.taskService.trigger({
15
+ definition: "fileManagerFolderDelete",
16
+ input: {
17
+ caller: "fm-after-delete",
18
+ bucket: String(process.env.S3_BUCKET),
19
+ folderKey: `tenants/${tenant.id}/files/${file.id}`
20
+ }
21
+ });
22
+ await this.keyValueStore.delete(`FileManager/File/${file.id}/Metadata`);
23
+ }
30
24
  }
31
- export const DeleteFileFromBucketHandler = FileAfterDeleteEventHandler.createImplementation({
32
- implementation: DeleteFileFromBucketHandlerImpl,
33
- dependencies: [TenantContext, TaskService, GlobalKeyValueStore]
25
+ const DeleteFileFromBucketHandler = FileAfterDeleteEventHandler.createImplementation({
26
+ implementation: DeleteFileFromBucketHandlerImpl,
27
+ dependencies: [
28
+ TenantContext,
29
+ TaskService,
30
+ GlobalKeyValueStore
31
+ ]
34
32
  });
33
+ export { DeleteFileFromBucketHandler };
35
34
 
36
35
  //# sourceMappingURL=DeleteFileFromBucketHandler.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["FileAfterDeleteEventHandler","TaskService","GlobalKeyValueStore","TenantContext","DeleteFileFromBucketHandlerImpl","constructor","tenantContext","taskService","keyValueStore","handle","event","file","payload","tenant","getTenant","trigger","definition","input","caller","bucket","String","process","env","S3_BUCKET","folderKey","id","delete","DeleteFileFromBucketHandler","createImplementation","implementation","dependencies"],"sources":["DeleteFileFromBucketHandler.ts"],"sourcesContent":["import { FileAfterDeleteEventHandler } from \"@webiny/api-file-manager/features/file/DeleteFile/events.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\nimport type { DeleteS3FolderInput } from \"~/features/DeleteFileFromBucket/DeleteS3FolderTask.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\n\nclass DeleteFileFromBucketHandlerImpl implements FileAfterDeleteEventHandler.Interface {\n constructor(\n private tenantContext: TenantContext.Interface,\n private taskService: TaskService.Interface,\n private keyValueStore: GlobalKeyValueStore.Interface\n ) {}\n\n async handle(event: FileAfterDeleteEventHandler.Event): Promise<void> {\n const { file } = event.payload;\n const tenant = this.tenantContext.getTenant();\n\n // Delete S3 folder recursively\n await this.taskService.trigger<DeleteS3FolderInput>({\n definition: \"fileManagerFolderDelete\",\n input: {\n caller: \"fm-after-delete\",\n bucket: String(process.env.S3_BUCKET),\n folderKey: `tenants/${tenant.id}/files/${file.id}`\n }\n });\n\n // Delete file metadata\n await this.keyValueStore.delete(`FileManager/File/${file.id}/Metadata`);\n }\n}\n\nexport const DeleteFileFromBucketHandler = FileAfterDeleteEventHandler.createImplementation({\n implementation: DeleteFileFromBucketHandlerImpl,\n dependencies: [TenantContext, TaskService, GlobalKeyValueStore]\n});\n"],"mappings":"AAAA,SAASA,2BAA2B,QAAQ,6DAA6D;AACzG,SAASC,WAAW,QAAQ,qDAAqD;AACjF,SAASC,mBAAmB,QAAQ,kDAAkD;AAEtF,SAASC,aAAa,QAAQ,0DAA0D;AAExF,MAAMC,+BAA+B,CAAkD;EACnFC,WAAWA,CACCC,aAAsC,EACtCC,WAAkC,EAClCC,aAA4C,EACtD;IAAA,KAHUF,aAAsC,GAAtCA,aAAsC;IAAA,KACtCC,WAAkC,GAAlCA,WAAkC;IAAA,KAClCC,aAA4C,GAA5CA,aAA4C;EACrD;EAEH,MAAMC,MAAMA,CAACC,KAAwC,EAAiB;IAClE,MAAM;MAAEC;IAAK,CAAC,GAAGD,KAAK,CAACE,OAAO;IAC9B,MAAMC,MAAM,GAAG,IAAI,CAACP,aAAa,CAACQ,SAAS,CAAC,CAAC;;IAE7C;IACA,MAAM,IAAI,CAACP,WAAW,CAACQ,OAAO,CAAsB;MAChDC,UAAU,EAAE,yBAAyB;MACrCC,KAAK,EAAE;QACHC,MAAM,EAAE,iBAAiB;QACzBC,MAAM,EAAEC,MAAM,CAACC,OAAO,CAACC,GAAG,CAACC,SAAS,CAAC;QACrCC,SAAS,EAAE,WAAWX,MAAM,CAACY,EAAE,UAAUd,IAAI,CAACc,EAAE;MACpD;IACJ,CAAC,CAAC;;IAEF;IACA,MAAM,IAAI,CAACjB,aAAa,CAACkB,MAAM,CAAC,oBAAoBf,IAAI,CAACc,EAAE,WAAW,CAAC;EAC3E;AACJ;AAEA,OAAO,MAAME,2BAA2B,GAAG3B,2BAA2B,CAAC4B,oBAAoB,CAAC;EACxFC,cAAc,EAAEzB,+BAA+B;EAC/C0B,YAAY,EAAE,CAAC3B,aAAa,EAAEF,WAAW,EAAEC,mBAAmB;AAClE,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js","sources":["../../../src/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.ts"],"sourcesContent":["import { FileAfterDeleteEventHandler } from \"@webiny/api-file-manager/features/file/DeleteFile/events.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\nimport type { DeleteS3FolderInput } from \"~/features/DeleteFileFromBucket/DeleteS3FolderTask.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\n\nclass DeleteFileFromBucketHandlerImpl implements FileAfterDeleteEventHandler.Interface {\n constructor(\n private tenantContext: TenantContext.Interface,\n private taskService: TaskService.Interface,\n private keyValueStore: GlobalKeyValueStore.Interface\n ) {}\n\n async handle(event: FileAfterDeleteEventHandler.Event): Promise<void> {\n const { file } = event.payload;\n const tenant = this.tenantContext.getTenant();\n\n // Delete S3 folder recursively\n await this.taskService.trigger<DeleteS3FolderInput>({\n definition: \"fileManagerFolderDelete\",\n input: {\n caller: \"fm-after-delete\",\n bucket: String(process.env.S3_BUCKET),\n folderKey: `tenants/${tenant.id}/files/${file.id}`\n }\n });\n\n // Delete file metadata\n await this.keyValueStore.delete(`FileManager/File/${file.id}/Metadata`);\n }\n}\n\nexport const DeleteFileFromBucketHandler = FileAfterDeleteEventHandler.createImplementation({\n implementation: DeleteFileFromBucketHandlerImpl,\n dependencies: [TenantContext, TaskService, GlobalKeyValueStore]\n});\n"],"names":["DeleteFileFromBucketHandlerImpl","tenantContext","taskService","keyValueStore","event","file","tenant","String","process","DeleteFileFromBucketHandler","FileAfterDeleteEventHandler","TenantContext","TaskService","GlobalKeyValueStore"],"mappings":";;;;AAMA,MAAMA;IACF,YACYC,aAAsC,EACtCC,WAAkC,EAClCC,aAA4C,CACtD;aAHUF,aAAa,GAAbA;aACAC,WAAW,GAAXA;aACAC,aAAa,GAAbA;IACT;IAEH,MAAM,OAAOC,KAAwC,EAAiB;QAClE,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAM,OAAO;QAC9B,MAAME,SAAS,IAAI,CAAC,aAAa,CAAC,SAAS;QAG3C,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAsB;YAChD,YAAY;YACZ,OAAO;gBACH,QAAQ;gBACR,QAAQC,OAAOC,QAAQ,GAAG,CAAC,SAAS;gBACpC,WAAW,CAAC,QAAQ,EAAEF,OAAO,EAAE,CAAC,OAAO,EAAED,KAAK,EAAE,EAAE;YACtD;QACJ;QAGA,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,iBAAiB,EAAEA,KAAK,EAAE,CAAC,SAAS,CAAC;IAC1E;AACJ;AAEO,MAAMI,8BAA8BC,4BAA4B,oBAAoB,CAAC;IACxF,gBAAgBV;IAChB,cAAc;QAACW;QAAeC;QAAaC;KAAoB;AACnE"}
@@ -1,61 +1,50 @@
1
1
  import { S3 } from "@webiny/aws-sdk/client-s3/index.js";
2
2
  import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
3
3
  class DeleteS3FolderTask {
4
- id = "fileManagerFolderDelete";
5
- title = "Delete folder and all of its contents from the bucket.";
6
- description = "A task to delete all files from a given folder.";
7
- maxIterations = 5;
8
- isPrivate = true;
9
- selfCleanup = ["onSuccess", "onAbort"];
10
- async run({
11
- input,
12
- controller
13
- }) {
14
- if (controller.runtime.isAborted()) {
15
- return controller.response.aborted();
16
- }
17
- if (!input.bucket) {
18
- return controller.response.error({
19
- message: `Bucket is not defined.`
20
- });
21
- }
22
- const s3 = new S3();
23
-
24
- // List objects in the folder with pagination support.
25
- const filesList = await s3.listObjectsV2({
26
- Bucket: input.bucket,
27
- Prefix: `${input.folderKey}/`,
28
- ContinuationToken: input.continuationToken
29
- });
30
-
31
- // Delete all files in the folder using batch delete.
32
- if (filesList.Contents && filesList.Contents.length > 0) {
33
- const objectsToDelete = filesList.Contents.filter(file => file.Key).map(file => ({
34
- Key: file.Key
35
- }));
36
- if (objectsToDelete.length > 0) {
37
- await s3.deleteObjects({
38
- Bucket: input.bucket,
39
- Delete: {
40
- Objects: objectsToDelete
41
- }
4
+ async run({ input, controller }) {
5
+ if (controller.runtime.isAborted()) return controller.response.aborted();
6
+ if (!input.bucket) return controller.response.error({
7
+ message: "Bucket is not defined."
42
8
  });
43
- }
9
+ const s3 = new S3();
10
+ const filesList = await s3.listObjectsV2({
11
+ Bucket: input.bucket,
12
+ Prefix: `${input.folderKey}/`,
13
+ ContinuationToken: input.continuationToken
14
+ });
15
+ if (filesList.Contents && filesList.Contents.length > 0) {
16
+ const objectsToDelete = filesList.Contents.filter((file)=>file.Key).map((file)=>({
17
+ Key: file.Key
18
+ }));
19
+ if (objectsToDelete.length > 0) await s3.deleteObjects({
20
+ Bucket: input.bucket,
21
+ Delete: {
22
+ Objects: objectsToDelete
23
+ }
24
+ });
25
+ }
26
+ if (filesList.IsTruncated && filesList.NextContinuationToken) return controller.response.continue({
27
+ ...input,
28
+ continuationToken: filesList.NextContinuationToken
29
+ });
30
+ return controller.response.done();
44
31
  }
45
-
46
- // If there are more objects to delete, continue in the next iteration.
47
- if (filesList.IsTruncated && filesList.NextContinuationToken) {
48
- return controller.response.continue({
49
- ...input,
50
- continuationToken: filesList.NextContinuationToken
51
- });
32
+ constructor(){
33
+ this.id = "fileManagerFolderDelete";
34
+ this.title = "Delete folder and all of its contents from the bucket.";
35
+ this.description = "A task to delete all files from a given folder.";
36
+ this.maxIterations = 5;
37
+ this.isPrivate = true;
38
+ this.selfCleanup = [
39
+ "onSuccess",
40
+ "onAbort"
41
+ ];
52
42
  }
53
- return controller.response.done();
54
- }
55
43
  }
56
- export const DeleteS3FolderTaskDefinition = TaskDefinition.createImplementation({
57
- implementation: DeleteS3FolderTask,
58
- dependencies: []
44
+ const DeleteS3FolderTaskDefinition = TaskDefinition.createImplementation({
45
+ implementation: DeleteS3FolderTask,
46
+ dependencies: []
59
47
  });
48
+ export { DeleteS3FolderTaskDefinition };
60
49
 
61
50
  //# sourceMappingURL=DeleteS3FolderTask.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["S3","TaskDefinition","DeleteS3FolderTask","id","title","description","maxIterations","isPrivate","selfCleanup","run","input","controller","runtime","isAborted","response","aborted","bucket","error","message","s3","filesList","listObjectsV2","Bucket","Prefix","folderKey","ContinuationToken","continuationToken","Contents","length","objectsToDelete","filter","file","Key","map","deleteObjects","Delete","Objects","IsTruncated","NextContinuationToken","continue","done","DeleteS3FolderTaskDefinition","createImplementation","implementation","dependencies"],"sources":["DeleteS3FolderTask.ts"],"sourcesContent":["import { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\nexport interface DeleteS3FolderInput {\n /**\n * Caller of the task (e.g., `fm-after-delete`).\n */\n caller: string;\n /**\n * Cache paths to invalidate.\n */\n bucket: string;\n /**\n * FM file directory key to delete.\n */\n folderKey: string;\n /**\n * Continuation token for pagination.\n */\n continuationToken?: string;\n}\n\nclass DeleteS3FolderTask implements TaskDefinition.Interface<DeleteS3FolderInput> {\n id = \"fileManagerFolderDelete\";\n title = \"Delete folder and all of its contents from the bucket.\";\n description = \"A task to delete all files from a given folder.\";\n maxIterations = 5;\n isPrivate = true;\n\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n public async run({\n input,\n controller\n }: TaskDefinition.RunParams<DeleteS3FolderInput>): Promise<\n TaskDefinition.Result<DeleteS3FolderInput>\n > {\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n }\n\n if (!input.bucket) {\n return controller.response.error({ message: `Bucket is not defined.` });\n }\n\n const s3 = new S3();\n\n // List objects in the folder with pagination support.\n const filesList = await s3.listObjectsV2({\n Bucket: input.bucket,\n Prefix: `${input.folderKey}/`,\n ContinuationToken: input.continuationToken\n });\n\n // Delete all files in the folder using batch delete.\n if (filesList.Contents && filesList.Contents.length > 0) {\n const objectsToDelete = filesList.Contents.filter(file => file.Key).map(file => ({\n Key: file.Key!\n }));\n\n if (objectsToDelete.length > 0) {\n await s3.deleteObjects({\n Bucket: input.bucket,\n Delete: {\n Objects: objectsToDelete\n }\n });\n }\n }\n\n // If there are more objects to delete, continue in the next iteration.\n if (filesList.IsTruncated && filesList.NextContinuationToken) {\n return controller.response.continue({\n ...input,\n continuationToken: filesList.NextContinuationToken\n });\n }\n\n return controller.response.done();\n }\n}\n\nexport const DeleteS3FolderTaskDefinition = TaskDefinition.createImplementation({\n implementation: DeleteS3FolderTask,\n dependencies: []\n});\n"],"mappings":"AAAA,SAASA,EAAE,QAAQ,oCAAoC;AACvD,SAASC,cAAc,QAAQ,wDAAwD;AAqBvF,MAAMC,kBAAkB,CAA0D;EAC9EC,EAAE,GAAG,yBAAyB;EAC9BC,KAAK,GAAG,wDAAwD;EAChEC,WAAW,GAAG,iDAAiD;EAC/DC,aAAa,GAAG,CAAC;EACjBC,SAAS,GAAG,IAAI;EAEAC,WAAW,GAAG,CAAC,WAAW,EAAW,SAAS,CAAU;EAExE,MAAaC,GAAGA,CAAC;IACbC,KAAK;IACLC;EAC2C,CAAC,EAE9C;IACE,IAAIA,UAAU,CAACC,OAAO,CAACC,SAAS,CAAC,CAAC,EAAE;MAChC,OAAOF,UAAU,CAACG,QAAQ,CAACC,OAAO,CAAC,CAAC;IACxC;IAEA,IAAI,CAACL,KAAK,CAACM,MAAM,EAAE;MACf,OAAOL,UAAU,CAACG,QAAQ,CAACG,KAAK,CAAC;QAAEC,OAAO,EAAE;MAAyB,CAAC,CAAC;IAC3E;IAEA,MAAMC,EAAE,GAAG,IAAInB,EAAE,CAAC,CAAC;;IAEnB;IACA,MAAMoB,SAAS,GAAG,MAAMD,EAAE,CAACE,aAAa,CAAC;MACrCC,MAAM,EAAEZ,KAAK,CAACM,MAAM;MACpBO,MAAM,EAAE,GAAGb,KAAK,CAACc,SAAS,GAAG;MAC7BC,iBAAiB,EAAEf,KAAK,CAACgB;IAC7B,CAAC,CAAC;;IAEF;IACA,IAAIN,SAAS,CAACO,QAAQ,IAAIP,SAAS,CAACO,QAAQ,CAACC,MAAM,GAAG,CAAC,EAAE;MACrD,MAAMC,eAAe,GAAGT,SAAS,CAACO,QAAQ,CAACG,MAAM,CAACC,IAAI,IAAIA,IAAI,CAACC,GAAG,CAAC,CAACC,GAAG,CAACF,IAAI,KAAK;QAC7EC,GAAG,EAAED,IAAI,CAACC;MACd,CAAC,CAAC,CAAC;MAEH,IAAIH,eAAe,CAACD,MAAM,GAAG,CAAC,EAAE;QAC5B,MAAMT,EAAE,CAACe,aAAa,CAAC;UACnBZ,MAAM,EAAEZ,KAAK,CAACM,MAAM;UACpBmB,MAAM,EAAE;YACJC,OAAO,EAAEP;UACb;QACJ,CAAC,CAAC;MACN;IACJ;;IAEA;IACA,IAAIT,SAAS,CAACiB,WAAW,IAAIjB,SAAS,CAACkB,qBAAqB,EAAE;MAC1D,OAAO3B,UAAU,CAACG,QAAQ,CAACyB,QAAQ,CAAC;QAChC,GAAG7B,KAAK;QACRgB,iBAAiB,EAAEN,SAAS,CAACkB;MACjC,CAAC,CAAC;IACN;IAEA,OAAO3B,UAAU,CAACG,QAAQ,CAAC0B,IAAI,CAAC,CAAC;EACrC;AACJ;AAEA,OAAO,MAAMC,4BAA4B,GAAGxC,cAAc,CAACyC,oBAAoB,CAAC;EAC5EC,cAAc,EAAEzC,kBAAkB;EAClC0C,YAAY,EAAE;AAClB,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"features/DeleteFileFromBucket/DeleteS3FolderTask.js","sources":["../../../src/features/DeleteFileFromBucket/DeleteS3FolderTask.ts"],"sourcesContent":["import { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\nexport interface DeleteS3FolderInput {\n /**\n * Caller of the task (e.g., `fm-after-delete`).\n */\n caller: string;\n /**\n * Cache paths to invalidate.\n */\n bucket: string;\n /**\n * FM file directory key to delete.\n */\n folderKey: string;\n /**\n * Continuation token for pagination.\n */\n continuationToken?: string;\n}\n\nclass DeleteS3FolderTask implements TaskDefinition.Interface<DeleteS3FolderInput> {\n id = \"fileManagerFolderDelete\";\n title = \"Delete folder and all of its contents from the bucket.\";\n description = \"A task to delete all files from a given folder.\";\n maxIterations = 5;\n isPrivate = true;\n\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n public async run({\n input,\n controller\n }: TaskDefinition.RunParams<DeleteS3FolderInput>): Promise<\n TaskDefinition.Result<DeleteS3FolderInput>\n > {\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n }\n\n if (!input.bucket) {\n return controller.response.error({ message: `Bucket is not defined.` });\n }\n\n const s3 = new S3();\n\n // List objects in the folder with pagination support.\n const filesList = await s3.listObjectsV2({\n Bucket: input.bucket,\n Prefix: `${input.folderKey}/`,\n ContinuationToken: input.continuationToken\n });\n\n // Delete all files in the folder using batch delete.\n if (filesList.Contents && filesList.Contents.length > 0) {\n const objectsToDelete = filesList.Contents.filter(file => file.Key).map(file => ({\n Key: file.Key!\n }));\n\n if (objectsToDelete.length > 0) {\n await s3.deleteObjects({\n Bucket: input.bucket,\n Delete: {\n Objects: objectsToDelete\n }\n });\n }\n }\n\n // If there are more objects to delete, continue in the next iteration.\n if (filesList.IsTruncated && filesList.NextContinuationToken) {\n return controller.response.continue({\n ...input,\n continuationToken: filesList.NextContinuationToken\n });\n }\n\n return controller.response.done();\n }\n}\n\nexport const DeleteS3FolderTaskDefinition = TaskDefinition.createImplementation({\n implementation: DeleteS3FolderTask,\n dependencies: []\n});\n"],"names":["DeleteS3FolderTask","input","controller","s3","S3","filesList","objectsToDelete","file","DeleteS3FolderTaskDefinition","TaskDefinition"],"mappings":";;AAsBA,MAAMA;IASF,MAAa,IAAI,EACbC,KAAK,EACLC,UAAU,EACkC,EAE9C;QACE,IAAIA,WAAW,OAAO,CAAC,SAAS,IAC5B,OAAOA,WAAW,QAAQ,CAAC,OAAO;QAGtC,IAAI,CAACD,MAAM,MAAM,EACb,OAAOC,WAAW,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QAAyB;QAGzE,MAAMC,KAAK,IAAIC;QAGf,MAAMC,YAAY,MAAMF,GAAG,aAAa,CAAC;YACrC,QAAQF,MAAM,MAAM;YACpB,QAAQ,GAAGA,MAAM,SAAS,CAAC,CAAC,CAAC;YAC7B,mBAAmBA,MAAM,iBAAiB;QAC9C;QAGA,IAAII,UAAU,QAAQ,IAAIA,UAAU,QAAQ,CAAC,MAAM,GAAG,GAAG;YACrD,MAAMC,kBAAkBD,UAAU,QAAQ,CAAC,MAAM,CAACE,CAAAA,OAAQA,KAAK,GAAG,EAAE,GAAG,CAACA,CAAAA,OAAS;oBAC7E,KAAKA,KAAK,GAAG;gBACjB;YAEA,IAAID,gBAAgB,MAAM,GAAG,GACzB,MAAMH,GAAG,aAAa,CAAC;gBACnB,QAAQF,MAAM,MAAM;gBACpB,QAAQ;oBACJ,SAASK;gBACb;YACJ;QAER;QAGA,IAAID,UAAU,WAAW,IAAIA,UAAU,qBAAqB,EACxD,OAAOH,WAAW,QAAQ,CAAC,QAAQ,CAAC;YAChC,GAAGD,KAAK;YACR,mBAAmBI,UAAU,qBAAqB;QACtD;QAGJ,OAAOH,WAAW,QAAQ,CAAC,IAAI;IACnC;;aAxDA,EAAE,GAAG;aACL,KAAK,GAAG;aACR,WAAW,GAAG;aACd,aAAa,GAAG;aAChB,SAAS,GAAG;aAEI,WAAW,GAAG;YAAC;YAAsB;SAAmB;;AAmD5E;AAEO,MAAMM,+BAA+BC,eAAe,oBAAoB,CAAC;IAC5E,gBAAgBT;IAChB,cAAc,EAAE;AACpB"}
@@ -1,12 +1,13 @@
1
1
  import { createFeature } from "@webiny/feature/api";
2
2
  import { DeleteFileFromBucketHandler } from "./DeleteFileFromBucketHandler.js";
3
3
  import { DeleteS3FolderTaskDefinition } from "./DeleteS3FolderTask.js";
4
- export const DeleteFileFromBucketFeature = createFeature({
5
- name: "FileManagerS3/DeleteFileFromBucket",
6
- register(container) {
7
- container.register(DeleteFileFromBucketHandler);
8
- container.register(DeleteS3FolderTaskDefinition);
9
- }
4
+ const DeleteFileFromBucketFeature = createFeature({
5
+ name: "FileManagerS3/DeleteFileFromBucket",
6
+ register (container) {
7
+ container.register(DeleteFileFromBucketHandler);
8
+ container.register(DeleteS3FolderTaskDefinition);
9
+ }
10
10
  });
11
+ export { DeleteFileFromBucketFeature };
11
12
 
12
13
  //# sourceMappingURL=feature.js.map