@webiny/api-file-manager-s3 0.0.0-unstable.e6f0dc8ca7 → 0.0.0-unstable.eb81deee7e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/FileManagerS3Feature.d.ts +9 -0
- package/FileManagerS3Feature.js +27 -0
- package/FileManagerS3Feature.js.map +1 -0
- package/assetDelivery/abstractions.d.ts +11 -0
- package/assetDelivery/abstractions.js +7 -0
- package/assetDelivery/abstractions.js.map +1 -0
- package/assetDelivery/assetDeliveryConfig.d.ts +1 -1
- package/assetDelivery/assetDeliveryConfig.js +10 -44
- package/assetDelivery/assetDeliveryConfig.js.map +1 -1
- package/assetDelivery/createAssetDelivery.js +5 -19
- package/assetDelivery/createAssetDelivery.js.map +1 -1
- package/assetDelivery/feature.d.ts +5 -0
- package/assetDelivery/feature.js +36 -0
- package/assetDelivery/feature.js.map +1 -0
- package/assetDelivery/index.js +0 -2
- package/assetDelivery/s3/LazySharpTransform.d.ts +34 -0
- package/assetDelivery/s3/LazySharpTransform.js +34 -0
- package/assetDelivery/s3/LazySharpTransform.js.map +1 -0
- package/assetDelivery/s3/S3AssetResolver.d.ts +3 -0
- package/assetDelivery/s3/S3AssetResolver.js +32 -22
- package/assetDelivery/s3/S3AssetResolver.js.map +1 -1
- package/assetDelivery/s3/S3ContentsReader.js +13 -16
- package/assetDelivery/s3/S3ContentsReader.js.map +1 -1
- package/assetDelivery/s3/S3ErrorAssetReply.js +10 -9
- package/assetDelivery/s3/S3ErrorAssetReply.js.map +1 -1
- package/assetDelivery/s3/S3OutputStrategy.d.ts +5 -5
- package/assetDelivery/s3/S3OutputStrategy.js +33 -27
- package/assetDelivery/s3/S3OutputStrategy.js.map +1 -1
- package/assetDelivery/s3/S3RedirectAssetReply.js +12 -11
- package/assetDelivery/s3/S3RedirectAssetReply.js.map +1 -1
- package/assetDelivery/s3/S3StreamAssetReply.js +12 -11
- package/assetDelivery/s3/S3StreamAssetReply.js.map +1 -1
- package/assetDelivery/s3/SharpTransform.d.ts +21 -13
- package/assetDelivery/s3/SharpTransform.js +164 -173
- package/assetDelivery/s3/SharpTransform.js.map +1 -1
- package/assetDelivery/s3/transformation/AssetKeyGenerator.js +18 -17
- package/assetDelivery/s3/transformation/AssetKeyGenerator.js.map +1 -1
- package/assetDelivery/s3/transformation/CallableContentsReader.js +8 -7
- package/assetDelivery/s3/transformation/CallableContentsReader.js.map +1 -1
- package/assetDelivery/s3/transformation/WidthCollection.js +15 -16
- package/assetDelivery/s3/transformation/WidthCollection.js.map +1 -1
- package/assetDelivery/s3/transformation/utils.js +24 -30
- package/assetDelivery/s3/transformation/utils.js.map +1 -1
- package/assetDelivery/threatDetection/ObjectKey.js +15 -14
- package/assetDelivery/threatDetection/ObjectKey.js.map +1 -1
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.d.ts +21 -1
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js +46 -44
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js.map +1 -1
- package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js +2 -3
- package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js.map +1 -1
- package/assetDelivery/threatDetection/index.js +0 -2
- package/assetDelivery/threatDetection/processThreatScanResult.js +51 -55
- package/assetDelivery/threatDetection/processThreatScanResult.js.map +1 -1
- package/assetDelivery/threatDetection/types.js +0 -3
- package/assetDelivery/types.d.ts +3 -0
- package/assetDelivery/types.js +0 -3
- package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.d.ts +3 -1
- package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js +22 -13
- package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js.map +1 -1
- package/enterprise/ApplyThreatScanning/feature.js +6 -5
- package/enterprise/ApplyThreatScanning/feature.js.map +1 -1
- package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js +26 -27
- package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js.map +1 -1
- package/features/DeleteFileFromBucket/DeleteS3FolderTask.d.ts +9 -4
- package/features/DeleteFileFromBucket/DeleteS3FolderTask.js +49 -53
- package/features/DeleteFileFromBucket/DeleteS3FolderTask.js.map +1 -1
- package/features/DeleteFileFromBucket/feature.js +7 -6
- package/features/DeleteFileFromBucket/feature.js.map +1 -1
- package/features/ExtractMetadata/ExtractMetadataHandler.js +18 -19
- package/features/ExtractMetadata/ExtractMetadataHandler.js.map +1 -1
- package/features/ExtractMetadata/ExtractMetadataTask.d.ts +11 -6
- package/features/ExtractMetadata/ExtractMetadataTask.js +86 -116
- package/features/ExtractMetadata/ExtractMetadataTask.js.map +1 -1
- package/features/ExtractMetadata/feature.js +7 -6
- package/features/ExtractMetadata/feature.js.map +1 -1
- package/features/FlushCache/FlushCacheOnFileDeleteHandler.js +20 -19
- package/features/FlushCache/FlushCacheOnFileDeleteHandler.js.map +1 -1
- package/features/FlushCache/FlushCacheOnFileUpdateHandler.js +22 -26
- package/features/FlushCache/FlushCacheOnFileUpdateHandler.js.map +1 -1
- package/features/FlushCache/InvalidateCacheTask.d.ts +11 -6
- package/features/FlushCache/InvalidateCacheTask.js +75 -78
- package/features/FlushCache/InvalidateCacheTask.js.map +1 -1
- package/features/FlushCache/feature.js +8 -7
- package/features/FlushCache/feature.js.map +1 -1
- package/features/GetFileContentsById/GetFileContentsByIdUseCase.d.ts +13 -0
- package/features/GetFileContentsById/GetFileContentsByIdUseCase.js +40 -0
- package/features/GetFileContentsById/GetFileContentsByIdUseCase.js.map +1 -0
- package/features/{GetFileContents → GetFileContentsById}/feature.d.ts +1 -1
- package/features/GetFileContentsById/feature.js +11 -0
- package/features/GetFileContentsById/feature.js.map +1 -0
- package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.d.ts +13 -0
- package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.js +40 -0
- package/features/GetFileContentsByKey/GetFileContentsByKeyUseCase.js.map +1 -0
- package/features/GetFileContentsByKey/feature.d.ts +4 -0
- package/features/GetFileContentsByKey/feature.js +11 -0
- package/features/GetFileContentsByKey/feature.js.map +1 -0
- package/features/WriteFileMetadata/MetadataReader.js +9 -10
- package/features/WriteFileMetadata/MetadataReader.js.map +1 -1
- package/features/WriteFileMetadata/MetadataWriter.js +25 -25
- package/features/WriteFileMetadata/MetadataWriter.js.map +1 -1
- package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js +14 -12
- package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js.map +1 -1
- package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js +16 -12
- package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js.map +1 -1
- package/features/WriteFileMetadata/feature.js +7 -6
- package/features/WriteFileMetadata/feature.js.map +1 -1
- package/graphql/S3GraphQLSchema.d.ts +10 -0
- package/graphql/S3GraphQLSchema.js +233 -0
- package/graphql/S3GraphQLSchema.js.map +1 -0
- package/graphql/checkPermissions.js +17 -32
- package/graphql/checkPermissions.js.map +1 -1
- package/index.d.ts +2 -2
- package/index.js +1 -25
- package/multiPartUpload/CompleteMultiPartUploadUseCase.js +50 -53
- package/multiPartUpload/CompleteMultiPartUploadUseCase.js.map +1 -1
- package/multiPartUpload/CreateMultiPartUploadUseCase.js +31 -38
- package/multiPartUpload/CreateMultiPartUploadUseCase.js.map +1 -1
- package/package.json +27 -23
- package/types.d.ts +1 -1
- package/types.js +1 -3
- package/utils/CdnPathsGenerator.js +8 -4
- package/utils/CdnPathsGenerator.js.map +1 -1
- package/utils/FileExtension.js +12 -13
- package/utils/FileExtension.js.map +1 -1
- package/utils/FileKey.js +29 -21
- package/utils/FileKey.js.map +1 -1
- package/utils/FileKey.test.js +49 -49
- package/utils/FileKey.test.js.map +1 -1
- package/utils/FileNormalizer.js +31 -46
- package/utils/FileNormalizer.js.map +1 -1
- package/utils/FileUploadModifier.d.ts +8 -2
- package/utils/FileUploadModifier.js +35 -33
- package/utils/FileUploadModifier.js.map +1 -1
- package/utils/createFileNormalizerFromContext.js +5 -4
- package/utils/createFileNormalizerFromContext.js.map +1 -1
- package/utils/getPresignedPostPayload.js +36 -33
- package/utils/getPresignedPostPayload.js.map +1 -1
- package/utils/mimeTypes.js +6 -10
- package/utils/mimeTypes.js.map +1 -1
- package/utils/uploadFileToS3.d.ts +1 -1
- package/utils/uploadFileToS3.js +11 -10
- package/utils/uploadFileToS3.js.map +1 -1
- package/assetDelivery/index.js.map +0 -1
- package/assetDelivery/threatDetection/index.js.map +0 -1
- package/assetDelivery/threatDetection/types.js.map +0 -1
- package/assetDelivery/types.js.map +0 -1
- package/features/GetFileContents/GetFileContentsUseCase.d.ts +0 -13
- package/features/GetFileContents/GetFileContentsUseCase.js +0 -41
- package/features/GetFileContents/GetFileContentsUseCase.js.map +0 -1
- package/features/GetFileContents/feature.js +0 -10
- package/features/GetFileContents/feature.js.map +0 -1
- package/graphql/schema.d.ts +0 -1
- package/graphql/schema.js +0 -204
- package/graphql/schema.js.map +0 -1
- package/index.js.map +0 -1
- package/types.js.map +0 -1
|
@@ -1,19 +1,28 @@
|
|
|
1
1
|
import { CreateFileUseCase } from "@webiny/api-file-manager/features/file/CreateFile/abstractions.js";
|
|
2
|
+
import { FeatureFlags } from "@webiny/api-core/features/featureFlags/abstractions.js";
|
|
2
3
|
class CreateFileWithThreatScanDecoratorImpl {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
4
|
+
constructor(featureFlags, decoratee){
|
|
5
|
+
this.featureFlags = featureFlags;
|
|
6
|
+
this.decoratee = decoratee;
|
|
7
|
+
}
|
|
8
|
+
async execute(input, meta) {
|
|
9
|
+
if (!this.featureFlags.get().isEnabled("fileManager.threatDetection")) return this.decoratee.execute(input, meta);
|
|
10
|
+
const modifiedInput = {
|
|
11
|
+
...input,
|
|
12
|
+
tags: [
|
|
13
|
+
...input.tags || [],
|
|
14
|
+
"threatScanInProgress"
|
|
15
|
+
]
|
|
16
|
+
};
|
|
17
|
+
return this.decoratee.execute(modifiedInput, meta);
|
|
18
|
+
}
|
|
13
19
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
20
|
+
const CreateFileWithThreatScanDecorator = CreateFileUseCase.createDecorator({
|
|
21
|
+
decorator: CreateFileWithThreatScanDecoratorImpl,
|
|
22
|
+
dependencies: [
|
|
23
|
+
FeatureFlags
|
|
24
|
+
]
|
|
17
25
|
});
|
|
26
|
+
export { CreateFileWithThreatScanDecorator };
|
|
18
27
|
|
|
19
28
|
//# sourceMappingURL=CreateFileWithThreatScanDecorator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js","sources":["../../../src/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.ts"],"sourcesContent":["import { CreateFileUseCase } from \"@webiny/api-file-manager/features/file/CreateFile/abstractions.js\";\nimport type { CreateFileInput } from \"@webiny/api-file-manager/features/file/CreateFile/abstractions.js\";\nimport { FeatureFlags } from \"@webiny/api-core/features/featureFlags/abstractions.js\";\n\nclass CreateFileWithThreatScanDecoratorImpl implements CreateFileUseCase.Interface {\n constructor(\n private featureFlags: FeatureFlags.Interface,\n private decoratee: CreateFileUseCase.Interface\n ) {}\n\n async execute(\n input: CreateFileInput,\n meta?: Record<string, any>\n ): ReturnType<CreateFileUseCase.Interface[\"execute\"]> {\n if (!this.featureFlags.get().isEnabled(\"fileManager.threatDetection\")) {\n return this.decoratee.execute(input, meta);\n }\n\n const modifiedInput: CreateFileInput = {\n ...input,\n tags: [...(input.tags || []), \"threatScanInProgress\"]\n };\n\n return this.decoratee.execute(modifiedInput, meta);\n }\n}\n\nexport const CreateFileWithThreatScanDecorator = CreateFileUseCase.createDecorator({\n decorator: CreateFileWithThreatScanDecoratorImpl,\n dependencies: [FeatureFlags]\n});\n"],"names":["CreateFileWithThreatScanDecoratorImpl","featureFlags","decoratee","input","meta","modifiedInput","CreateFileWithThreatScanDecorator","CreateFileUseCase","FeatureFlags"],"mappings":";;AAIA,MAAMA;IACF,YACYC,YAAoC,EACpCC,SAAsC,CAChD;aAFUD,YAAY,GAAZA;aACAC,SAAS,GAATA;IACT;IAEH,MAAM,QACFC,KAAsB,EACtBC,IAA0B,EACwB;QAClD,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,GAAG,SAAS,CAAC,gCACnC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAACD,OAAOC;QAGzC,MAAMC,gBAAiC;YACnC,GAAGF,KAAK;YACR,MAAM;mBAAKA,MAAM,IAAI,IAAI,EAAE;gBAAG;aAAuB;QACzD;QAEA,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAACE,eAAeD;IACjD;AACJ;AAEO,MAAME,oCAAoCC,kBAAkB,eAAe,CAAC;IAC/E,WAAWP;IACX,cAAc;QAACQ;KAAa;AAChC"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { createFeature } from "@webiny/feature/api";
|
|
2
2
|
import { CreateFileWithThreatScanDecorator } from "./CreateFileWithThreatScanDecorator.js";
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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,"
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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,"
|
|
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,4 +1,4 @@
|
|
|
1
|
-
import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
1
|
+
import { TaskDefinition, TaskHandler } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
2
2
|
export interface DeleteS3FolderInput {
|
|
3
3
|
/**
|
|
4
4
|
* Caller of the task (e.g., `fm-after-delete`).
|
|
@@ -17,14 +17,19 @@ export interface DeleteS3FolderInput {
|
|
|
17
17
|
*/
|
|
18
18
|
continuationToken?: string;
|
|
19
19
|
}
|
|
20
|
-
declare class
|
|
20
|
+
declare class DeleteS3FolderTaskHandlerImpl implements TaskHandler.Interface<DeleteS3FolderInput> {
|
|
21
|
+
run({ input, controller }: TaskHandler.RunParams<DeleteS3FolderInput>): Promise<TaskDefinition.Result<DeleteS3FolderInput>>;
|
|
22
|
+
}
|
|
23
|
+
declare class DeleteS3FolderTask implements TaskDefinition.Interface {
|
|
21
24
|
id: string;
|
|
22
25
|
title: string;
|
|
23
26
|
description: string;
|
|
24
27
|
maxIterations: number;
|
|
25
28
|
isPrivate: boolean;
|
|
26
|
-
readonly selfCleanup: ("
|
|
27
|
-
|
|
29
|
+
readonly selfCleanup: ("onAbort" | "onSuccess")[];
|
|
30
|
+
handler: typeof DeleteS3FolderTaskHandlerImpl & {
|
|
31
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskHandler<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
|
|
32
|
+
};
|
|
28
33
|
}
|
|
29
34
|
export declare const DeleteS3FolderTaskDefinition: typeof DeleteS3FolderTask & {
|
|
30
35
|
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskDefinition<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
|
|
@@ -1,61 +1,57 @@
|
|
|
1
1
|
import { S3 } from "@webiny/aws-sdk/client-s3/index.js";
|
|
2
|
-
import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
3
|
-
class
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
}
|
|
2
|
+
import { TaskDefinition, TaskHandler } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
3
|
+
class DeleteS3FolderTaskHandlerImpl {
|
|
4
|
+
async run({ input, controller }) {
|
|
5
|
+
if (controller.runtime.isAborted()) return controller.response.aborted();
|
|
6
|
+
if (!input.bucket) return controller.response.error({
|
|
7
|
+
message: "Bucket is not defined."
|
|
8
|
+
});
|
|
9
|
+
const s3 = new S3();
|
|
10
|
+
const filesList = await s3.listObjectsV2({
|
|
11
|
+
Bucket: input.bucket,
|
|
12
|
+
Prefix: `${input.folderKey}/`,
|
|
13
|
+
ContinuationToken: input.continuationToken
|
|
42
14
|
});
|
|
43
|
-
|
|
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
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
32
|
+
}
|
|
33
|
+
const DeleteS3FolderTaskHandler = TaskHandler.createImplementation({
|
|
34
|
+
implementation: DeleteS3FolderTaskHandlerImpl,
|
|
35
|
+
dependencies: []
|
|
36
|
+
});
|
|
37
|
+
class DeleteS3FolderTask {
|
|
38
|
+
constructor(){
|
|
39
|
+
this.id = "fileManagerFolderDelete";
|
|
40
|
+
this.title = "Delete folder and all of its contents from the bucket.";
|
|
41
|
+
this.description = "A task to delete all files from a given folder.";
|
|
42
|
+
this.maxIterations = 5;
|
|
43
|
+
this.isPrivate = true;
|
|
44
|
+
this.selfCleanup = [
|
|
45
|
+
"onSuccess",
|
|
46
|
+
"onAbort"
|
|
47
|
+
];
|
|
48
|
+
this.handler = DeleteS3FolderTaskHandler;
|
|
52
49
|
}
|
|
53
|
-
return controller.response.done();
|
|
54
|
-
}
|
|
55
50
|
}
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
51
|
+
const DeleteS3FolderTaskDefinition = TaskDefinition.createImplementation({
|
|
52
|
+
implementation: DeleteS3FolderTask,
|
|
53
|
+
dependencies: []
|
|
59
54
|
});
|
|
55
|
+
export { DeleteS3FolderTaskDefinition };
|
|
60
56
|
|
|
61
57
|
//# sourceMappingURL=DeleteS3FolderTask.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/DeleteFileFromBucket/DeleteS3FolderTask.js","sources":["../../../src/features/DeleteFileFromBucket/DeleteS3FolderTask.ts"],"sourcesContent":["import { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport {\n TaskDefinition,\n TaskHandler\n} from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\nexport interface DeleteS3FolderInput {\n /**\n * Caller of the task (e.g., `fm-after-delete`).\n */\n caller: string;\n /**\n * Cache paths to invalidate.\n */\n bucket: string;\n /**\n * FM file directory key to delete.\n */\n folderKey: string;\n /**\n * Continuation token for pagination.\n */\n continuationToken?: string;\n}\n\nclass DeleteS3FolderTaskHandlerImpl implements TaskHandler.Interface<DeleteS3FolderInput> {\n public async run({\n input,\n controller\n }: TaskHandler.RunParams<DeleteS3FolderInput>): Promise<\n TaskDefinition.Result<DeleteS3FolderInput>\n > {\n if (controller.runtime.isAborted()) {\n return controller.response.aborted();\n }\n\n if (!input.bucket) {\n return controller.response.error({ message: `Bucket is not defined.` });\n }\n\n const s3 = new S3();\n\n // List objects in the folder with pagination support.\n const filesList = await s3.listObjectsV2({\n Bucket: input.bucket,\n Prefix: `${input.folderKey}/`,\n ContinuationToken: input.continuationToken\n });\n\n // Delete all files in the folder using batch delete.\n if (filesList.Contents && filesList.Contents.length > 0) {\n const objectsToDelete = filesList.Contents.filter(file => file.Key).map(file => ({\n Key: file.Key!\n }));\n\n if (objectsToDelete.length > 0) {\n await s3.deleteObjects({\n Bucket: input.bucket,\n Delete: {\n Objects: objectsToDelete\n }\n });\n }\n }\n\n // If there are more objects to delete, continue in the next iteration.\n if (filesList.IsTruncated && filesList.NextContinuationToken) {\n return controller.response.continue({\n ...input,\n continuationToken: filesList.NextContinuationToken\n });\n }\n\n return controller.response.done();\n }\n}\n\nconst DeleteS3FolderTaskHandler = TaskHandler.createImplementation({\n implementation: DeleteS3FolderTaskHandlerImpl,\n dependencies: []\n});\n\nclass DeleteS3FolderTask implements TaskDefinition.Interface {\n id = \"fileManagerFolderDelete\";\n title = \"Delete folder and all of its contents from the bucket.\";\n description = \"A task to delete all files from a given folder.\";\n maxIterations = 5;\n isPrivate = true;\n public readonly selfCleanup = [\"onSuccess\" as const, \"onAbort\" as const];\n\n handler = DeleteS3FolderTaskHandler;\n}\n\nexport const DeleteS3FolderTaskDefinition = TaskDefinition.createImplementation({\n implementation: DeleteS3FolderTask,\n dependencies: []\n});\n"],"names":["DeleteS3FolderTaskHandlerImpl","input","controller","s3","S3","filesList","objectsToDelete","file","DeleteS3FolderTaskHandler","TaskHandler","DeleteS3FolderTask","DeleteS3FolderTaskDefinition","TaskDefinition"],"mappings":";;AAyBA,MAAMA;IACF,MAAa,IAAI,EACbC,KAAK,EACLC,UAAU,EAC+B,EAE3C;QACE,IAAIA,WAAW,OAAO,CAAC,SAAS,IAC5B,OAAOA,WAAW,QAAQ,CAAC,OAAO;QAGtC,IAAI,CAACD,MAAM,MAAM,EACb,OAAOC,WAAW,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QAAyB;QAGzE,MAAMC,KAAK,IAAIC;QAGf,MAAMC,YAAY,MAAMF,GAAG,aAAa,CAAC;YACrC,QAAQF,MAAM,MAAM;YACpB,QAAQ,GAAGA,MAAM,SAAS,CAAC,CAAC,CAAC;YAC7B,mBAAmBA,MAAM,iBAAiB;QAC9C;QAGA,IAAII,UAAU,QAAQ,IAAIA,UAAU,QAAQ,CAAC,MAAM,GAAG,GAAG;YACrD,MAAMC,kBAAkBD,UAAU,QAAQ,CAAC,MAAM,CAACE,CAAAA,OAAQA,KAAK,GAAG,EAAE,GAAG,CAACA,CAAAA,OAAS;oBAC7E,KAAKA,KAAK,GAAG;gBACjB;YAEA,IAAID,gBAAgB,MAAM,GAAG,GACzB,MAAMH,GAAG,aAAa,CAAC;gBACnB,QAAQF,MAAM,MAAM;gBACpB,QAAQ;oBACJ,SAASK;gBACb;YACJ;QAER;QAGA,IAAID,UAAU,WAAW,IAAIA,UAAU,qBAAqB,EACxD,OAAOH,WAAW,QAAQ,CAAC,QAAQ,CAAC;YAChC,GAAGD,KAAK;YACR,mBAAmBI,UAAU,qBAAqB;QACtD;QAGJ,OAAOH,WAAW,QAAQ,CAAC,IAAI;IACnC;AACJ;AAEA,MAAMM,4BAA4BC,YAAY,oBAAoB,CAAC;IAC/D,gBAAgBT;IAChB,cAAc,EAAE;AACpB;AAEA,MAAMU;;aACF,EAAE,GAAG;aACL,KAAK,GAAG;aACR,WAAW,GAAG;aACd,aAAa,GAAG;aAChB,SAAS,GAAG;aACI,WAAW,GAAG;YAAC;YAAsB;SAAmB;aAExE,OAAO,GAAGF;;AACd;AAEO,MAAMG,+BAA+BC,eAAe,oBAAoB,CAAC;IAC5E,gBAAgBF;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -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
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/DeleteFileFromBucket/feature.js","sources":["../../../src/features/DeleteFileFromBucket/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { DeleteFileFromBucketHandler } from \"./DeleteFileFromBucketHandler.js\";\nimport { DeleteS3FolderTaskDefinition } from \"./DeleteS3FolderTask.js\";\n\nexport const DeleteFileFromBucketFeature = createFeature({\n name: \"FileManagerS3/DeleteFileFromBucket\",\n register(container) {\n container.register(DeleteFileFromBucketHandler);\n container.register(DeleteS3FolderTaskDefinition);\n }\n});\n"],"names":["DeleteFileFromBucketFeature","createFeature","container","DeleteFileFromBucketHandler","DeleteS3FolderTaskDefinition"],"mappings":";;;AAIO,MAAMA,8BAA8BC,cAAc;IACrD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;IACvB;AACJ"}
|
|
@@ -1,26 +1,25 @@
|
|
|
1
1
|
import { FileAfterCreateEventHandler } from "@webiny/api-file-manager/features/file/CreateFile/events.js";
|
|
2
2
|
import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js";
|
|
3
3
|
class ExtractMetadataHandlerImpl {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
fileId: file.id
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
}
|
|
4
|
+
constructor(taskService){
|
|
5
|
+
this.taskService = taskService;
|
|
6
|
+
}
|
|
7
|
+
async handle(event) {
|
|
8
|
+
const { file } = event.payload;
|
|
9
|
+
await this.taskService.trigger({
|
|
10
|
+
definition: "fileManagerExtractMetadata",
|
|
11
|
+
input: {
|
|
12
|
+
fileId: file.id
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
}
|
|
20
16
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
const ExtractMetadataHandler = FileAfterCreateEventHandler.createImplementation({
|
|
18
|
+
implementation: ExtractMetadataHandlerImpl,
|
|
19
|
+
dependencies: [
|
|
20
|
+
TaskService
|
|
21
|
+
]
|
|
24
22
|
});
|
|
23
|
+
export { ExtractMetadataHandler };
|
|
25
24
|
|
|
26
25
|
//# sourceMappingURL=ExtractMetadataHandler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/ExtractMetadata/ExtractMetadataHandler.js","sources":["../../../src/features/ExtractMetadata/ExtractMetadataHandler.ts"],"sourcesContent":["import { FileAfterCreateEventHandler } from \"@webiny/api-file-manager/features/file/CreateFile/events.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport type { ExtractMetadataInput } from \"./ExtractMetadataTask.js\";\n\nclass ExtractMetadataHandlerImpl implements FileAfterCreateEventHandler.Interface {\n constructor(private taskService: TaskService.Interface) {}\n\n async handle(event: FileAfterCreateEventHandler.Event): Promise<void> {\n const { file } = event.payload;\n\n // Trigger the metadata extraction task\n await this.taskService.trigger<ExtractMetadataInput>({\n definition: \"fileManagerExtractMetadata\",\n input: {\n fileId: file.id\n }\n });\n }\n}\n\nexport const ExtractMetadataHandler = FileAfterCreateEventHandler.createImplementation({\n implementation: ExtractMetadataHandlerImpl,\n dependencies: [TaskService]\n});\n"],"names":["ExtractMetadataHandlerImpl","taskService","event","file","ExtractMetadataHandler","FileAfterCreateEventHandler","TaskService"],"mappings":";;AAIA,MAAMA;IACF,YAAoBC,WAAkC,CAAE;aAApCA,WAAW,GAAXA;IAAqC;IAEzD,MAAM,OAAOC,KAAwC,EAAiB;QAClE,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAM,OAAO;QAG9B,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAuB;YACjD,YAAY;YACZ,OAAO;gBACH,QAAQC,KAAK,EAAE;YACnB;QACJ;IACJ;AACJ;AAEO,MAAMC,yBAAyBC,4BAA4B,oBAAoB,CAAC;IACnF,gBAAgBL;IAChB,cAAc;QAACM;KAAY;AAC/B"}
|
|
@@ -1,22 +1,27 @@
|
|
|
1
|
-
import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
1
|
+
import { TaskDefinition, TaskHandler } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
2
2
|
import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
|
|
3
3
|
import { UpdateFileUseCase } from "@webiny/api-file-manager/features/file/UpdateFile/index.js";
|
|
4
4
|
export interface ExtractMetadataInput {
|
|
5
5
|
fileId: string;
|
|
6
6
|
}
|
|
7
|
-
declare class
|
|
7
|
+
declare class ExtractMetadataTaskHandlerImpl implements TaskHandler.Interface<ExtractMetadataInput> {
|
|
8
8
|
private keyValueStore;
|
|
9
9
|
private updateFileUseCase;
|
|
10
|
+
constructor(keyValueStore: GlobalKeyValueStore.Interface, updateFileUseCase: UpdateFileUseCase.Interface);
|
|
11
|
+
run({ input, controller }: TaskHandler.RunParams<ExtractMetadataInput>): Promise<TaskDefinition.Result<ExtractMetadataInput>>;
|
|
12
|
+
private cleanValues;
|
|
13
|
+
}
|
|
14
|
+
declare class ExtractMetadataTask implements TaskDefinition.Interface {
|
|
10
15
|
id: string;
|
|
11
16
|
title: string;
|
|
12
17
|
description: string;
|
|
13
18
|
maxIterations: number;
|
|
14
19
|
isPrivate: boolean;
|
|
15
20
|
databaseLogs: boolean;
|
|
16
|
-
selfCleanup: ("
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
21
|
+
selfCleanup: ("onAbort" | "onSuccess")[];
|
|
22
|
+
handler: typeof ExtractMetadataTaskHandlerImpl & {
|
|
23
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskHandler<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskOutput>>;
|
|
24
|
+
};
|
|
20
25
|
}
|
|
21
26
|
export declare const ExtractMetadataTaskDefinition: typeof ExtractMetadataTask & {
|
|
22
27
|
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskDefinition<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskOutput>>;
|