@webiny/api-file-manager-s3 0.0.0-unstable.78f581c1d2 → 0.0.0-unstable.7be00a75a9
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/README.md +11 -1
- package/assetDelivery/abstractions.d.ts +9 -0
- package/assetDelivery/abstractions.js +7 -0
- package/assetDelivery/abstractions.js.map +1 -0
- package/assetDelivery/assetDeliveryConfig.d.ts +2 -0
- package/assetDelivery/assetDeliveryConfig.js +15 -0
- package/assetDelivery/assetDeliveryConfig.js.map +1 -0
- package/assetDelivery/createAssetDelivery.d.ts +3 -0
- package/assetDelivery/createAssetDelivery.js +9 -0
- package/assetDelivery/createAssetDelivery.js.map +1 -0
- package/assetDelivery/feature.d.ts +5 -0
- package/assetDelivery/feature.js +37 -0
- package/assetDelivery/feature.js.map +1 -0
- package/assetDelivery/index.d.ts +8 -0
- package/assetDelivery/index.js +8 -0
- package/assetDelivery/s3/S3AssetResolver.d.ts +14 -0
- package/assetDelivery/s3/S3AssetResolver.js +39 -0
- package/assetDelivery/s3/S3AssetResolver.js.map +1 -0
- package/assetDelivery/s3/S3ContentsReader.d.ts +8 -0
- package/assetDelivery/s3/S3ContentsReader.js +17 -0
- package/assetDelivery/s3/S3ContentsReader.js.map +1 -0
- package/assetDelivery/s3/S3ErrorAssetReply.d.ts +4 -0
- package/assetDelivery/s3/S3ErrorAssetReply.js +14 -0
- package/assetDelivery/s3/S3ErrorAssetReply.js.map +1 -0
- package/assetDelivery/s3/S3OutputStrategy.d.ts +15 -0
- package/assetDelivery/s3/S3OutputStrategy.js +40 -0
- package/assetDelivery/s3/S3OutputStrategy.js.map +1 -0
- package/assetDelivery/s3/S3RedirectAssetReply.d.ts +4 -0
- package/assetDelivery/s3/S3RedirectAssetReply.js +17 -0
- package/assetDelivery/s3/S3RedirectAssetReply.js.map +1 -0
- package/assetDelivery/s3/S3StreamAssetReply.d.ts +5 -0
- package/assetDelivery/s3/S3StreamAssetReply.js +17 -0
- package/assetDelivery/s3/S3StreamAssetReply.js.map +1 -0
- package/assetDelivery/s3/SharpTransform.d.ts +18 -0
- package/assetDelivery/s3/SharpTransform.js +162 -0
- package/assetDelivery/s3/SharpTransform.js.map +1 -0
- package/assetDelivery/s3/transformation/AssetKeyGenerator.d.ts +8 -0
- package/assetDelivery/s3/transformation/AssetKeyGenerator.js +21 -0
- package/assetDelivery/s3/transformation/AssetKeyGenerator.js.map +1 -0
- package/assetDelivery/s3/transformation/CallableContentsReader.d.ts +10 -0
- package/assetDelivery/s3/transformation/CallableContentsReader.js +11 -0
- package/assetDelivery/s3/transformation/CallableContentsReader.js.map +1 -0
- package/assetDelivery/s3/transformation/WidthCollection.d.ts +7 -0
- package/assetDelivery/s3/transformation/WidthCollection.js +19 -0
- package/assetDelivery/s3/transformation/WidthCollection.js.map +1 -0
- package/assetDelivery/s3/transformation/utils.d.ts +9 -0
- package/assetDelivery/s3/transformation/utils.js +31 -0
- package/assetDelivery/s3/transformation/utils.js.map +1 -0
- package/assetDelivery/threatDetection/ObjectKey.d.ts +7 -0
- package/assetDelivery/threatDetection/ObjectKey.js +18 -0
- package/assetDelivery/threatDetection/ObjectKey.js.map +1 -0
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.d.ts +2 -0
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js +37 -0
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js.map +1 -0
- package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.d.ts +2 -0
- package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js +5 -0
- package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js.map +1 -0
- package/assetDelivery/threatDetection/index.d.ts +2 -0
- package/assetDelivery/threatDetection/index.js +2 -0
- package/assetDelivery/threatDetection/processThreatScanResult.d.ts +3 -0
- package/assetDelivery/threatDetection/processThreatScanResult.js +59 -0
- package/assetDelivery/threatDetection/processThreatScanResult.js.map +1 -0
- package/assetDelivery/threatDetection/types.d.ts +9 -0
- package/assetDelivery/threatDetection/types.js +0 -0
- package/assetDelivery/types.d.ts +10 -0
- package/assetDelivery/types.js +0 -0
- package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.d.ts +11 -0
- package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js +23 -0
- package/enterprise/ApplyThreatScanning/CreateFileWithThreatScanDecorator.js.map +1 -0
- package/enterprise/ApplyThreatScanning/feature.d.ts +4 -0
- package/enterprise/ApplyThreatScanning/feature.js +11 -0
- package/enterprise/ApplyThreatScanning/feature.js.map +1 -0
- package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.d.ts +15 -0
- package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js +35 -0
- package/features/DeleteFileFromBucket/DeleteFileFromBucketHandler.js.map +1 -0
- package/features/DeleteFileFromBucket/DeleteS3FolderTask.d.ts +32 -0
- package/features/DeleteFileFromBucket/DeleteS3FolderTask.js +50 -0
- package/features/DeleteFileFromBucket/DeleteS3FolderTask.js.map +1 -0
- package/features/DeleteFileFromBucket/feature.d.ts +4 -0
- package/features/DeleteFileFromBucket/feature.js +13 -0
- package/features/DeleteFileFromBucket/feature.js.map +1 -0
- package/features/ExtractMetadata/ExtractMetadataHandler.d.ts +11 -0
- package/features/ExtractMetadata/ExtractMetadataHandler.js +25 -0
- package/features/ExtractMetadata/ExtractMetadataHandler.js.map +1 -0
- package/features/ExtractMetadata/ExtractMetadataTask.d.ts +24 -0
- package/features/ExtractMetadata/ExtractMetadataTask.js +90 -0
- package/features/ExtractMetadata/ExtractMetadataTask.js.map +1 -0
- package/features/ExtractMetadata/feature.d.ts +4 -0
- package/features/ExtractMetadata/feature.js +13 -0
- package/features/ExtractMetadata/feature.js.map +1 -0
- package/features/FlushCache/FlushCacheOnFileDeleteHandler.d.ts +12 -0
- package/features/FlushCache/FlushCacheOnFileDeleteHandler.js +28 -0
- package/features/FlushCache/FlushCacheOnFileDeleteHandler.js.map +1 -0
- package/features/FlushCache/FlushCacheOnFileUpdateHandler.d.ts +12 -0
- package/features/FlushCache/FlushCacheOnFileUpdateHandler.js +31 -0
- package/features/FlushCache/FlushCacheOnFileUpdateHandler.js.map +1 -0
- package/features/FlushCache/InvalidateCacheTask.d.ts +26 -0
- package/features/FlushCache/InvalidateCacheTask.js +75 -0
- package/features/FlushCache/InvalidateCacheTask.js.map +1 -0
- package/features/FlushCache/feature.d.ts +4 -0
- package/features/FlushCache/feature.js +15 -0
- package/features/FlushCache/feature.js.map +1 -0
- 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/GetFileContentsById/feature.d.ts +4 -0
- 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.d.ts +14 -0
- package/features/WriteFileMetadata/MetadataReader.js +13 -0
- package/features/WriteFileMetadata/MetadataReader.js.map +1 -0
- package/features/WriteFileMetadata/MetadataWriter.d.ts +10 -0
- package/features/WriteFileMetadata/MetadataWriter.js +26 -0
- package/features/WriteFileMetadata/MetadataWriter.js.map +1 -0
- package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.d.ts +12 -0
- package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js +23 -0
- package/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js.map +1 -0
- package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.d.ts +12 -0
- package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js +25 -0
- package/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js.map +1 -0
- package/features/WriteFileMetadata/feature.d.ts +4 -0
- package/features/WriteFileMetadata/feature.js +13 -0
- package/features/WriteFileMetadata/feature.js.map +1 -0
- package/graphql/checkPermissions.d.ts +5 -0
- package/graphql/checkPermissions.js +22 -0
- package/graphql/checkPermissions.js.map +1 -0
- package/graphql/schema.d.ts +1 -0
- package/graphql/schema.js +201 -0
- package/graphql/schema.js.map +1 -0
- package/index.d.ts +4 -2
- package/index.js +29 -14
- package/index.js.map +1 -1
- package/multiPartUpload/CompleteMultiPartUploadUseCase.d.ts +15 -0
- package/multiPartUpload/CompleteMultiPartUploadUseCase.js +55 -0
- package/multiPartUpload/CompleteMultiPartUploadUseCase.js.map +1 -0
- package/multiPartUpload/CreateMultiPartUploadUseCase.d.ts +20 -0
- package/multiPartUpload/CreateMultiPartUploadUseCase.js +34 -0
- package/multiPartUpload/CreateMultiPartUploadUseCase.js.map +1 -0
- package/package.json +35 -24
- package/types.d.ts +14 -9
- package/types.js +1 -5
- package/utils/CdnPathsGenerator.d.ts +3 -0
- package/utils/CdnPathsGenerator.js +11 -0
- package/utils/CdnPathsGenerator.js.map +1 -0
- package/utils/FileExtension.d.ts +6 -0
- package/utils/FileExtension.js +16 -0
- package/utils/FileExtension.js.map +1 -0
- package/utils/FileKey.d.ts +11 -0
- package/utils/FileKey.js +33 -0
- package/utils/FileKey.js.map +1 -0
- package/utils/FileKey.test.d.ts +1 -0
- package/utils/FileKey.test.js +59 -0
- package/utils/FileKey.test.js.map +1 -0
- package/utils/FileNormalizer.d.ts +18 -0
- package/utils/FileNormalizer.js +41 -0
- package/utils/FileNormalizer.js.map +1 -0
- package/utils/FileUploadModifier.d.ts +30 -0
- package/utils/FileUploadModifier.js +39 -0
- package/utils/FileUploadModifier.js.map +1 -0
- package/utils/createFileNormalizerFromContext.d.ts +3 -0
- package/utils/createFileNormalizerFromContext.js +9 -0
- package/utils/createFileNormalizerFromContext.js.map +1 -0
- package/utils/getPresignedPostPayload.d.ts +4 -4
- package/utils/getPresignedPostPayload.js +39 -83
- package/utils/getPresignedPostPayload.js.map +1 -1
- package/utils/mimeTypes.d.ts +5 -0
- package/utils/mimeTypes.js +9 -0
- package/utils/mimeTypes.js.map +1 -0
- package/utils/uploadFileToS3.d.ts +2 -4
- package/utils/uploadFileToS3.js +12 -27
- package/utils/uploadFileToS3.js.map +1 -1
- package/plugins/fileStorageS3.d.ts +0 -6
- package/plugins/fileStorageS3.js +0 -68
- package/plugins/fileStorageS3.js.map +0 -1
- package/plugins/graphqlFileStorageS3.d.ts +0 -4
- package/plugins/graphqlFileStorageS3.js +0 -150
- package/plugins/graphqlFileStorageS3.js.map +0 -1
- package/types.js.map +0 -1
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import { GetFileContentsByKeyUseCaseImplementation } from "./GetFileContentsByKeyUseCase.js";
|
|
3
|
+
const GetFileContentsByKeyFeature = createFeature({
|
|
4
|
+
name: "FileManagerS3/GetFileContentsByKey",
|
|
5
|
+
register (container) {
|
|
6
|
+
container.register(GetFileContentsByKeyUseCaseImplementation);
|
|
7
|
+
}
|
|
8
|
+
});
|
|
9
|
+
export { GetFileContentsByKeyFeature };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/GetFileContentsByKey/feature.js","sources":["../../../src/features/GetFileContentsByKey/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { GetFileContentsByKeyUseCaseImplementation } from \"./GetFileContentsByKeyUseCase.js\";\n\nexport const GetFileContentsByKeyFeature = createFeature({\n name: \"FileManagerS3/GetFileContentsByKey\",\n register(container) {\n container.register(GetFileContentsByKeyUseCaseImplementation);\n }\n});\n"],"names":["GetFileContentsByKeyFeature","createFeature","container","GetFileContentsByKeyUseCaseImplementation"],"mappings":";;AAGO,MAAMA,8BAA8BC,cAAc;IACrD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
|
|
2
|
+
interface AssetMetadata {
|
|
3
|
+
id: string;
|
|
4
|
+
tenant: string;
|
|
5
|
+
size: number;
|
|
6
|
+
contentType: string;
|
|
7
|
+
bucketKey: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class MetadataReader {
|
|
10
|
+
private keyValueStore;
|
|
11
|
+
constructor(keyValueStore: GlobalKeyValueStore.Interface);
|
|
12
|
+
read(fileId: string): Promise<AssetMetadata | undefined>;
|
|
13
|
+
}
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class MetadataReader {
|
|
2
|
+
constructor(keyValueStore){
|
|
3
|
+
this.keyValueStore = keyValueStore;
|
|
4
|
+
}
|
|
5
|
+
async read(fileId) {
|
|
6
|
+
const result = await this.keyValueStore.get(`FileManager/File/${fileId}/Metadata`);
|
|
7
|
+
if (result.isFail()) return;
|
|
8
|
+
return result.value;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
export { MetadataReader };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=MetadataReader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/WriteFileMetadata/MetadataReader.js","sources":["../../../src/features/WriteFileMetadata/MetadataReader.ts"],"sourcesContent":["import { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\n\ninterface AssetMetadata {\n id: string;\n tenant: string;\n size: number;\n contentType: string;\n bucketKey: string;\n}\n\nexport class MetadataReader {\n constructor(private keyValueStore: GlobalKeyValueStore.Interface) {}\n\n async read(fileId: string): Promise<AssetMetadata | undefined> {\n const result = await this.keyValueStore.get<AssetMetadata>(\n `FileManager/File/${fileId}/Metadata`\n );\n\n if (result.isFail()) {\n return undefined;\n }\n\n return result.value;\n }\n}\n"],"names":["MetadataReader","keyValueStore","fileId","result"],"mappings":"AAUO,MAAMA;IACT,YAAoBC,aAA4C,CAAE;aAA9CA,aAAa,GAAbA;IAA+C;IAEnE,MAAM,KAAKC,MAAc,EAAsC;QAC3D,MAAMC,SAAS,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CACvC,CAAC,iBAAiB,EAAED,OAAO,SAAS,CAAC;QAGzC,IAAIC,OAAO,MAAM,IACb;QAGJ,OAAOA,OAAO,KAAK;IACvB;AACJ"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
2
|
+
import type { File } from "@webiny/api-file-manager/domain/file/types.js";
|
|
3
|
+
import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
|
|
4
|
+
export declare class MetadataWriter {
|
|
5
|
+
private tenantContext;
|
|
6
|
+
private keyValueStore;
|
|
7
|
+
constructor(tenantContext: TenantContext.Interface, keyValueStore: GlobalKeyValueStore.Interface);
|
|
8
|
+
write(files: File[]): Promise<void>;
|
|
9
|
+
private getMetadata;
|
|
10
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
class MetadataWriter {
|
|
2
|
+
constructor(tenantContext, keyValueStore){
|
|
3
|
+
this.tenantContext = tenantContext;
|
|
4
|
+
this.keyValueStore = keyValueStore;
|
|
5
|
+
}
|
|
6
|
+
async write(files) {
|
|
7
|
+
const writers = files.map(async (file)=>{
|
|
8
|
+
const metadata = this.getMetadata(file);
|
|
9
|
+
await this.keyValueStore.set(`FileManager/File/${file.id}/Metadata`, metadata);
|
|
10
|
+
});
|
|
11
|
+
await Promise.all(writers);
|
|
12
|
+
}
|
|
13
|
+
getMetadata(file) {
|
|
14
|
+
const tenant = this.tenantContext.getTenant();
|
|
15
|
+
return {
|
|
16
|
+
id: file.id,
|
|
17
|
+
bucketKey: `tenants/${tenant.id}/files/${file.key}`,
|
|
18
|
+
tenant: tenant.id,
|
|
19
|
+
size: file.size,
|
|
20
|
+
contentType: file.type
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export { MetadataWriter };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=MetadataWriter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/WriteFileMetadata/MetadataWriter.js","sources":["../../../src/features/WriteFileMetadata/MetadataWriter.ts"],"sourcesContent":["import { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport type { File } from \"@webiny/api-file-manager/domain/file/types.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\n\nexport class MetadataWriter {\n constructor(\n private tenantContext: TenantContext.Interface,\n private keyValueStore: GlobalKeyValueStore.Interface\n ) {}\n\n async write(files: File[]) {\n /**\n * We need to write each file with retry.\n */\n const writers = files.map(async file => {\n const metadata = this.getMetadata(file);\n await this.keyValueStore.set(`FileManager/File/${file.id}/Metadata`, metadata);\n });\n\n await Promise.all(writers);\n }\n\n private getMetadata(file: File) {\n const tenant = this.tenantContext.getTenant();\n return {\n id: file.id,\n bucketKey: `tenants/${tenant.id}/files/${file.key}`,\n tenant: tenant.id,\n size: file.size,\n contentType: file.type\n };\n }\n}\n"],"names":["MetadataWriter","tenantContext","keyValueStore","files","writers","file","metadata","Promise","tenant"],"mappings":"AAIO,MAAMA;IACT,YACYC,aAAsC,EACtCC,aAA4C,CACtD;aAFUD,aAAa,GAAbA;aACAC,aAAa,GAAbA;IACT;IAEH,MAAM,MAAMC,KAAa,EAAE;QAIvB,MAAMC,UAAUD,MAAM,GAAG,CAAC,OAAME;YAC5B,MAAMC,WAAW,IAAI,CAAC,WAAW,CAACD;YAClC,MAAM,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAEA,KAAK,EAAE,CAAC,SAAS,CAAC,EAAEC;QACzE;QAEA,MAAMC,QAAQ,GAAG,CAACH;IACtB;IAEQ,YAAYC,IAAU,EAAE;QAC5B,MAAMG,SAAS,IAAI,CAAC,aAAa,CAAC,SAAS;QAC3C,OAAO;YACH,IAAIH,KAAK,EAAE;YACX,WAAW,CAAC,QAAQ,EAAEG,OAAO,EAAE,CAAC,OAAO,EAAEH,KAAK,GAAG,EAAE;YACnD,QAAQG,OAAO,EAAE;YACjB,MAAMH,KAAK,IAAI;YACf,aAAaA,KAAK,IAAI;QAC1B;IACJ;AACJ"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
2
|
+
import { FileAfterBatchCreateEventHandler } from "@webiny/api-file-manager/features/file/CreateFilesInBatch/events.js";
|
|
3
|
+
import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
|
|
4
|
+
declare class WriteMetadataAfterBatchCreateHandlerImpl implements FileAfterBatchCreateEventHandler.Interface {
|
|
5
|
+
private readonly metadataWriter;
|
|
6
|
+
constructor(tenantContext: TenantContext.Interface, keyValueStore: GlobalKeyValueStore.Interface);
|
|
7
|
+
handle(event: FileAfterBatchCreateEventHandler.Event): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export declare const WriteMetadataAfterBatchCreateHandler: typeof WriteMetadataAfterBatchCreateHandlerImpl & {
|
|
10
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher/abstractions.js").IEventHandler<import("@webiny/api-file-manager/features/file/CreateFilesInBatch/events.js").FileAfterBatchCreateEvent>>;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
2
|
+
import { FileAfterBatchCreateEventHandler } from "@webiny/api-file-manager/features/file/CreateFilesInBatch/events.js";
|
|
3
|
+
import { MetadataWriter } from "./MetadataWriter.js";
|
|
4
|
+
import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
|
|
5
|
+
class WriteMetadataAfterBatchCreateHandlerImpl {
|
|
6
|
+
constructor(tenantContext, keyValueStore){
|
|
7
|
+
this.metadataWriter = new MetadataWriter(tenantContext, keyValueStore);
|
|
8
|
+
}
|
|
9
|
+
async handle(event) {
|
|
10
|
+
const { files } = event.payload;
|
|
11
|
+
await this.metadataWriter.write(files);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const WriteMetadataAfterBatchCreateHandler = FileAfterBatchCreateEventHandler.createImplementation({
|
|
15
|
+
implementation: WriteMetadataAfterBatchCreateHandlerImpl,
|
|
16
|
+
dependencies: [
|
|
17
|
+
TenantContext,
|
|
18
|
+
GlobalKeyValueStore
|
|
19
|
+
]
|
|
20
|
+
});
|
|
21
|
+
export { WriteMetadataAfterBatchCreateHandler };
|
|
22
|
+
|
|
23
|
+
//# sourceMappingURL=WriteMetadataAfterBatchCreateHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.js","sources":["../../../src/features/WriteFileMetadata/WriteMetadataAfterBatchCreateHandler.ts"],"sourcesContent":["import { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { FileAfterBatchCreateEventHandler } from \"@webiny/api-file-manager/features/file/CreateFilesInBatch/events.js\";\nimport { MetadataWriter } from \"./MetadataWriter.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\n\nclass WriteMetadataAfterBatchCreateHandlerImpl\n implements FileAfterBatchCreateEventHandler.Interface\n{\n private readonly metadataWriter: MetadataWriter;\n\n constructor(\n tenantContext: TenantContext.Interface,\n keyValueStore: GlobalKeyValueStore.Interface\n ) {\n this.metadataWriter = new MetadataWriter(tenantContext, keyValueStore);\n }\n\n async handle(event: FileAfterBatchCreateEventHandler.Event): Promise<void> {\n const { files } = event.payload;\n await this.metadataWriter.write(files);\n }\n}\n\nexport const WriteMetadataAfterBatchCreateHandler =\n FileAfterBatchCreateEventHandler.createImplementation({\n implementation: WriteMetadataAfterBatchCreateHandlerImpl,\n dependencies: [TenantContext, GlobalKeyValueStore]\n });\n"],"names":["WriteMetadataAfterBatchCreateHandlerImpl","tenantContext","keyValueStore","MetadataWriter","event","files","WriteMetadataAfterBatchCreateHandler","FileAfterBatchCreateEventHandler","TenantContext","GlobalKeyValueStore"],"mappings":";;;;AAKA,MAAMA;IAKF,YACIC,aAAsC,EACtCC,aAA4C,CAC9C;QACE,IAAI,CAAC,cAAc,GAAG,IAAIC,eAAeF,eAAeC;IAC5D;IAEA,MAAM,OAAOE,KAA6C,EAAiB;QACvE,MAAM,EAAEC,KAAK,EAAE,GAAGD,MAAM,OAAO;QAC/B,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAACC;IACpC;AACJ;AAEO,MAAMC,uCACTC,iCAAiC,oBAAoB,CAAC;IAClD,gBAAgBP;IAChB,cAAc;QAACQ;QAAeC;KAAoB;AACtD"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { FileAfterCreateEventHandler } from "@webiny/api-file-manager/features/file/CreateFile/events.js";
|
|
2
|
+
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
3
|
+
import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
|
|
4
|
+
declare class WriteMetadataAfterCreateHandlerImpl implements FileAfterCreateEventHandler.Interface {
|
|
5
|
+
private readonly metadataWriter;
|
|
6
|
+
constructor(tenantContext: TenantContext.Interface, keyValueStore: GlobalKeyValueStore.Interface);
|
|
7
|
+
handle(event: FileAfterCreateEventHandler.Event): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export declare const WriteMetadataAfterCreateHandler: typeof WriteMetadataAfterCreateHandlerImpl & {
|
|
10
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/eventPublisher/abstractions.js").IEventHandler<import("@webiny/api-file-manager/features/file/CreateFile/events.js").FileAfterCreateEvent>>;
|
|
11
|
+
};
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { FileAfterCreateEventHandler } from "@webiny/api-file-manager/features/file/CreateFile/events.js";
|
|
2
|
+
import { MetadataWriter } from "./MetadataWriter.js";
|
|
3
|
+
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
4
|
+
import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
|
|
5
|
+
class WriteMetadataAfterCreateHandlerImpl {
|
|
6
|
+
constructor(tenantContext, keyValueStore){
|
|
7
|
+
this.metadataWriter = new MetadataWriter(tenantContext, keyValueStore);
|
|
8
|
+
}
|
|
9
|
+
async handle(event) {
|
|
10
|
+
const { file } = event.payload;
|
|
11
|
+
await this.metadataWriter.write([
|
|
12
|
+
file
|
|
13
|
+
]);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const WriteMetadataAfterCreateHandler = FileAfterCreateEventHandler.createImplementation({
|
|
17
|
+
implementation: WriteMetadataAfterCreateHandlerImpl,
|
|
18
|
+
dependencies: [
|
|
19
|
+
TenantContext,
|
|
20
|
+
GlobalKeyValueStore
|
|
21
|
+
]
|
|
22
|
+
});
|
|
23
|
+
export { WriteMetadataAfterCreateHandler };
|
|
24
|
+
|
|
25
|
+
//# sourceMappingURL=WriteMetadataAfterCreateHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js","sources":["../../../src/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.ts"],"sourcesContent":["import { FileAfterCreateEventHandler } from \"@webiny/api-file-manager/features/file/CreateFile/events.js\";\nimport { MetadataWriter } from \"./MetadataWriter.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\n\nclass WriteMetadataAfterCreateHandlerImpl implements FileAfterCreateEventHandler.Interface {\n private readonly metadataWriter: MetadataWriter;\n\n constructor(\n tenantContext: TenantContext.Interface,\n keyValueStore: GlobalKeyValueStore.Interface\n ) {\n this.metadataWriter = new MetadataWriter(tenantContext, keyValueStore);\n }\n\n async handle(event: FileAfterCreateEventHandler.Event): Promise<void> {\n const { file } = event.payload;\n await this.metadataWriter.write([file]);\n }\n}\n\nexport const WriteMetadataAfterCreateHandler = FileAfterCreateEventHandler.createImplementation({\n implementation: WriteMetadataAfterCreateHandlerImpl,\n dependencies: [TenantContext, GlobalKeyValueStore]\n});\n"],"names":["WriteMetadataAfterCreateHandlerImpl","tenantContext","keyValueStore","MetadataWriter","event","file","WriteMetadataAfterCreateHandler","FileAfterCreateEventHandler","TenantContext","GlobalKeyValueStore"],"mappings":";;;;AAKA,MAAMA;IAGF,YACIC,aAAsC,EACtCC,aAA4C,CAC9C;QACE,IAAI,CAAC,cAAc,GAAG,IAAIC,eAAeF,eAAeC;IAC5D;IAEA,MAAM,OAAOE,KAAwC,EAAiB;QAClE,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAM,OAAO;QAC9B,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;YAACC;SAAK;IAC1C;AACJ;AAEO,MAAMC,kCAAkCC,4BAA4B,oBAAoB,CAAC;IAC5F,gBAAgBP;IAChB,cAAc;QAACQ;QAAeC;KAAoB;AACtD"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import { WriteMetadataAfterCreateHandler } from "./WriteMetadataAfterCreateHandler.js";
|
|
3
|
+
import { WriteMetadataAfterBatchCreateHandler } from "./WriteMetadataAfterBatchCreateHandler.js";
|
|
4
|
+
const WriteFileMetadataFeature = createFeature({
|
|
5
|
+
name: "FileManagerS3/WriteFileMetadata",
|
|
6
|
+
register (container) {
|
|
7
|
+
container.register(WriteMetadataAfterCreateHandler);
|
|
8
|
+
container.register(WriteMetadataAfterBatchCreateHandler);
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
export { WriteFileMetadataFeature };
|
|
12
|
+
|
|
13
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/WriteFileMetadata/feature.js","sources":["../../../src/features/WriteFileMetadata/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { WriteMetadataAfterCreateHandler } from \"./WriteMetadataAfterCreateHandler.js\";\nimport { WriteMetadataAfterBatchCreateHandler } from \"./WriteMetadataAfterBatchCreateHandler.js\";\n\nexport const WriteFileMetadataFeature = createFeature({\n name: \"FileManagerS3/WriteFileMetadata\",\n register(container) {\n container.register(WriteMetadataAfterCreateHandler);\n container.register(WriteMetadataAfterBatchCreateHandler);\n }\n});\n"],"names":["WriteFileMetadataFeature","createFeature","container","WriteMetadataAfterCreateHandler","WriteMetadataAfterBatchCreateHandler"],"mappings":";;;AAIO,MAAMA,2BAA2BC,cAAc;IAClD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;IACvB;AACJ"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FilePermission } from "@webiny/api-file-manager/types.js";
|
|
2
|
+
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
3
|
+
export declare const checkPermissions: (identityContext: IdentityContext.Interface, check?: {
|
|
4
|
+
rwd?: string;
|
|
5
|
+
}) => Promise<FilePermission[]>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/index.js";
|
|
2
|
+
const checkPermissions = async (identityContext, check = {})=>{
|
|
3
|
+
const filePermissions = await identityContext.getPermissions("fm.file");
|
|
4
|
+
const relevantFilePermissions = filePermissions.filter((current)=>{
|
|
5
|
+
if (check.rwd && !hasRwd(current, check.rwd)) return false;
|
|
6
|
+
return true;
|
|
7
|
+
});
|
|
8
|
+
if (0 === relevantFilePermissions.length) throw new NotAuthorizedError();
|
|
9
|
+
return relevantFilePermissions;
|
|
10
|
+
};
|
|
11
|
+
const hasRwd = (filesFilePermissions, rwd)=>{
|
|
12
|
+
if (!Array.isArray(filesFilePermissions)) filesFilePermissions = [
|
|
13
|
+
filesFilePermissions
|
|
14
|
+
];
|
|
15
|
+
if (!rwd) return true;
|
|
16
|
+
const permissionWithoutRwdRestrictions = filesFilePermissions.some((permission)=>"string" != typeof permission.rwd);
|
|
17
|
+
if (permissionWithoutRwdRestrictions) return true;
|
|
18
|
+
return filesFilePermissions.some((permission)=>permission.rwd && permission.rwd.includes(rwd));
|
|
19
|
+
};
|
|
20
|
+
export { checkPermissions };
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=checkPermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql/checkPermissions.js","sources":["../../src/graphql/checkPermissions.ts"],"sourcesContent":["import type { FilePermission } from \"@webiny/api-file-manager/types.js\";\nimport { NotAuthorizedError } from \"@webiny/api-core/features/security/shared/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\n\nexport const checkPermissions = async (\n identityContext: IdentityContext.Interface,\n check: { rwd?: string } = {}\n) => {\n const filePermissions = await identityContext.getPermissions<FilePermission>(\"fm.file\");\n\n const relevantFilePermissions = filePermissions.filter(current => {\n if (check.rwd && !hasRwd(current, check.rwd)) {\n return false;\n }\n\n return true;\n });\n\n if (relevantFilePermissions.length === 0) {\n throw new NotAuthorizedError();\n }\n\n return relevantFilePermissions;\n};\n\nconst hasRwd = (filesFilePermissions: FilePermission | FilePermission[], rwd: string): boolean => {\n if (!Array.isArray(filesFilePermissions)) {\n filesFilePermissions = [filesFilePermissions];\n }\n\n if (!rwd) {\n return true;\n }\n\n // Is there a permission that doesn't restrict RWD permissions, that means all RWD permissions are allowed.\n const permissionWithoutRwdRestrictions = filesFilePermissions.some(permission => {\n return typeof permission.rwd !== \"string\";\n });\n\n if (permissionWithoutRwdRestrictions) {\n return true;\n }\n\n // If there is no permission that doesn't restrict RWD permissions, that means we need to check if the RWD.\n return filesFilePermissions.some(permission => {\n return permission.rwd && permission.rwd.includes(rwd);\n });\n};\n"],"names":["checkPermissions","identityContext","check","filePermissions","relevantFilePermissions","current","hasRwd","NotAuthorizedError","filesFilePermissions","rwd","Array","permissionWithoutRwdRestrictions","permission"],"mappings":";AAIO,MAAMA,mBAAmB,OAC5BC,iBACAC,QAA0B,CAAC,CAAC;IAE5B,MAAMC,kBAAkB,MAAMF,gBAAgB,cAAc,CAAiB;IAE7E,MAAMG,0BAA0BD,gBAAgB,MAAM,CAACE,CAAAA;QACnD,IAAIH,MAAM,GAAG,IAAI,CAACI,OAAOD,SAASH,MAAM,GAAG,GACvC,OAAO;QAGX,OAAO;IACX;IAEA,IAAIE,AAAmC,MAAnCA,wBAAwB,MAAM,EAC9B,MAAM,IAAIG;IAGd,OAAOH;AACX;AAEA,MAAME,SAAS,CAACE,sBAAyDC;IACrE,IAAI,CAACC,MAAM,OAAO,CAACF,uBACfA,uBAAuB;QAACA;KAAqB;IAGjD,IAAI,CAACC,KACD,OAAO;IAIX,MAAME,mCAAmCH,qBAAqB,IAAI,CAACI,CAAAA,aACxD,AAA0B,YAA1B,OAAOA,WAAW,GAAG;IAGhC,IAAID,kCACA,OAAO;IAIX,OAAOH,qBAAqB,IAAI,CAACI,CAAAA,aACtBA,WAAW,GAAG,IAAIA,WAAW,GAAG,CAAC,QAAQ,CAACH;AAEzD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const createS3GraphQLSchema: () => import("@webiny/handler-graphql").GraphQLSchemaPlugin<import("@webiny/api/types.js").Context>;
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import p_map from "p-map";
|
|
2
|
+
import { createGraphQLSchemaPlugin } from "@webiny/handler-graphql";
|
|
3
|
+
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
4
|
+
import { S3 } from "@webiny/aws-sdk/client-s3/index.js";
|
|
5
|
+
import { ErrorResponse, Response } from "@webiny/handler-graphql/responses.js";
|
|
6
|
+
import { getPresignedPostPayload } from "../utils/getPresignedPostPayload.js";
|
|
7
|
+
import { checkPermissions } from "./checkPermissions.js";
|
|
8
|
+
import { CreateMultiPartUploadUseCase } from "../multiPartUpload/CreateMultiPartUploadUseCase.js";
|
|
9
|
+
import { CompleteMultiPartUploadUseCase } from "../multiPartUpload/CompleteMultiPartUploadUseCase.js";
|
|
10
|
+
import { createFileNormalizerFromContext } from "../utils/createFileNormalizerFromContext.js";
|
|
11
|
+
import { GetSettingsUseCase } from "@webiny/api-file-manager/features/settings/GetSettings/abstractions.js";
|
|
12
|
+
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
13
|
+
const createS3GraphQLSchema = ()=>createGraphQLSchemaPlugin({
|
|
14
|
+
typeDefs: `
|
|
15
|
+
type UploadFileResponseDataFile {
|
|
16
|
+
id: ID!
|
|
17
|
+
name: String!
|
|
18
|
+
type: String!
|
|
19
|
+
size: Long!
|
|
20
|
+
key: String!
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
input PreSignedPostPayloadInput {
|
|
24
|
+
id: ID
|
|
25
|
+
name: String!
|
|
26
|
+
type: String!
|
|
27
|
+
size: Long!
|
|
28
|
+
key: String
|
|
29
|
+
keyPrefix: String
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
type GetPreSignedPostPayloadResponseDataFile {
|
|
33
|
+
id: ID!
|
|
34
|
+
name: String!
|
|
35
|
+
type: String!
|
|
36
|
+
size: Long!
|
|
37
|
+
key: String!
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
type GetPreSignedPostPayloadResponseData {
|
|
41
|
+
# Contains data that is necessary for initiating a file upload.
|
|
42
|
+
data: JSON!
|
|
43
|
+
file: UploadFileResponseDataFile!
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
type GetPreSignedPostPayloadResponse {
|
|
47
|
+
error: FmError
|
|
48
|
+
data: GetPreSignedPostPayloadResponseData
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
type MultiPartUploadFilePart {
|
|
52
|
+
partNumber: Int!
|
|
53
|
+
url: String!
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
type CreateMultiPartUploadResponseData {
|
|
57
|
+
file: GetPreSignedPostPayloadResponseDataFile!
|
|
58
|
+
uploadId: String!
|
|
59
|
+
parts: [MultiPartUploadFilePart!]!
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
type CompleteMultiPartUploadResponse {
|
|
63
|
+
data: Boolean
|
|
64
|
+
error: FmError
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
type GetPreSignedPostPayloadsResponse {
|
|
68
|
+
error: FmError
|
|
69
|
+
data: [GetPreSignedPostPayloadResponseData!]!
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
extend type FmQuery {
|
|
73
|
+
getPreSignedPostPayload(
|
|
74
|
+
data: PreSignedPostPayloadInput!
|
|
75
|
+
): GetPreSignedPostPayloadResponse
|
|
76
|
+
getPreSignedPostPayloads(
|
|
77
|
+
data: [PreSignedPostPayloadInput]!
|
|
78
|
+
): GetPreSignedPostPayloadsResponse
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
type CreateMultiPartUploadResponse {
|
|
82
|
+
data: CreateMultiPartUploadResponseData
|
|
83
|
+
error: FmError
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
input MultiPartUploadFilePartInput {
|
|
87
|
+
partNumber: Int!
|
|
88
|
+
etag: String!
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
extend type FmMutation {
|
|
92
|
+
createMultiPartUpload(
|
|
93
|
+
data: PreSignedPostPayloadInput!
|
|
94
|
+
numberOfParts: Number!
|
|
95
|
+
): CreateMultiPartUploadResponse
|
|
96
|
+
|
|
97
|
+
completeMultiPartUpload(
|
|
98
|
+
fileKey: String!
|
|
99
|
+
uploadId: String!
|
|
100
|
+
): CompleteMultiPartUploadResponse
|
|
101
|
+
}
|
|
102
|
+
`,
|
|
103
|
+
resolvers: {
|
|
104
|
+
FmQuery: {
|
|
105
|
+
getPreSignedPostPayload: async (_, args, context)=>{
|
|
106
|
+
const identityContext = context.container.resolve(IdentityContext);
|
|
107
|
+
const getSettings = context.container.resolve(GetSettingsUseCase);
|
|
108
|
+
try {
|
|
109
|
+
await checkPermissions(identityContext, {
|
|
110
|
+
rwd: "w"
|
|
111
|
+
});
|
|
112
|
+
const data = args.data;
|
|
113
|
+
const settingsResult = await getSettings.execute();
|
|
114
|
+
const settings = settingsResult.value;
|
|
115
|
+
const normalizer = createFileNormalizerFromContext(context);
|
|
116
|
+
const presignedPayload = await getPresignedPostPayload(await normalizer.normalizeFile(data), settings, context.container.resolve(TenantContext));
|
|
117
|
+
return new Response(presignedPayload);
|
|
118
|
+
} catch (e) {
|
|
119
|
+
return new ErrorResponse({
|
|
120
|
+
message: e.message,
|
|
121
|
+
code: e.code,
|
|
122
|
+
data: e.data
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
getPreSignedPostPayloads: async (_, args, context)=>{
|
|
127
|
+
const identityContext = context.container.resolve(IdentityContext);
|
|
128
|
+
const getSettings = context.container.resolve(GetSettingsUseCase);
|
|
129
|
+
await checkPermissions(identityContext, {
|
|
130
|
+
rwd: "w"
|
|
131
|
+
});
|
|
132
|
+
const files = args.data;
|
|
133
|
+
try {
|
|
134
|
+
const settingsResult = await getSettings.execute();
|
|
135
|
+
const settings = settingsResult.value;
|
|
136
|
+
const normalizer = createFileNormalizerFromContext(context);
|
|
137
|
+
const presignedPayloads = await p_map(files, async (data)=>getPresignedPostPayload(await normalizer.normalizeFile(data), settings, context.container.resolve(TenantContext)));
|
|
138
|
+
return new Response(presignedPayloads);
|
|
139
|
+
} catch (e) {
|
|
140
|
+
return new ErrorResponse({
|
|
141
|
+
message: e.message,
|
|
142
|
+
code: e.code,
|
|
143
|
+
data: e.data
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
},
|
|
148
|
+
FmMutation: {
|
|
149
|
+
createMultiPartUpload: async (_, args, context)=>{
|
|
150
|
+
const identityContext = context.container.resolve(IdentityContext);
|
|
151
|
+
await checkPermissions(identityContext, {
|
|
152
|
+
rwd: "w"
|
|
153
|
+
});
|
|
154
|
+
const s3Client = new S3({
|
|
155
|
+
region: process.env.AWS_REGION
|
|
156
|
+
});
|
|
157
|
+
try {
|
|
158
|
+
const useCase = new CreateMultiPartUploadUseCase(String(process.env.S3_BUCKET), s3Client);
|
|
159
|
+
const normalizer = createFileNormalizerFromContext(context);
|
|
160
|
+
const multiPartUpload = await useCase.execute({
|
|
161
|
+
file: await normalizer.normalizeFile(args.data),
|
|
162
|
+
numberOfParts: args.numberOfParts
|
|
163
|
+
});
|
|
164
|
+
return new Response(multiPartUpload);
|
|
165
|
+
} catch (e) {
|
|
166
|
+
return new ErrorResponse({
|
|
167
|
+
message: e.message,
|
|
168
|
+
code: e.code,
|
|
169
|
+
data: e.data
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
completeMultiPartUpload: async (_, args, context)=>{
|
|
174
|
+
const identityContext = context.container.resolve(IdentityContext);
|
|
175
|
+
await checkPermissions(identityContext, {
|
|
176
|
+
rwd: "w"
|
|
177
|
+
});
|
|
178
|
+
const s3Client = new S3({
|
|
179
|
+
region: process.env.AWS_REGION
|
|
180
|
+
});
|
|
181
|
+
try {
|
|
182
|
+
const useCase = new CompleteMultiPartUploadUseCase(String(process.env.S3_BUCKET), s3Client);
|
|
183
|
+
await useCase.execute({
|
|
184
|
+
fileKey: args.fileKey,
|
|
185
|
+
uploadId: args.uploadId
|
|
186
|
+
});
|
|
187
|
+
return new Response(true);
|
|
188
|
+
} catch (e) {
|
|
189
|
+
return new ErrorResponse({
|
|
190
|
+
message: e.message,
|
|
191
|
+
code: e.code,
|
|
192
|
+
data: e.data
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
export { createS3GraphQLSchema };
|
|
200
|
+
|
|
201
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql/schema.js","sources":["../../src/graphql/schema.ts"],"sourcesContent":["import pMap from \"p-map\";\nimport { createGraphQLSchemaPlugin } from \"@webiny/handler-graphql\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport { ErrorResponse, Response } from \"@webiny/handler-graphql/responses.js\";\nimport { getPresignedPostPayload } from \"~/utils/getPresignedPostPayload.js\";\nimport { checkPermissions } from \"./checkPermissions.js\";\nimport type { PresignedPostPayloadData } from \"~/types.js\";\nimport { CreateMultiPartUploadUseCase } from \"~/multiPartUpload/CreateMultiPartUploadUseCase.js\";\nimport { CompleteMultiPartUploadUseCase } from \"~/multiPartUpload/CompleteMultiPartUploadUseCase.js\";\nimport { createFileNormalizerFromContext } from \"~/utils/createFileNormalizerFromContext.js\";\nimport { GetSettingsUseCase } from \"@webiny/api-file-manager/features/settings/GetSettings/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\n\nexport const createS3GraphQLSchema = () => {\n return createGraphQLSchemaPlugin({\n typeDefs: /* GraphQL */ `\n type UploadFileResponseDataFile {\n id: ID!\n name: String!\n type: String!\n size: Long!\n key: String!\n }\n\n input PreSignedPostPayloadInput {\n id: ID\n name: String!\n type: String!\n size: Long!\n key: String\n keyPrefix: String\n }\n\n type GetPreSignedPostPayloadResponseDataFile {\n id: ID!\n name: String!\n type: String!\n size: Long!\n key: String!\n }\n\n type GetPreSignedPostPayloadResponseData {\n # Contains data that is necessary for initiating a file upload.\n data: JSON!\n file: UploadFileResponseDataFile!\n }\n\n type GetPreSignedPostPayloadResponse {\n error: FmError\n data: GetPreSignedPostPayloadResponseData\n }\n\n type MultiPartUploadFilePart {\n partNumber: Int!\n url: String!\n }\n\n type CreateMultiPartUploadResponseData {\n file: GetPreSignedPostPayloadResponseDataFile!\n uploadId: String!\n parts: [MultiPartUploadFilePart!]!\n }\n\n type CompleteMultiPartUploadResponse {\n data: Boolean\n error: FmError\n }\n\n type GetPreSignedPostPayloadsResponse {\n error: FmError\n data: [GetPreSignedPostPayloadResponseData!]!\n }\n\n extend type FmQuery {\n getPreSignedPostPayload(\n data: PreSignedPostPayloadInput!\n ): GetPreSignedPostPayloadResponse\n getPreSignedPostPayloads(\n data: [PreSignedPostPayloadInput]!\n ): GetPreSignedPostPayloadsResponse\n }\n\n type CreateMultiPartUploadResponse {\n data: CreateMultiPartUploadResponseData\n error: FmError\n }\n\n input MultiPartUploadFilePartInput {\n partNumber: Int!\n etag: String!\n }\n\n extend type FmMutation {\n createMultiPartUpload(\n data: PreSignedPostPayloadInput!\n numberOfParts: Number!\n ): CreateMultiPartUploadResponse\n\n completeMultiPartUpload(\n fileKey: String!\n uploadId: String!\n ): CompleteMultiPartUploadResponse\n }\n `,\n resolvers: {\n FmQuery: {\n getPreSignedPostPayload: async (_, args: any, context) => {\n const identityContext = context.container.resolve(IdentityContext);\n const getSettings = context.container.resolve(GetSettingsUseCase);\n\n try {\n await checkPermissions(identityContext, { rwd: \"w\" });\n\n const data = args.data as PresignedPostPayloadData;\n\n const settingsResult = await getSettings.execute();\n const settings = settingsResult.value;\n\n const normalizer = createFileNormalizerFromContext(context);\n const presignedPayload = await getPresignedPostPayload(\n await normalizer.normalizeFile(data),\n settings,\n context.container.resolve(TenantContext)\n );\n\n return new Response(presignedPayload);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n },\n getPreSignedPostPayloads: async (_, args, context) => {\n const identityContext = context.container.resolve(IdentityContext);\n const getSettings = context.container.resolve(GetSettingsUseCase);\n await checkPermissions(identityContext, { rwd: \"w\" });\n\n const files = args.data as PresignedPostPayloadData[];\n\n try {\n const settingsResult = await getSettings.execute();\n const settings = settingsResult.value;\n\n const normalizer = createFileNormalizerFromContext(context);\n\n const presignedPayloads = await pMap(files, async data => {\n return getPresignedPostPayload(\n await normalizer.normalizeFile(data),\n settings,\n context.container.resolve(TenantContext)\n );\n });\n\n return new Response(presignedPayloads);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n }\n },\n FmMutation: {\n createMultiPartUpload: async (_, args, context) => {\n const identityContext = context.container.resolve(IdentityContext);\n await checkPermissions(identityContext, { rwd: \"w\" });\n\n const s3Client = new S3({\n region: process.env.AWS_REGION\n });\n\n try {\n const useCase = new CreateMultiPartUploadUseCase(\n String(process.env.S3_BUCKET),\n s3Client\n );\n\n const normalizer = createFileNormalizerFromContext(context);\n\n const multiPartUpload = await useCase.execute({\n file: await normalizer.normalizeFile(args.data),\n numberOfParts: args.numberOfParts\n });\n\n return new Response(multiPartUpload);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n },\n completeMultiPartUpload: async (_, args, context) => {\n const identityContext = context.container.resolve(IdentityContext);\n await checkPermissions(identityContext, { rwd: \"w\" });\n\n const s3Client = new S3({\n region: process.env.AWS_REGION\n });\n\n try {\n const useCase = new CompleteMultiPartUploadUseCase(\n String(process.env.S3_BUCKET),\n s3Client\n );\n\n await useCase.execute({\n fileKey: args.fileKey,\n uploadId: args.uploadId\n });\n\n return new Response(true);\n } catch (e) {\n return new ErrorResponse({\n message: e.message,\n code: e.code,\n data: e.data\n });\n }\n }\n }\n }\n });\n};\n"],"names":["createS3GraphQLSchema","createGraphQLSchemaPlugin","_","args","context","identityContext","IdentityContext","getSettings","GetSettingsUseCase","checkPermissions","data","settingsResult","settings","normalizer","createFileNormalizerFromContext","presignedPayload","getPresignedPostPayload","TenantContext","Response","e","ErrorResponse","files","presignedPayloads","pMap","s3Client","S3","process","useCase","CreateMultiPartUploadUseCase","String","multiPartUpload","CompleteMultiPartUploadUseCase"],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
export
|
|
1
|
+
import { ContextPlugin } from "@webiny/api";
|
|
2
|
+
export { createFileUploadModifier } from "./utils/FileUploadModifier.js";
|
|
3
|
+
export { createAssetDelivery } from "./assetDelivery/createAssetDelivery.js";
|
|
4
|
+
export declare const createFileManagerS3: () => (import("@webiny/handler-graphql/index.js").GraphQLSchemaPlugin<import("@webiny/api/types.js").Context> | ContextPlugin<import("@webiny/api/types.js").Context>)[];
|
package/index.js
CHANGED
|
@@ -1,16 +1,31 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import { ContextPlugin } from "@webiny/api";
|
|
2
|
+
import { WcpContext } from "@webiny/api-core/features/wcp/WcpContext/index.js";
|
|
3
|
+
import { createS3GraphQLSchema } from "./graphql/schema.js";
|
|
4
|
+
import { DeleteFileFromBucketFeature } from "./features/DeleteFileFromBucket/feature.js";
|
|
5
|
+
import { WriteFileMetadataFeature } from "./features/WriteFileMetadata/feature.js";
|
|
6
|
+
import { ApplyThreatScanningFeature } from "./enterprise/ApplyThreatScanning/feature.js";
|
|
7
|
+
import { FlushCacheFeature } from "./features/FlushCache/feature.js";
|
|
8
|
+
import { ExtractMetadataFeature } from "./features/ExtractMetadata/feature.js";
|
|
9
|
+
import { GetFileContentsByIdFeature } from "./features/GetFileContentsById/feature.js";
|
|
10
|
+
import { GetFileContentsByKeyFeature } from "./features/GetFileContentsByKey/feature.js";
|
|
11
|
+
const contextPlugin = new ContextPlugin((context)=>{
|
|
12
|
+
const container = context.container;
|
|
13
|
+
FlushCacheFeature.register(container);
|
|
14
|
+
DeleteFileFromBucketFeature.register(container);
|
|
15
|
+
ExtractMetadataFeature.register(container);
|
|
16
|
+
WriteFileMetadataFeature.register(container);
|
|
17
|
+
GetFileContentsByIdFeature.register(container);
|
|
18
|
+
GetFileContentsByKeyFeature.register(container);
|
|
19
|
+
const wcp = container.resolve(WcpContext);
|
|
20
|
+
if (wcp.canUseFileManagerThreatDetection()) ApplyThreatScanningFeature.register(container);
|
|
7
21
|
});
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
22
|
+
contextPlugin.name = "fileManagerS3.context";
|
|
23
|
+
const createFileManagerS3 = ()=>[
|
|
24
|
+
contextPlugin,
|
|
25
|
+
createS3GraphQLSchema()
|
|
26
|
+
];
|
|
27
|
+
export { createFileUploadModifier } from "./utils/FileUploadModifier.js";
|
|
28
|
+
export { createAssetDelivery } from "./assetDelivery/createAssetDelivery.js";
|
|
29
|
+
export { createFileManagerS3 };
|
|
15
30
|
|
|
16
|
-
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":["import { ContextPlugin } from \"@webiny/api\";\nimport { WcpContext } from \"@webiny/api-core/features/wcp/WcpContext/index.js\";\nimport { createS3GraphQLSchema } from \"./graphql/schema.js\";\nimport { DeleteFileFromBucketFeature } from \"~/features/DeleteFileFromBucket/feature.js\";\nimport { WriteFileMetadataFeature } from \"~/features/WriteFileMetadata/feature.js\";\nimport { ApplyThreatScanningFeature } from \"~/enterprise/ApplyThreatScanning/feature.js\";\nimport { FlushCacheFeature } from \"~/features/FlushCache/feature.js\";\nimport { ExtractMetadataFeature } from \"~/features/ExtractMetadata/feature.js\";\nimport { GetFileContentsByIdFeature } from \"~/features/GetFileContentsById/feature.js\";\nimport { GetFileContentsByKeyFeature } from \"~/features/GetFileContentsByKey/feature.js\";\nexport { createFileUploadModifier } from \"./utils/FileUploadModifier.js\";\nexport { createAssetDelivery } from \"./assetDelivery/createAssetDelivery.js\";\n\nconst contextPlugin = new ContextPlugin(context => {\n const container = context.container;\n\n FlushCacheFeature.register(container);\n DeleteFileFromBucketFeature.register(container);\n ExtractMetadataFeature.register(container);\n WriteFileMetadataFeature.register(container);\n GetFileContentsByIdFeature.register(container);\n GetFileContentsByKeyFeature.register(container);\n\n const wcp = container.resolve(WcpContext);\n if (wcp.canUseFileManagerThreatDetection()) {\n ApplyThreatScanningFeature.register(container);\n }\n});\n\ncontextPlugin.name = `fileManagerS3.context`;\n\nexport const createFileManagerS3 = () => [contextPlugin, createS3GraphQLSchema()];\n"],"names":["contextPlugin","ContextPlugin","context","container","FlushCacheFeature","DeleteFileFromBucketFeature","ExtractMetadataFeature","WriteFileMetadataFeature","GetFileContentsByIdFeature","GetFileContentsByKeyFeature","wcp","WcpContext","ApplyThreatScanningFeature","createFileManagerS3","createS3GraphQLSchema"],"mappings":";;;;;;;;;;AAaA,MAAMA,gBAAgB,IAAIC,cAAcC,CAAAA;IACpC,MAAMC,YAAYD,QAAQ,SAAS;IAEnCE,kBAAkB,QAAQ,CAACD;IAC3BE,4BAA4B,QAAQ,CAACF;IACrCG,uBAAuB,QAAQ,CAACH;IAChCI,yBAAyB,QAAQ,CAACJ;IAClCK,2BAA2B,QAAQ,CAACL;IACpCM,4BAA4B,QAAQ,CAACN;IAErC,MAAMO,MAAMP,UAAU,OAAO,CAACQ;IAC9B,IAAID,IAAI,gCAAgC,IACpCE,2BAA2B,QAAQ,CAACT;AAE5C;AAEAH,cAAc,IAAI,GAAG;AAEd,MAAMa,sBAAsB,IAAM;QAACb;QAAec;KAAwB"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { S3 } from "@webiny/aws-sdk/client-s3/index.js";
|
|
2
|
+
interface CompleteMultiPartUploadParams {
|
|
3
|
+
fileKey: string;
|
|
4
|
+
uploadId: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class CompleteMultiPartUploadUseCase {
|
|
7
|
+
private readonly s3;
|
|
8
|
+
private readonly bucket;
|
|
9
|
+
private readonly emptyMarkerValues;
|
|
10
|
+
constructor(bucket: string, s3Client: S3);
|
|
11
|
+
execute(params: CompleteMultiPartUploadParams): Promise<void>;
|
|
12
|
+
private getAllUploadParts;
|
|
13
|
+
private isMarkerEmpty;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { CompleteMultipartUploadCommand, ListPartsCommand } from "@webiny/aws-sdk/client-s3/index.js";
|
|
2
|
+
class CompleteMultiPartUploadUseCase {
|
|
3
|
+
constructor(bucket, s3Client){
|
|
4
|
+
this.emptyMarkerValues = [
|
|
5
|
+
void 0,
|
|
6
|
+
"0"
|
|
7
|
+
];
|
|
8
|
+
this.bucket = bucket;
|
|
9
|
+
this.s3 = s3Client;
|
|
10
|
+
}
|
|
11
|
+
async execute(params) {
|
|
12
|
+
const uploadParams = {
|
|
13
|
+
Bucket: this.bucket,
|
|
14
|
+
Key: params.fileKey,
|
|
15
|
+
UploadId: params.uploadId
|
|
16
|
+
};
|
|
17
|
+
const allParts = await this.getAllUploadParts(uploadParams);
|
|
18
|
+
const s3Params = {
|
|
19
|
+
...uploadParams,
|
|
20
|
+
MultipartUpload: {
|
|
21
|
+
Parts: allParts
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
try {
|
|
25
|
+
const command = new CompleteMultipartUploadCommand(s3Params);
|
|
26
|
+
await this.s3.send(command);
|
|
27
|
+
} catch (err) {
|
|
28
|
+
console.error(err);
|
|
29
|
+
throw err;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async getAllUploadParts(params) {
|
|
33
|
+
const parts = [];
|
|
34
|
+
let marker;
|
|
35
|
+
while(true){
|
|
36
|
+
const { Parts, PartNumberMarker } = await this.s3.send(new ListPartsCommand({
|
|
37
|
+
...params,
|
|
38
|
+
PartNumberMarker: marker
|
|
39
|
+
}));
|
|
40
|
+
if (Parts) Parts.forEach((part)=>parts.push(part));
|
|
41
|
+
marker = PartNumberMarker || void 0;
|
|
42
|
+
if (this.isMarkerEmpty(marker)) break;
|
|
43
|
+
}
|
|
44
|
+
return parts.map((part)=>({
|
|
45
|
+
ETag: part.ETag,
|
|
46
|
+
PartNumber: part.PartNumber
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
isMarkerEmpty(marker) {
|
|
50
|
+
return this.emptyMarkerValues.includes(marker);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export { CompleteMultiPartUploadUseCase };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=CompleteMultiPartUploadUseCase.js.map
|