@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
|
@@ -3,19 +3,23 @@ import { MetadataWriter } from "./MetadataWriter.js";
|
|
|
3
3
|
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
4
4
|
import { GlobalKeyValueStore } from "@webiny/api-core/features/keyValueStore/index.js";
|
|
5
5
|
class WriteMetadataAfterCreateHandlerImpl {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
15
|
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
const WriteMetadataAfterCreateHandler = FileAfterCreateEventHandler.createImplementation({
|
|
17
|
+
implementation: WriteMetadataAfterCreateHandlerImpl,
|
|
18
|
+
dependencies: [
|
|
19
|
+
TenantContext,
|
|
20
|
+
GlobalKeyValueStore
|
|
21
|
+
]
|
|
19
22
|
});
|
|
23
|
+
export { WriteMetadataAfterCreateHandler };
|
|
20
24
|
|
|
21
25
|
//# sourceMappingURL=WriteMetadataAfterCreateHandler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"features/WriteFileMetadata/WriteMetadataAfterCreateHandler.js","sources":["../../../src/features/WriteFileMetadata/WriteMetadataAfterCreateHandler.ts"],"sourcesContent":["import { FileAfterCreateEventHandler } from \"@webiny/api-file-manager/features/file/CreateFile/events.js\";\nimport { MetadataWriter } from \"./MetadataWriter.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { GlobalKeyValueStore } from \"@webiny/api-core/features/keyValueStore/index.js\";\n\nclass WriteMetadataAfterCreateHandlerImpl implements FileAfterCreateEventHandler.Interface {\n private readonly metadataWriter: MetadataWriter;\n\n constructor(\n tenantContext: TenantContext.Interface,\n keyValueStore: GlobalKeyValueStore.Interface\n ) {\n this.metadataWriter = new MetadataWriter(tenantContext, keyValueStore);\n }\n\n async handle(event: FileAfterCreateEventHandler.Event): Promise<void> {\n const { file } = event.payload;\n await this.metadataWriter.write([file]);\n }\n}\n\nexport const WriteMetadataAfterCreateHandler = FileAfterCreateEventHandler.createImplementation({\n implementation: WriteMetadataAfterCreateHandlerImpl,\n dependencies: [TenantContext, GlobalKeyValueStore]\n});\n"],"names":["WriteMetadataAfterCreateHandlerImpl","tenantContext","keyValueStore","MetadataWriter","event","file","WriteMetadataAfterCreateHandler","FileAfterCreateEventHandler","TenantContext","GlobalKeyValueStore"],"mappings":";;;;AAKA,MAAMA;IAGF,YACIC,aAAsC,EACtCC,aAA4C,CAC9C;QACE,IAAI,CAAC,cAAc,GAAG,IAAIC,eAAeF,eAAeC;IAC5D;IAEA,MAAM,OAAOE,KAAwC,EAAiB;QAClE,MAAM,EAAEC,IAAI,EAAE,GAAGD,MAAM,OAAO;QAC9B,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;YAACC;SAAK;IAC1C;AACJ;AAEO,MAAMC,kCAAkCC,4BAA4B,oBAAoB,CAAC;IAC5F,gBAAgBP;IAChB,cAAc;QAACQ;QAAeC;KAAoB;AACtD"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { createFeature } from "@webiny/feature/api";
|
|
2
2
|
import { WriteMetadataAfterCreateHandler } from "./WriteMetadataAfterCreateHandler.js";
|
|
3
3
|
import { WriteMetadataAfterBatchCreateHandler } from "./WriteMetadataAfterBatchCreateHandler.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
const WriteFileMetadataFeature = createFeature({
|
|
5
|
+
name: "FileManagerS3/WriteFileMetadata",
|
|
6
|
+
register (container) {
|
|
7
|
+
container.register(WriteMetadataAfterCreateHandler);
|
|
8
|
+
container.register(WriteMetadataAfterBatchCreateHandler);
|
|
9
|
+
}
|
|
10
10
|
});
|
|
11
|
+
export { WriteFileMetadataFeature };
|
|
11
12
|
|
|
12
13
|
//# sourceMappingURL=feature.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
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,10 @@
|
|
|
1
|
+
import { CoreGraphQLSchemaFactory } from "@webiny/api-graphql/graphql/abstractions.js";
|
|
2
|
+
import { GraphQLSchemaBuilder } from "@webiny/api-graphql/features/GraphQLSchemaBuilder/abstractions.js";
|
|
3
|
+
declare class S3GraphQLSchemaImpl implements CoreGraphQLSchemaFactory.Interface {
|
|
4
|
+
getSchemaKey: () => string;
|
|
5
|
+
execute(builder: GraphQLSchemaBuilder.Interface): CoreGraphQLSchemaFactory.Return;
|
|
6
|
+
}
|
|
7
|
+
export declare const S3GraphQLSchema: typeof S3GraphQLSchemaImpl & {
|
|
8
|
+
__abstraction: import("@webiny/di").Abstraction<import("@webiny/api-graphql/graphql/abstractions.core.js").ICoreGraphQLSchemaFactory>;
|
|
9
|
+
};
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import p_map from "p-map";
|
|
2
|
+
import { staticSchemaKey } from "@webiny/api-graphql/graphql/staticSchemaKey.js";
|
|
3
|
+
import { CoreGraphQLSchemaFactory } from "@webiny/api-graphql/graphql/abstractions.js";
|
|
4
|
+
import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js";
|
|
5
|
+
import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js";
|
|
6
|
+
import { S3 } from "@webiny/aws-sdk/client-s3/index.js";
|
|
7
|
+
import { ErrorResponse, Response } from "@webiny/api-graphql/responses.js";
|
|
8
|
+
import { GetSettingsUseCase } from "@webiny/api-file-manager/features/settings/GetSettings/abstractions.js";
|
|
9
|
+
import { getPresignedPostPayload } from "../utils/getPresignedPostPayload.js";
|
|
10
|
+
import { createFileNormalizerFromContext } from "../utils/createFileNormalizerFromContext.js";
|
|
11
|
+
import { checkPermissions } from "./checkPermissions.js";
|
|
12
|
+
import { CreateMultiPartUploadUseCase } from "../multiPartUpload/CreateMultiPartUploadUseCase.js";
|
|
13
|
+
import { CompleteMultiPartUploadUseCase } from "../multiPartUpload/CompleteMultiPartUploadUseCase.js";
|
|
14
|
+
const TYPE_DEFS = `
|
|
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(data: PreSignedPostPayloadInput!): GetPreSignedPostPayloadResponse
|
|
74
|
+
getPreSignedPostPayloads(
|
|
75
|
+
data: [PreSignedPostPayloadInput]!
|
|
76
|
+
): GetPreSignedPostPayloadsResponse
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
type CreateMultiPartUploadResponse {
|
|
80
|
+
data: CreateMultiPartUploadResponseData
|
|
81
|
+
error: FmError
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
input MultiPartUploadFilePartInput {
|
|
85
|
+
partNumber: Int!
|
|
86
|
+
etag: String!
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
extend type FmMutation {
|
|
90
|
+
createMultiPartUpload(
|
|
91
|
+
data: PreSignedPostPayloadInput!
|
|
92
|
+
numberOfParts: Number!
|
|
93
|
+
): CreateMultiPartUploadResponse
|
|
94
|
+
|
|
95
|
+
completeMultiPartUpload(
|
|
96
|
+
fileKey: String!
|
|
97
|
+
uploadId: String!
|
|
98
|
+
): CompleteMultiPartUploadResponse
|
|
99
|
+
}
|
|
100
|
+
`;
|
|
101
|
+
class S3GraphQLSchemaImpl {
|
|
102
|
+
async execute(builder) {
|
|
103
|
+
builder.addTypeDefs(TYPE_DEFS);
|
|
104
|
+
builder.addResolver({
|
|
105
|
+
path: "FmQuery.getPreSignedPostPayload",
|
|
106
|
+
dependencies: [
|
|
107
|
+
IdentityContext,
|
|
108
|
+
GetSettingsUseCase,
|
|
109
|
+
TenantContext
|
|
110
|
+
],
|
|
111
|
+
resolver (identityContext, getSettings, tenantContext) {
|
|
112
|
+
return async ({ args, context })=>{
|
|
113
|
+
try {
|
|
114
|
+
await checkPermissions(identityContext, {
|
|
115
|
+
rwd: "w"
|
|
116
|
+
});
|
|
117
|
+
const settingsResult = await getSettings.execute();
|
|
118
|
+
const settings = settingsResult.value;
|
|
119
|
+
const normalizer = createFileNormalizerFromContext(context);
|
|
120
|
+
const presignedPayload = await getPresignedPostPayload(await normalizer.normalizeFile(args.data), settings, tenantContext);
|
|
121
|
+
return new Response(presignedPayload);
|
|
122
|
+
} catch (e) {
|
|
123
|
+
return new ErrorResponse({
|
|
124
|
+
message: e.message,
|
|
125
|
+
code: e.code,
|
|
126
|
+
data: e.data
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
builder.addResolver({
|
|
133
|
+
path: "FmQuery.getPreSignedPostPayloads",
|
|
134
|
+
dependencies: [
|
|
135
|
+
IdentityContext,
|
|
136
|
+
GetSettingsUseCase,
|
|
137
|
+
TenantContext
|
|
138
|
+
],
|
|
139
|
+
resolver (identityContext, getSettings, tenantContext) {
|
|
140
|
+
return async ({ args, context })=>{
|
|
141
|
+
await checkPermissions(identityContext, {
|
|
142
|
+
rwd: "w"
|
|
143
|
+
});
|
|
144
|
+
try {
|
|
145
|
+
const settingsResult = await getSettings.execute();
|
|
146
|
+
const settings = settingsResult.value;
|
|
147
|
+
const normalizer = createFileNormalizerFromContext(context);
|
|
148
|
+
const presignedPayloads = await p_map(args.data, async (data)=>getPresignedPostPayload(await normalizer.normalizeFile(data), settings, tenantContext));
|
|
149
|
+
return new Response(presignedPayloads);
|
|
150
|
+
} catch (e) {
|
|
151
|
+
return new ErrorResponse({
|
|
152
|
+
message: e.message,
|
|
153
|
+
code: e.code,
|
|
154
|
+
data: e.data
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
builder.addResolver({
|
|
161
|
+
path: "FmMutation.createMultiPartUpload",
|
|
162
|
+
dependencies: [
|
|
163
|
+
IdentityContext
|
|
164
|
+
],
|
|
165
|
+
resolver (identityContext) {
|
|
166
|
+
return async ({ args, context })=>{
|
|
167
|
+
await checkPermissions(identityContext, {
|
|
168
|
+
rwd: "w"
|
|
169
|
+
});
|
|
170
|
+
const s3Client = new S3({
|
|
171
|
+
region: process.env.AWS_REGION
|
|
172
|
+
});
|
|
173
|
+
try {
|
|
174
|
+
const useCase = new CreateMultiPartUploadUseCase(String(process.env.S3_BUCKET), s3Client);
|
|
175
|
+
const normalizer = createFileNormalizerFromContext(context);
|
|
176
|
+
const multiPartUpload = await useCase.execute({
|
|
177
|
+
file: await normalizer.normalizeFile(args.data),
|
|
178
|
+
numberOfParts: args.numberOfParts
|
|
179
|
+
});
|
|
180
|
+
return new Response(multiPartUpload);
|
|
181
|
+
} catch (e) {
|
|
182
|
+
return new ErrorResponse({
|
|
183
|
+
message: e.message,
|
|
184
|
+
code: e.code,
|
|
185
|
+
data: e.data
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
builder.addResolver({
|
|
192
|
+
path: "FmMutation.completeMultiPartUpload",
|
|
193
|
+
dependencies: [
|
|
194
|
+
IdentityContext
|
|
195
|
+
],
|
|
196
|
+
resolver (identityContext) {
|
|
197
|
+
return async ({ args })=>{
|
|
198
|
+
await checkPermissions(identityContext, {
|
|
199
|
+
rwd: "w"
|
|
200
|
+
});
|
|
201
|
+
const s3Client = new S3({
|
|
202
|
+
region: process.env.AWS_REGION
|
|
203
|
+
});
|
|
204
|
+
try {
|
|
205
|
+
const useCase = new CompleteMultiPartUploadUseCase(String(process.env.S3_BUCKET), s3Client);
|
|
206
|
+
await useCase.execute({
|
|
207
|
+
fileKey: args.fileKey,
|
|
208
|
+
uploadId: args.uploadId
|
|
209
|
+
});
|
|
210
|
+
return new Response(true);
|
|
211
|
+
} catch (e) {
|
|
212
|
+
return new ErrorResponse({
|
|
213
|
+
message: e.message,
|
|
214
|
+
code: e.code,
|
|
215
|
+
data: e.data
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
return builder;
|
|
222
|
+
}
|
|
223
|
+
constructor(){
|
|
224
|
+
this.getSchemaKey = staticSchemaKey("api-file-manager-s3/S3GraphQLSchemaImpl");
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
const S3GraphQLSchema = CoreGraphQLSchemaFactory.createImplementation({
|
|
228
|
+
implementation: S3GraphQLSchemaImpl,
|
|
229
|
+
dependencies: []
|
|
230
|
+
});
|
|
231
|
+
export { S3GraphQLSchema };
|
|
232
|
+
|
|
233
|
+
//# sourceMappingURL=S3GraphQLSchema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql/S3GraphQLSchema.js","sources":["../../src/graphql/S3GraphQLSchema.ts"],"sourcesContent":["import pMap from \"p-map\";\nimport { staticSchemaKey } from \"@webiny/api-graphql/graphql/staticSchemaKey.js\";\nimport { CoreGraphQLSchemaFactory } from \"@webiny/api-graphql/graphql/abstractions.js\";\nimport { GraphQLSchemaBuilder } from \"@webiny/api-graphql/features/GraphQLSchemaBuilder/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { S3 } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport { ErrorResponse, Response } from \"@webiny/api-graphql/responses.js\";\nimport { GetSettingsUseCase } from \"@webiny/api-file-manager/features/settings/GetSettings/abstractions.js\";\nimport { getPresignedPostPayload } from \"~/utils/getPresignedPostPayload.js\";\nimport { createFileNormalizerFromContext } from \"~/utils/createFileNormalizerFromContext.js\";\nimport { checkPermissions } from \"./checkPermissions.js\";\nimport type { PresignedPostPayloadData } from \"~/types.js\";\nimport { CreateMultiPartUploadUseCase } from \"~/multiPartUpload/CreateMultiPartUploadUseCase.js\";\nimport { CompleteMultiPartUploadUseCase } from \"~/multiPartUpload/CompleteMultiPartUploadUseCase.js\";\n\nconst TYPE_DEFS = /* 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(data: PreSignedPostPayloadInput!): 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\nclass S3GraphQLSchemaImpl implements CoreGraphQLSchemaFactory.Interface {\n public getSchemaKey = staticSchemaKey(\"api-file-manager-s3/S3GraphQLSchemaImpl\");\n\n public async execute(builder: GraphQLSchemaBuilder.Interface): CoreGraphQLSchemaFactory.Return {\n builder.addTypeDefs(TYPE_DEFS);\n\n builder.addResolver<{ data: PresignedPostPayloadData }>({\n path: \"FmQuery.getPreSignedPostPayload\",\n dependencies: [IdentityContext, GetSettingsUseCase, TenantContext],\n resolver(\n identityContext: IdentityContext.Interface,\n getSettings: GetSettingsUseCase.Interface,\n tenantContext: TenantContext.Interface\n ) {\n return async ({ args, context }) => {\n try {\n await checkPermissions(identityContext, { rwd: \"w\" });\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(args.data),\n settings,\n 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 }\n });\n\n builder.addResolver<{ data: PresignedPostPayloadData[] }>({\n path: \"FmQuery.getPreSignedPostPayloads\",\n dependencies: [IdentityContext, GetSettingsUseCase, TenantContext],\n resolver(\n identityContext: IdentityContext.Interface,\n getSettings: GetSettingsUseCase.Interface,\n tenantContext: TenantContext.Interface\n ) {\n return async ({ args, context }) => {\n await checkPermissions(identityContext, { rwd: \"w\" });\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(args.data, async data => {\n return getPresignedPostPayload(\n await normalizer.normalizeFile(data),\n settings,\n 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 });\n\n builder.addResolver<{ data: any; numberOfParts: number }>({\n path: \"FmMutation.createMultiPartUpload\",\n dependencies: [IdentityContext],\n resolver(identityContext: IdentityContext.Interface) {\n return async ({ args, context }) => {\n await checkPermissions(identityContext, { rwd: \"w\" });\n\n const s3Client = new S3({ region: process.env.AWS_REGION });\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 }\n });\n\n builder.addResolver<{ fileKey: string; uploadId: string }>({\n path: \"FmMutation.completeMultiPartUpload\",\n dependencies: [IdentityContext],\n resolver(identityContext: IdentityContext.Interface) {\n return async ({ args }) => {\n await checkPermissions(identityContext, { rwd: \"w\" });\n\n const s3Client = new S3({ region: process.env.AWS_REGION });\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 return builder;\n }\n}\n\nexport const S3GraphQLSchema = CoreGraphQLSchemaFactory.createImplementation({\n implementation: S3GraphQLSchemaImpl,\n dependencies: []\n});\n"],"names":["TYPE_DEFS","S3GraphQLSchemaImpl","builder","IdentityContext","GetSettingsUseCase","TenantContext","identityContext","getSettings","tenantContext","args","context","checkPermissions","settingsResult","settings","normalizer","createFileNormalizerFromContext","presignedPayload","getPresignedPostPayload","Response","e","ErrorResponse","presignedPayloads","pMap","data","s3Client","S3","process","useCase","CreateMultiPartUploadUseCase","String","multiPartUpload","CompleteMultiPartUploadUseCase","staticSchemaKey","S3GraphQLSchema","CoreGraphQLSchemaFactory"],"mappings":";;;;;;;;;;;;;AAgBA,MAAMA,YAA0B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsFjC,CAAC;AAED,MAAMC;IAGF,MAAa,QAAQC,OAAuC,EAAmC;QAC3FA,QAAQ,WAAW,CAACF;QAEpBE,QAAQ,WAAW,CAAqC;YACpD,MAAM;YACN,cAAc;gBAACC;gBAAiBC;gBAAoBC;aAAc;YAClE,UACIC,eAA0C,EAC1CC,WAAyC,EACzCC,aAAsC;gBAEtC,OAAO,OAAO,EAAEC,IAAI,EAAEC,OAAO,EAAE;oBAC3B,IAAI;wBACA,MAAMC,iBAAiBL,iBAAiB;4BAAE,KAAK;wBAAI;wBAEnD,MAAMM,iBAAiB,MAAML,YAAY,OAAO;wBAChD,MAAMM,WAAWD,eAAe,KAAK;wBAErC,MAAME,aAAaC,gCAAgCL;wBACnD,MAAMM,mBAAmB,MAAMC,wBAC3B,MAAMH,WAAW,aAAa,CAACL,KAAK,IAAI,GACxCI,UACAL;wBAGJ,OAAO,IAAIU,SAASF;oBACxB,EAAE,OAAOG,GAAG;wBACR,OAAO,IAAIC,cAAc;4BACrB,SAASD,EAAE,OAAO;4BAClB,MAAMA,EAAE,IAAI;4BACZ,MAAMA,EAAE,IAAI;wBAChB;oBACJ;gBACJ;YACJ;QACJ;QAEAjB,QAAQ,WAAW,CAAuC;YACtD,MAAM;YACN,cAAc;gBAACC;gBAAiBC;gBAAoBC;aAAc;YAClE,UACIC,eAA0C,EAC1CC,WAAyC,EACzCC,aAAsC;gBAEtC,OAAO,OAAO,EAAEC,IAAI,EAAEC,OAAO,EAAE;oBAC3B,MAAMC,iBAAiBL,iBAAiB;wBAAE,KAAK;oBAAI;oBAEnD,IAAI;wBACA,MAAMM,iBAAiB,MAAML,YAAY,OAAO;wBAChD,MAAMM,WAAWD,eAAe,KAAK;wBAErC,MAAME,aAAaC,gCAAgCL;wBAEnD,MAAMW,oBAAoB,MAAMC,MAAKb,KAAK,IAAI,EAAE,OAAMc,OAC3CN,wBACH,MAAMH,WAAW,aAAa,CAACS,OAC/BV,UACAL;wBAIR,OAAO,IAAIU,SAASG;oBACxB,EAAE,OAAOF,GAAG;wBACR,OAAO,IAAIC,cAAc;4BACrB,SAASD,EAAE,OAAO;4BAClB,MAAMA,EAAE,IAAI;4BACZ,MAAMA,EAAE,IAAI;wBAChB;oBACJ;gBACJ;YACJ;QACJ;QAEAjB,QAAQ,WAAW,CAAuC;YACtD,MAAM;YACN,cAAc;gBAACC;aAAgB;YAC/B,UAASG,eAA0C;gBAC/C,OAAO,OAAO,EAAEG,IAAI,EAAEC,OAAO,EAAE;oBAC3B,MAAMC,iBAAiBL,iBAAiB;wBAAE,KAAK;oBAAI;oBAEnD,MAAMkB,WAAW,IAAIC,GAAG;wBAAE,QAAQC,QAAQ,GAAG,CAAC,UAAU;oBAAC;oBAEzD,IAAI;wBACA,MAAMC,UAAU,IAAIC,6BAChBC,OAAOH,QAAQ,GAAG,CAAC,SAAS,GAC5BF;wBAGJ,MAAMV,aAAaC,gCAAgCL;wBAEnD,MAAMoB,kBAAkB,MAAMH,QAAQ,OAAO,CAAC;4BAC1C,MAAM,MAAMb,WAAW,aAAa,CAACL,KAAK,IAAI;4BAC9C,eAAeA,KAAK,aAAa;wBACrC;wBAEA,OAAO,IAAIS,SAASY;oBACxB,EAAE,OAAOX,GAAG;wBACR,OAAO,IAAIC,cAAc;4BACrB,SAASD,EAAE,OAAO;4BAClB,MAAMA,EAAE,IAAI;4BACZ,MAAMA,EAAE,IAAI;wBAChB;oBACJ;gBACJ;YACJ;QACJ;QAEAjB,QAAQ,WAAW,CAAwC;YACvD,MAAM;YACN,cAAc;gBAACC;aAAgB;YAC/B,UAASG,eAA0C;gBAC/C,OAAO,OAAO,EAAEG,IAAI,EAAE;oBAClB,MAAME,iBAAiBL,iBAAiB;wBAAE,KAAK;oBAAI;oBAEnD,MAAMkB,WAAW,IAAIC,GAAG;wBAAE,QAAQC,QAAQ,GAAG,CAAC,UAAU;oBAAC;oBAEzD,IAAI;wBACA,MAAMC,UAAU,IAAII,+BAChBF,OAAOH,QAAQ,GAAG,CAAC,SAAS,GAC5BF;wBAGJ,MAAMG,QAAQ,OAAO,CAAC;4BAClB,SAASlB,KAAK,OAAO;4BACrB,UAAUA,KAAK,QAAQ;wBAC3B;wBAEA,OAAO,IAAIS,SAAS;oBACxB,EAAE,OAAOC,GAAG;wBACR,OAAO,IAAIC,cAAc;4BACrB,SAASD,EAAE,OAAO;4BAClB,MAAMA,EAAE,IAAI;4BACZ,MAAMA,EAAE,IAAI;wBAChB;oBACJ;gBACJ;YACJ;QACJ;QAEA,OAAOjB;IACX;;aA/IO,YAAY,GAAG8B,gBAAgB;;AAgJ1C;AAEO,MAAMC,kBAAkBC,yBAAyB,oBAAoB,CAAC;IACzE,gBAAgBjC;IAChB,cAAc,EAAE;AACpB"}
|
|
@@ -1,37 +1,22 @@
|
|
|
1
1
|
import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/index.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
if (relevantFilePermissions.length === 0) {
|
|
11
|
-
throw new NotAuthorizedError();
|
|
12
|
-
}
|
|
13
|
-
return relevantFilePermissions;
|
|
2
|
+
const checkPermissions = async (identityContext, check = {})=>{
|
|
3
|
+
const filePermissions = await identityContext.getPermissions("fm.file");
|
|
4
|
+
const relevantFilePermissions = filePermissions.filter((current)=>{
|
|
5
|
+
if (check.rwd && !hasRwd(current, check.rwd)) return false;
|
|
6
|
+
return true;
|
|
7
|
+
});
|
|
8
|
+
if (0 === relevantFilePermissions.length) throw new NotAuthorizedError();
|
|
9
|
+
return relevantFilePermissions;
|
|
14
10
|
};
|
|
15
|
-
const hasRwd = (filesFilePermissions, rwd)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
// Is there a permission that doesn't restrict RWD permissions, that means all RWD permissions are allowed.
|
|
24
|
-
const permissionWithoutRwdRestrictions = filesFilePermissions.some(permission => {
|
|
25
|
-
return typeof permission.rwd !== "string";
|
|
26
|
-
});
|
|
27
|
-
if (permissionWithoutRwdRestrictions) {
|
|
28
|
-
return true;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
// If there is no permission that doesn't restrict RWD permissions, that means we need to check if the RWD.
|
|
32
|
-
return filesFilePermissions.some(permission => {
|
|
33
|
-
return permission.rwd && permission.rwd.includes(rwd);
|
|
34
|
-
});
|
|
11
|
+
const hasRwd = (filesFilePermissions, rwd)=>{
|
|
12
|
+
if (!Array.isArray(filesFilePermissions)) filesFilePermissions = [
|
|
13
|
+
filesFilePermissions
|
|
14
|
+
];
|
|
15
|
+
if (!rwd) return true;
|
|
16
|
+
const permissionWithoutRwdRestrictions = filesFilePermissions.some((permission)=>"string" != typeof permission.rwd);
|
|
17
|
+
if (permissionWithoutRwdRestrictions) return true;
|
|
18
|
+
return filesFilePermissions.some((permission)=>permission.rwd && permission.rwd.includes(rwd));
|
|
35
19
|
};
|
|
20
|
+
export { checkPermissions };
|
|
36
21
|
|
|
37
22
|
//# sourceMappingURL=checkPermissions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"graphql/checkPermissions.js","sources":["../../src/graphql/checkPermissions.ts"],"sourcesContent":["import type { FilePermission } from \"@webiny/api-file-manager/types.js\";\nimport { NotAuthorizedError } from \"@webiny/api-core/features/security/shared/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\n\nexport const checkPermissions = async (\n identityContext: IdentityContext.Interface,\n check: { rwd?: string } = {}\n) => {\n const filePermissions = await identityContext.getPermissions<FilePermission>(\"fm.file\");\n\n const relevantFilePermissions = filePermissions.filter(current => {\n if (check.rwd && !hasRwd(current, check.rwd)) {\n return false;\n }\n\n return true;\n });\n\n if (relevantFilePermissions.length === 0) {\n throw new NotAuthorizedError();\n }\n\n return relevantFilePermissions;\n};\n\nconst hasRwd = (filesFilePermissions: FilePermission | FilePermission[], rwd: string): boolean => {\n if (!Array.isArray(filesFilePermissions)) {\n filesFilePermissions = [filesFilePermissions];\n }\n\n if (!rwd) {\n return true;\n }\n\n // Is there a permission that doesn't restrict RWD permissions, that means all RWD permissions are allowed.\n const permissionWithoutRwdRestrictions = filesFilePermissions.some(permission => {\n return typeof permission.rwd !== \"string\";\n });\n\n if (permissionWithoutRwdRestrictions) {\n return true;\n }\n\n // If there is no permission that doesn't restrict RWD permissions, that means we need to check if the RWD.\n return filesFilePermissions.some(permission => {\n return permission.rwd && permission.rwd.includes(rwd);\n });\n};\n"],"names":["checkPermissions","identityContext","check","filePermissions","relevantFilePermissions","current","hasRwd","NotAuthorizedError","filesFilePermissions","rwd","Array","permissionWithoutRwdRestrictions","permission"],"mappings":";AAIO,MAAMA,mBAAmB,OAC5BC,iBACAC,QAA0B,CAAC,CAAC;IAE5B,MAAMC,kBAAkB,MAAMF,gBAAgB,cAAc,CAAiB;IAE7E,MAAMG,0BAA0BD,gBAAgB,MAAM,CAACE,CAAAA;QACnD,IAAIH,MAAM,GAAG,IAAI,CAACI,OAAOD,SAASH,MAAM,GAAG,GACvC,OAAO;QAGX,OAAO;IACX;IAEA,IAAIE,AAAmC,MAAnCA,wBAAwB,MAAM,EAC9B,MAAM,IAAIG;IAGd,OAAOH;AACX;AAEA,MAAME,SAAS,CAACE,sBAAyDC;IACrE,IAAI,CAACC,MAAM,OAAO,CAACF,uBACfA,uBAAuB;QAACA;KAAqB;IAGjD,IAAI,CAACC,KACD,OAAO;IAIX,MAAME,mCAAmCH,qBAAqB,IAAI,CAACI,CAAAA,aACxD,AAA0B,YAA1B,OAAOA,WAAW,GAAG;IAGhC,IAAID,kCACA,OAAO;IAIX,OAAOH,qBAAqB,IAAI,CAACI,CAAAA,aACtBA,WAAW,GAAG,IAAIA,WAAW,GAAG,CAAC,QAAQ,CAACH;AAEzD"}
|
package/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ContextPlugin } from "@webiny/api";
|
|
2
1
|
export { createFileUploadModifier } from "./utils/FileUploadModifier.js";
|
|
3
2
|
export { createAssetDelivery } from "./assetDelivery/createAssetDelivery.js";
|
|
4
|
-
export
|
|
3
|
+
export { FileManagerS3Feature } from "./FileManagerS3Feature.js";
|
|
4
|
+
export type { FileManagerS3FeatureConfig } from "./FileManagerS3Feature.js";
|
package/index.js
CHANGED
|
@@ -1,27 +1,3 @@
|
|
|
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 { GetFileContentsFeature } from "./features/GetFileContents/feature.js";
|
|
10
1
|
export { createFileUploadModifier } from "./utils/FileUploadModifier.js";
|
|
11
2
|
export { createAssetDelivery } from "./assetDelivery/createAssetDelivery.js";
|
|
12
|
-
|
|
13
|
-
const container = context.container;
|
|
14
|
-
FlushCacheFeature.register(container);
|
|
15
|
-
DeleteFileFromBucketFeature.register(container);
|
|
16
|
-
ExtractMetadataFeature.register(container);
|
|
17
|
-
WriteFileMetadataFeature.register(container);
|
|
18
|
-
GetFileContentsFeature.register(container);
|
|
19
|
-
const wcp = container.resolve(WcpContext);
|
|
20
|
-
if (wcp.canUseFileManagerThreatDetection()) {
|
|
21
|
-
ApplyThreatScanningFeature.register(container);
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
contextPlugin.name = `fileManagerS3.context`;
|
|
25
|
-
export const createFileManagerS3 = () => [contextPlugin, createS3GraphQLSchema()];
|
|
26
|
-
|
|
27
|
-
//# sourceMappingURL=index.js.map
|
|
3
|
+
export { FileManagerS3Feature } from "./FileManagerS3Feature.js";
|
|
@@ -1,58 +1,55 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
Bucket: this.bucket,
|
|
11
|
-
Key: params.fileKey,
|
|
12
|
-
UploadId: params.uploadId
|
|
13
|
-
};
|
|
14
|
-
const allParts = await this.getAllUploadParts(uploadParams);
|
|
15
|
-
const s3Params = {
|
|
16
|
-
...uploadParams,
|
|
17
|
-
MultipartUpload: {
|
|
18
|
-
Parts: allParts
|
|
19
|
-
}
|
|
20
|
-
};
|
|
21
|
-
try {
|
|
22
|
-
const command = new CompleteMultipartUploadCommand(s3Params);
|
|
23
|
-
await this.s3.send(command);
|
|
24
|
-
} catch (err) {
|
|
25
|
-
console.error(err);
|
|
26
|
-
throw err;
|
|
1
|
+
import { CompleteMultipartUploadCommand, ListPartsCommand } from "@webiny/aws-sdk/client-s3/index.js";
|
|
2
|
+
class CompleteMultiPartUploadUseCase {
|
|
3
|
+
constructor(bucket, s3Client){
|
|
4
|
+
this.emptyMarkerValues = [
|
|
5
|
+
void 0,
|
|
6
|
+
"0"
|
|
7
|
+
];
|
|
8
|
+
this.bucket = bucket;
|
|
9
|
+
this.s3 = s3Client;
|
|
27
10
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
11
|
+
async execute(params) {
|
|
12
|
+
const uploadParams = {
|
|
13
|
+
Bucket: this.bucket,
|
|
14
|
+
Key: params.fileKey,
|
|
15
|
+
UploadId: params.uploadId
|
|
16
|
+
};
|
|
17
|
+
const allParts = await this.getAllUploadParts(uploadParams);
|
|
18
|
+
const s3Params = {
|
|
19
|
+
...uploadParams,
|
|
20
|
+
MultipartUpload: {
|
|
21
|
+
Parts: allParts
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
try {
|
|
25
|
+
const command = new CompleteMultipartUploadCommand(s3Params);
|
|
26
|
+
await this.s3.send(command);
|
|
27
|
+
} catch (err) {
|
|
28
|
+
console.error(err);
|
|
29
|
+
throw err;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async getAllUploadParts(params) {
|
|
33
|
+
const parts = [];
|
|
34
|
+
let marker;
|
|
35
|
+
while(true){
|
|
36
|
+
const { Parts, PartNumberMarker } = await this.s3.send(new ListPartsCommand({
|
|
37
|
+
...params,
|
|
38
|
+
PartNumberMarker: marker
|
|
39
|
+
}));
|
|
40
|
+
if (Parts) Parts.forEach((part)=>parts.push(part));
|
|
41
|
+
marker = PartNumberMarker || void 0;
|
|
42
|
+
if (this.isMarkerEmpty(marker)) break;
|
|
43
|
+
}
|
|
44
|
+
return parts.map((part)=>({
|
|
45
|
+
ETag: part.ETag,
|
|
46
|
+
PartNumber: part.PartNumber
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
49
|
+
isMarkerEmpty(marker) {
|
|
50
|
+
return this.emptyMarkerValues.includes(marker);
|
|
47
51
|
}
|
|
48
|
-
return parts.map(part => ({
|
|
49
|
-
ETag: part.ETag,
|
|
50
|
-
PartNumber: part.PartNumber
|
|
51
|
-
}));
|
|
52
|
-
}
|
|
53
|
-
isMarkerEmpty(marker) {
|
|
54
|
-
return this.emptyMarkerValues.includes(marker);
|
|
55
|
-
}
|
|
56
52
|
}
|
|
53
|
+
export { CompleteMultiPartUploadUseCase };
|
|
57
54
|
|
|
58
55
|
//# sourceMappingURL=CompleteMultiPartUploadUseCase.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"file":"multiPartUpload/CompleteMultiPartUploadUseCase.js","sources":["../../src/multiPartUpload/CompleteMultiPartUploadUseCase.ts"],"sourcesContent":["import type { S3, Part, ListPartsOutput } from \"@webiny/aws-sdk/client-s3/index.js\";\nimport {\n ListPartsCommand,\n CompleteMultipartUploadCommand\n} from \"@webiny/aws-sdk/client-s3/index.js\";\n\ninterface CompleteMultiPartUploadParams {\n fileKey: string;\n uploadId: string;\n}\n\ninterface GetAllUploadPartsParams {\n Bucket: string;\n Key: string;\n UploadId: string;\n}\n\nexport class CompleteMultiPartUploadUseCase {\n private readonly s3: S3;\n private readonly bucket: string;\n private readonly emptyMarkerValues = [undefined, \"0\"];\n\n constructor(bucket: string, s3Client: S3) {\n this.bucket = bucket;\n this.s3 = s3Client;\n }\n\n async execute(params: CompleteMultiPartUploadParams) {\n const uploadParams = {\n Bucket: this.bucket,\n Key: params.fileKey,\n UploadId: params.uploadId\n };\n\n const allParts = await this.getAllUploadParts(uploadParams);\n\n const s3Params = {\n ...uploadParams,\n MultipartUpload: {\n Parts: allParts\n }\n };\n\n try {\n const command = new CompleteMultipartUploadCommand(s3Params);\n await this.s3.send(command);\n } catch (err) {\n console.error(err);\n throw err;\n }\n }\n\n private async getAllUploadParts(params: GetAllUploadPartsParams) {\n const parts: Part[] = [];\n\n let marker: string | undefined = undefined;\n while (true) {\n const { Parts, PartNumberMarker }: ListPartsOutput = await this.s3.send(\n new ListPartsCommand({\n ...params,\n PartNumberMarker: marker\n })\n );\n\n if (Parts) {\n Parts.forEach(part => parts.push(part));\n }\n\n marker = PartNumberMarker || undefined;\n if (this.isMarkerEmpty(marker)) {\n break;\n }\n }\n\n return parts.map(part => ({\n ETag: part.ETag as string,\n PartNumber: part.PartNumber as number\n }));\n }\n\n private isMarkerEmpty(marker: string | undefined) {\n return this.emptyMarkerValues.includes(marker);\n }\n}\n"],"names":["CompleteMultiPartUploadUseCase","bucket","s3Client","undefined","params","uploadParams","allParts","s3Params","command","CompleteMultipartUploadCommand","err","console","parts","marker","Parts","PartNumberMarker","ListPartsCommand","part"],"mappings":";AAiBO,MAAMA;IAKT,YAAYC,MAAc,EAAEC,QAAY,CAAE;aAFzB,iBAAiB,GAAG;YAACC;YAAW;SAAI;QAGjD,IAAI,CAAC,MAAM,GAAGF;QACd,IAAI,CAAC,EAAE,GAAGC;IACd;IAEA,MAAM,QAAQE,MAAqC,EAAE;QACjD,MAAMC,eAAe;YACjB,QAAQ,IAAI,CAAC,MAAM;YACnB,KAAKD,OAAO,OAAO;YACnB,UAAUA,OAAO,QAAQ;QAC7B;QAEA,MAAME,WAAW,MAAM,IAAI,CAAC,iBAAiB,CAACD;QAE9C,MAAME,WAAW;YACb,GAAGF,YAAY;YACf,iBAAiB;gBACb,OAAOC;YACX;QACJ;QAEA,IAAI;YACA,MAAME,UAAU,IAAIC,+BAA+BF;YACnD,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CAACC;QACvB,EAAE,OAAOE,KAAK;YACVC,QAAQ,KAAK,CAACD;YACd,MAAMA;QACV;IACJ;IAEA,MAAc,kBAAkBN,MAA+B,EAAE;QAC7D,MAAMQ,QAAgB,EAAE;QAExB,IAAIC;QACJ,MAAO,KAAM;YACT,MAAM,EAAEC,KAAK,EAAEC,gBAAgB,EAAE,GAAoB,MAAM,IAAI,CAAC,EAAE,CAAC,IAAI,CACnE,IAAIC,iBAAiB;gBACjB,GAAGZ,MAAM;gBACT,kBAAkBS;YACtB;YAGJ,IAAIC,OACAA,MAAM,OAAO,CAACG,CAAAA,OAAQL,MAAM,IAAI,CAACK;YAGrCJ,SAASE,oBAAoBZ;YAC7B,IAAI,IAAI,CAAC,aAAa,CAACU,SACnB;QAER;QAEA,OAAOD,MAAM,GAAG,CAACK,CAAAA,OAAS;gBACtB,MAAMA,KAAK,IAAI;gBACf,YAAYA,KAAK,UAAU;YAC/B;IACJ;IAEQ,cAAcJ,MAA0B,EAAE;QAC9C,OAAO,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAACA;IAC3C;AACJ"}
|