@webiny/api-file-manager-s3 0.0.0-mt-2 → 0.0.0-unstable.06b2ede40f
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/assetDelivery/assetDeliveryConfig.d.ts +2 -0
- package/assetDelivery/assetDeliveryConfig.js +52 -0
- package/assetDelivery/assetDeliveryConfig.js.map +1 -0
- package/assetDelivery/createAssetDelivery.d.ts +3 -0
- package/assetDelivery/createAssetDelivery.js +30 -0
- package/assetDelivery/createAssetDelivery.js.map +1 -0
- package/assetDelivery/createCustomAssetDelivery.d.ts +12 -0
- package/assetDelivery/createCustomAssetDelivery.js +28 -0
- package/assetDelivery/createCustomAssetDelivery.js.map +1 -0
- package/assetDelivery/customAssets/CustomAsset.d.ts +6 -0
- package/assetDelivery/customAssets/CustomAsset.js +14 -0
- package/assetDelivery/customAssets/CustomAsset.js.map +1 -0
- package/assetDelivery/customAssets/CustomAssetProcessor.d.ts +10 -0
- package/assetDelivery/customAssets/CustomAssetProcessor.js +25 -0
- package/assetDelivery/customAssets/CustomAssetProcessor.js.map +1 -0
- package/assetDelivery/customAssets/S3CustomAssetResolver.d.ts +15 -0
- package/assetDelivery/customAssets/S3CustomAssetResolver.js +90 -0
- package/assetDelivery/customAssets/S3CustomAssetResolver.js.map +1 -0
- package/assetDelivery/customAssets/customAssetDeliveryConfig.d.ts +1 -0
- package/assetDelivery/customAssets/customAssetDeliveryConfig.js +30 -0
- package/assetDelivery/customAssets/customAssetDeliveryConfig.js.map +1 -0
- package/assetDelivery/index.d.ts +9 -0
- package/assetDelivery/index.js +70 -0
- package/assetDelivery/index.js.map +1 -0
- package/assetDelivery/s3/S3AssetMetadataReader.d.ts +15 -0
- package/assetDelivery/s3/S3AssetMetadataReader.js +36 -0
- package/assetDelivery/s3/S3AssetMetadataReader.js.map +1 -0
- package/assetDelivery/s3/S3AssetResolver.d.ts +9 -0
- package/assetDelivery/s3/S3AssetResolver.js +37 -0
- package/assetDelivery/s3/S3AssetResolver.js.map +1 -0
- package/assetDelivery/s3/S3ContentsReader.d.ts +10 -0
- package/assetDelivery/s3/S3ContentsReader.js +27 -0
- package/assetDelivery/s3/S3ContentsReader.js.map +1 -0
- package/assetDelivery/s3/S3ErrorAssetReply.d.ts +4 -0
- package/assetDelivery/s3/S3ErrorAssetReply.js +20 -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 +23 -0
- package/assetDelivery/s3/S3RedirectAssetReply.js.map +1 -0
- package/assetDelivery/s3/S3StreamAssetReply.d.ts +5 -0
- package/assetDelivery/s3/S3StreamAssetReply.js +23 -0
- package/assetDelivery/s3/S3StreamAssetReply.js.map +1 -0
- package/assetDelivery/s3/SharpTransform.d.ts +18 -0
- package/assetDelivery/s3/SharpTransform.js +192 -0
- package/assetDelivery/s3/SharpTransform.js.map +1 -0
- package/assetDelivery/s3/transformation/AssetKeyGenerator.d.ts +8 -0
- package/assetDelivery/s3/transformation/AssetKeyGenerator.js +29 -0
- package/assetDelivery/s3/transformation/AssetKeyGenerator.js.map +1 -0
- package/assetDelivery/s3/transformation/CallableContentsReader.d.ts +12 -0
- package/assetDelivery/s3/transformation/CallableContentsReader.js +17 -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 +27 -0
- package/assetDelivery/s3/transformation/WidthCollection.js.map +1 -0
- package/assetDelivery/s3/transformation/legacyUtils.d.ts +12 -0
- package/assetDelivery/s3/transformation/legacyUtils.js +34 -0
- package/assetDelivery/s3/transformation/legacyUtils.js.map +1 -0
- package/assetDelivery/s3/transformation/utils.d.ts +11 -0
- package/assetDelivery/s3/transformation/utils.js +33 -0
- package/assetDelivery/s3/transformation/utils.js.map +1 -0
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.d.ts +2 -0
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js +62 -0
- package/assetDelivery/threatDetection/createThreatDetectionEventHandler.js.map +1 -0
- package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.d.ts +2 -0
- package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js +13 -0
- package/assetDelivery/threatDetection/createThreatDetectionPluginLoader.js.map +1 -0
- package/assetDelivery/threatDetection/index.d.ts +2 -0
- package/assetDelivery/threatDetection/index.js +29 -0
- package/assetDelivery/threatDetection/index.js.map +1 -0
- package/assetDelivery/threatDetection/processThreatScanResult.d.ts +2 -0
- package/assetDelivery/threatDetection/processThreatScanResult.js +66 -0
- package/assetDelivery/threatDetection/processThreatScanResult.js.map +1 -0
- package/assetDelivery/threatDetection/types.d.ts +13 -0
- package/assetDelivery/threatDetection/types.js +7 -0
- package/assetDelivery/threatDetection/types.js.map +1 -0
- package/assetDelivery/types.d.ts +11 -0
- package/assetDelivery/types.js +7 -0
- package/assetDelivery/types.js.map +1 -0
- package/flushCdnCache/CdnPathsGenerator.d.ts +4 -0
- package/flushCdnCache/CdnPathsGenerator.js +14 -0
- package/flushCdnCache/CdnPathsGenerator.js.map +1 -0
- package/flushCdnCache/InvalidateCacheTask.d.ts +18 -0
- package/flushCdnCache/InvalidateCacheTask.js +78 -0
- package/flushCdnCache/InvalidateCacheTask.js.map +1 -0
- package/flushCdnCache/flushCacheOnFileDelete.d.ts +3 -0
- package/flushCdnCache/flushCacheOnFileDelete.js +34 -0
- package/flushCdnCache/flushCacheOnFileDelete.js.map +1 -0
- package/flushCdnCache/flushCacheOnFileUpdate.d.ts +3 -0
- package/flushCdnCache/flushCacheOnFileUpdate.js +40 -0
- package/flushCdnCache/flushCacheOnFileUpdate.js.map +1 -0
- package/flushCdnCache/index.d.ts +1 -0
- package/flushCdnCache/index.js +15 -0
- package/flushCdnCache/index.js.map +1 -0
- package/flushCdnCache/invalidateCacheTaskDefinition.d.ts +2 -0
- package/flushCdnCache/invalidateCacheTaskDefinition.js +22 -0
- package/flushCdnCache/invalidateCacheTaskDefinition.js.map +1 -0
- package/index.d.ts +4 -1
- package/index.js +27 -7
- package/index.js.map +1 -0
- package/multiPartUpload/CompleteMultiPartUploadUseCase.d.ts +15 -0
- package/multiPartUpload/CompleteMultiPartUploadUseCase.js +65 -0
- package/multiPartUpload/CompleteMultiPartUploadUseCase.js.map +1 -0
- package/multiPartUpload/CreateMultiPartUploadUseCase.d.ts +20 -0
- package/multiPartUpload/CreateMultiPartUploadUseCase.js +48 -0
- package/multiPartUpload/CreateMultiPartUploadUseCase.js.map +1 -0
- package/package.json +29 -16
- package/plugins/addFileMetadata.d.ts +10 -0
- package/plugins/addFileMetadata.js +67 -0
- package/plugins/addFileMetadata.js.map +1 -0
- package/plugins/checkPermissions.d.ts +4 -0
- package/plugins/checkPermissions.js +44 -0
- package/plugins/checkPermissions.js.map +1 -0
- package/plugins/fileStorageS3.d.ts +2 -2
- package/plugins/fileStorageS3.js +47 -46
- package/plugins/fileStorageS3.js.map +1 -0
- package/plugins/graphqlFileStorageS3.d.ts +2 -2
- package/plugins/graphqlFileStorageS3.js +137 -59
- package/plugins/graphqlFileStorageS3.js.map +1 -0
- package/types.d.ts +20 -0
- package/types.js +7 -1
- package/types.js.map +1 -0
- package/utils/FileExtension.d.ts +6 -0
- package/utils/FileExtension.js +24 -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 +60 -0
- package/utils/FileKey.test.js.map +1 -0
- package/utils/FileNormalizer.d.ts +18 -0
- package/utils/FileNormalizer.js +49 -0
- package/utils/FileNormalizer.js.map +1 -0
- package/utils/FileUploadModifier.d.ts +30 -0
- package/utils/FileUploadModifier.js +49 -0
- package/utils/FileUploadModifier.js.map +1 -0
- package/utils/createFileNormalizerFromContext.d.ts +3 -0
- package/utils/createFileNormalizerFromContext.js +15 -0
- package/utils/createFileNormalizerFromContext.js.map +1 -0
- package/utils/getPresignedPostPayload.d.ts +3 -11
- package/utils/getPresignedPostPayload.js +14 -55
- package/utils/getPresignedPostPayload.js.map +1 -0
- package/utils/mimeTypes.d.ts +5 -0
- package/utils/mimeTypes.js +23 -0
- package/utils/mimeTypes.js.map +1 -0
- package/utils/uploadFileToS3.d.ts +5 -1
- package/utils/uploadFileToS3.js +9 -12
- package/utils/uploadFileToS3.js.map +1 -0
|
@@ -1,53 +1,79 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.default = void 0;
|
|
9
|
-
|
|
8
|
+
var _clientS = require("@webiny/aws-sdk/client-s3");
|
|
9
|
+
var _pMap = _interopRequireDefault(require("p-map"));
|
|
10
10
|
var _responses = require("@webiny/handler-graphql/responses");
|
|
11
|
-
|
|
12
|
-
var
|
|
13
|
-
|
|
14
|
-
var
|
|
15
|
-
|
|
16
|
-
|
|
11
|
+
var _getPresignedPostPayload = require("../utils/getPresignedPostPayload");
|
|
12
|
+
var _error = _interopRequireDefault(require("@webiny/error"));
|
|
13
|
+
var _checkPermissions = require("./checkPermissions");
|
|
14
|
+
var _CreateMultiPartUploadUseCase = require("../multiPartUpload/CreateMultiPartUploadUseCase");
|
|
15
|
+
var _CompleteMultiPartUploadUseCase = require("../multiPartUpload/CompleteMultiPartUploadUseCase");
|
|
16
|
+
var _createFileNormalizerFromContext = require("../utils/createFileNormalizerFromContext");
|
|
17
17
|
const plugin = {
|
|
18
18
|
type: "graphql-schema",
|
|
19
19
|
name: "graphql-schema-api-file-manager-s3",
|
|
20
20
|
schema: {
|
|
21
|
-
typeDefs:
|
|
22
|
-
|
|
23
|
-
|
|
21
|
+
typeDefs: /* GraphQL */`
|
|
22
|
+
type UploadFileResponseDataFile {
|
|
23
|
+
id: ID!
|
|
24
|
+
name: String!
|
|
25
|
+
type: String!
|
|
26
|
+
size: Long!
|
|
27
|
+
key: String!
|
|
28
|
+
}
|
|
29
|
+
|
|
24
30
|
input PreSignedPostPayloadInput {
|
|
31
|
+
id: ID
|
|
25
32
|
name: String!
|
|
26
33
|
type: String!
|
|
27
|
-
size:
|
|
34
|
+
size: Long!
|
|
35
|
+
key: String
|
|
36
|
+
keyPrefix: String
|
|
28
37
|
}
|
|
29
38
|
|
|
30
39
|
type GetPreSignedPostPayloadResponseDataFile {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
40
|
+
id: ID!
|
|
41
|
+
name: String!
|
|
42
|
+
type: String!
|
|
43
|
+
size: Long!
|
|
44
|
+
key: String!
|
|
35
45
|
}
|
|
36
46
|
|
|
37
47
|
type GetPreSignedPostPayloadResponseData {
|
|
38
48
|
# Contains data that is necessary for initiating a file upload.
|
|
39
|
-
data: JSON
|
|
40
|
-
file: UploadFileResponseDataFile
|
|
49
|
+
data: JSON!
|
|
50
|
+
file: UploadFileResponseDataFile!
|
|
41
51
|
}
|
|
42
52
|
|
|
43
53
|
type GetPreSignedPostPayloadResponse {
|
|
44
|
-
error:
|
|
54
|
+
error: FmError
|
|
45
55
|
data: GetPreSignedPostPayloadResponseData
|
|
46
56
|
}
|
|
47
57
|
|
|
58
|
+
type MultiPartUploadFilePart {
|
|
59
|
+
partNumber: Int!
|
|
60
|
+
url: String!
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
type CreateMultiPartUploadResponseData {
|
|
64
|
+
file: GetPreSignedPostPayloadResponseDataFile!
|
|
65
|
+
uploadId: String!
|
|
66
|
+
parts: [MultiPartUploadFilePart!]!
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
type CompleteMultiPartUploadResponse {
|
|
70
|
+
data: Boolean
|
|
71
|
+
error: FmError
|
|
72
|
+
}
|
|
73
|
+
|
|
48
74
|
type GetPreSignedPostPayloadsResponse {
|
|
49
|
-
error:
|
|
50
|
-
data: [GetPreSignedPostPayloadResponseData]!
|
|
75
|
+
error: FmError
|
|
76
|
+
data: [GetPreSignedPostPayloadResponseData!]!
|
|
51
77
|
}
|
|
52
78
|
|
|
53
79
|
extend type FmQuery {
|
|
@@ -58,20 +84,46 @@ const plugin = {
|
|
|
58
84
|
data: [PreSignedPostPayloadInput]!
|
|
59
85
|
): GetPreSignedPostPayloadsResponse
|
|
60
86
|
}
|
|
87
|
+
|
|
88
|
+
type CreateMultiPartUploadResponse {
|
|
89
|
+
data: CreateMultiPartUploadResponseData
|
|
90
|
+
error: FmError
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
input MultiPartUploadFilePartInput {
|
|
94
|
+
partNumber: Int!
|
|
95
|
+
etag: String!
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
extend type FmMutation {
|
|
99
|
+
createMultiPartUpload(
|
|
100
|
+
data: PreSignedPostPayloadInput!
|
|
101
|
+
numberOfParts: Number!
|
|
102
|
+
): CreateMultiPartUploadResponse
|
|
103
|
+
|
|
104
|
+
completeMultiPartUpload(
|
|
105
|
+
fileKey: String!
|
|
106
|
+
uploadId: String!
|
|
107
|
+
): CompleteMultiPartUploadResponse
|
|
108
|
+
}
|
|
61
109
|
`,
|
|
62
110
|
resolvers: {
|
|
63
111
|
FmQuery: {
|
|
64
112
|
getPreSignedPostPayload: async (_, args, context) => {
|
|
65
113
|
try {
|
|
66
|
-
await (0,
|
|
114
|
+
await (0, _checkPermissions.checkPermissions)(context, {
|
|
67
115
|
rwd: "w"
|
|
68
116
|
});
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
117
|
+
const data = args.data;
|
|
118
|
+
const settings = await context.fileManager.getSettings();
|
|
119
|
+
if (!settings) {
|
|
120
|
+
throw new _error.default("Missing File Manager Settings.", "FILE_MANAGER_SETTINGS_ERROR", {
|
|
121
|
+
file: data
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
const normalizer = (0, _createFileNormalizerFromContext.createFileNormalizerFromContext)(context);
|
|
125
|
+
const presignedPayload = await (0, _getPresignedPostPayload.getPresignedPostPayload)(await normalizer.normalizeFile(data), settings);
|
|
126
|
+
return new _responses.Response(presignedPayload);
|
|
75
127
|
} catch (e) {
|
|
76
128
|
return new _responses.ErrorResponse({
|
|
77
129
|
message: e.message,
|
|
@@ -81,44 +133,69 @@ const plugin = {
|
|
|
81
133
|
}
|
|
82
134
|
},
|
|
83
135
|
getPreSignedPostPayloads: async (_, args, context) => {
|
|
84
|
-
await (0,
|
|
136
|
+
await (0, _checkPermissions.checkPermissions)(context, {
|
|
85
137
|
rwd: "w"
|
|
86
138
|
});
|
|
87
|
-
const
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
139
|
+
const files = args.data;
|
|
140
|
+
try {
|
|
141
|
+
const settings = await context.fileManager.getSettings();
|
|
142
|
+
if (!settings) {
|
|
143
|
+
throw new _error.default("Missing File Manager Settings.", "FILE_MANAGER_SETTINGS_ERROR", {
|
|
144
|
+
files
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
const normalizer = (0, _createFileNormalizerFromContext.createFileNormalizerFromContext)(context);
|
|
148
|
+
const presignedPayloads = await (0, _pMap.default)(files, async data => {
|
|
149
|
+
return (0, _getPresignedPostPayload.getPresignedPostPayload)(await normalizer.normalizeFile(data), settings);
|
|
95
150
|
});
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if (files.length === 0) {
|
|
151
|
+
return new _responses.Response(presignedPayloads);
|
|
152
|
+
} catch (e) {
|
|
99
153
|
return new _responses.ErrorResponse({
|
|
100
|
-
|
|
101
|
-
|
|
154
|
+
message: e.message,
|
|
155
|
+
code: e.code,
|
|
156
|
+
data: e.data
|
|
102
157
|
});
|
|
103
158
|
}
|
|
104
|
-
|
|
105
|
-
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
FmMutation: {
|
|
162
|
+
createMultiPartUpload: async (_, args, context) => {
|
|
163
|
+
await (0, _checkPermissions.checkPermissions)(context, {
|
|
164
|
+
rwd: "w"
|
|
165
|
+
});
|
|
166
|
+
const s3Client = new _clientS.S3({
|
|
167
|
+
region: process.env.AWS_REGION
|
|
168
|
+
});
|
|
169
|
+
try {
|
|
170
|
+
const useCase = new _CreateMultiPartUploadUseCase.CreateMultiPartUploadUseCase(String(process.env.S3_BUCKET), s3Client);
|
|
171
|
+
const normalizer = (0, _createFileNormalizerFromContext.createFileNormalizerFromContext)(context);
|
|
172
|
+
const multiPartUpload = await useCase.execute({
|
|
173
|
+
file: await normalizer.normalizeFile(args.data),
|
|
174
|
+
numberOfParts: args.numberOfParts
|
|
175
|
+
});
|
|
176
|
+
return new _responses.Response(multiPartUpload);
|
|
177
|
+
} catch (e) {
|
|
106
178
|
return new _responses.ErrorResponse({
|
|
107
|
-
|
|
108
|
-
|
|
179
|
+
message: e.message,
|
|
180
|
+
code: e.code,
|
|
181
|
+
data: e.data
|
|
109
182
|
});
|
|
110
183
|
}
|
|
111
|
-
|
|
184
|
+
},
|
|
185
|
+
completeMultiPartUpload: async (_, args, context) => {
|
|
186
|
+
await (0, _checkPermissions.checkPermissions)(context, {
|
|
187
|
+
rwd: "w"
|
|
188
|
+
});
|
|
189
|
+
const s3Client = new _clientS.S3({
|
|
190
|
+
region: process.env.AWS_REGION
|
|
191
|
+
});
|
|
112
192
|
try {
|
|
113
|
-
const
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
return new _responses.Response(await Promise.all(promises));
|
|
193
|
+
const useCase = new _CompleteMultiPartUploadUseCase.CompleteMultiPartUploadUseCase(String(process.env.S3_BUCKET), s3Client);
|
|
194
|
+
await useCase.execute({
|
|
195
|
+
fileKey: args.fileKey,
|
|
196
|
+
uploadId: args.uploadId
|
|
197
|
+
});
|
|
198
|
+
return new _responses.Response(true);
|
|
122
199
|
} catch (e) {
|
|
123
200
|
return new _responses.ErrorResponse({
|
|
124
201
|
message: e.message,
|
|
@@ -131,5 +208,6 @@ const plugin = {
|
|
|
131
208
|
}
|
|
132
209
|
}
|
|
133
210
|
};
|
|
134
|
-
var _default = plugin;
|
|
135
|
-
|
|
211
|
+
var _default = exports.default = plugin;
|
|
212
|
+
|
|
213
|
+
//# sourceMappingURL=graphqlFileStorageS3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_clientS","require","_pMap","_interopRequireDefault","_responses","_getPresignedPostPayload","_error","_checkPermissions","_CreateMultiPartUploadUseCase","_CompleteMultiPartUploadUseCase","_createFileNormalizerFromContext","plugin","type","name","schema","typeDefs","resolvers","FmQuery","getPreSignedPostPayload","_","args","context","checkPermissions","rwd","data","settings","fileManager","getSettings","WebinyError","file","normalizer","createFileNormalizerFromContext","presignedPayload","getPresignedPostPayload","normalizeFile","Response","e","ErrorResponse","message","code","getPreSignedPostPayloads","files","presignedPayloads","pMap","FmMutation","createMultiPartUpload","s3Client","S3","region","process","env","AWS_REGION","useCase","CreateMultiPartUploadUseCase","String","S3_BUCKET","multiPartUpload","execute","numberOfParts","completeMultiPartUpload","CompleteMultiPartUploadUseCase","fileKey","uploadId","_default","exports","default"],"sources":["graphqlFileStorageS3.ts"],"sourcesContent":["import { S3 } from \"@webiny/aws-sdk/client-s3\";\nimport pMap from \"p-map\";\nimport type { GraphQLSchemaPlugin } from \"@webiny/handler-graphql/types\";\nimport { ErrorResponse, Response } from \"@webiny/handler-graphql/responses\";\nimport type { FileManagerContext } from \"@webiny/api-file-manager/types\";\nimport { getPresignedPostPayload } from \"~/utils/getPresignedPostPayload\";\nimport WebinyError from \"@webiny/error\";\nimport { checkPermissions } from \"~/plugins/checkPermissions\";\nimport type { PresignedPostPayloadData } from \"~/types\";\nimport { CreateMultiPartUploadUseCase } from \"~/multiPartUpload/CreateMultiPartUploadUseCase\";\nimport { CompleteMultiPartUploadUseCase } from \"~/multiPartUpload/CompleteMultiPartUploadUseCase\";\nimport { createFileNormalizerFromContext } from \"~/utils/createFileNormalizerFromContext\";\n\nconst plugin: GraphQLSchemaPlugin<FileManagerContext> = {\n type: \"graphql-schema\",\n name: \"graphql-schema-api-file-manager-s3\",\n schema: {\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 try {\n await checkPermissions(context, { rwd: \"w\" });\n\n const data = args.data as PresignedPostPayloadData;\n\n const settings = await context.fileManager.getSettings();\n if (!settings) {\n throw new WebinyError(\n \"Missing File Manager Settings.\",\n \"FILE_MANAGER_SETTINGS_ERROR\",\n { file: data }\n );\n }\n\n const normalizer = createFileNormalizerFromContext(context);\n const presignedPayload = await getPresignedPostPayload(\n await normalizer.normalizeFile(data),\n settings\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 await checkPermissions(context, { rwd: \"w\" });\n\n const files = args.data as PresignedPostPayloadData[];\n\n try {\n const settings = await context.fileManager.getSettings();\n if (!settings) {\n throw new WebinyError(\n \"Missing File Manager Settings.\",\n \"FILE_MANAGER_SETTINGS_ERROR\",\n { files }\n );\n }\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 );\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 await checkPermissions(context, { 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 await checkPermissions(context, { 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\nexport default plugin;\n"],"mappings":"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","ignoreList":[]}
|
package/types.d.ts
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { PresignedPost } from "@webiny/aws-sdk/client-s3";
|
|
2
|
+
export interface PresignedPostPayloadData {
|
|
3
|
+
name: string;
|
|
4
|
+
type: string;
|
|
5
|
+
size: number;
|
|
6
|
+
id?: string;
|
|
7
|
+
key?: string;
|
|
8
|
+
keyPrefix?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface FileData {
|
|
11
|
+
id: string;
|
|
12
|
+
key: string;
|
|
13
|
+
name: string;
|
|
14
|
+
size: number;
|
|
15
|
+
type: string;
|
|
16
|
+
}
|
|
17
|
+
export interface PresignedPostPayloadDataResponse {
|
|
18
|
+
data: PresignedPost;
|
|
19
|
+
file: FileData;
|
|
20
|
+
}
|
package/types.js
CHANGED
package/types.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type { PresignedPost } from \"@webiny/aws-sdk/client-s3\";\n\nexport interface PresignedPostPayloadData {\n name: string;\n type: string;\n size: number;\n id?: string;\n key?: string;\n keyPrefix?: string;\n}\n\nexport interface FileData {\n id: string;\n key: string;\n name: string;\n size: number;\n type: string;\n}\n\nexport interface PresignedPostPayloadDataResponse {\n data: PresignedPost;\n file: FileData;\n}\n"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.FileExtension = void 0;
|
|
7
|
+
var _mimeTypes = require("./mimeTypes");
|
|
8
|
+
class FileExtension {
|
|
9
|
+
constructor(data) {
|
|
10
|
+
this.data = data;
|
|
11
|
+
}
|
|
12
|
+
getValue() {
|
|
13
|
+
const name = (this.data.key || this.data.name).toLowerCase();
|
|
14
|
+
const maybeExt = name.split(".").pop();
|
|
15
|
+
const extensions = _mimeTypes.mimeTypes[this.data.type];
|
|
16
|
+
if (extensions && !extensions.includes(maybeExt)) {
|
|
17
|
+
return extensions[0];
|
|
18
|
+
}
|
|
19
|
+
return "";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
exports.FileExtension = FileExtension;
|
|
23
|
+
|
|
24
|
+
//# sourceMappingURL=FileExtension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_mimeTypes","require","FileExtension","constructor","data","getValue","name","key","toLowerCase","maybeExt","split","pop","extensions","mimeTypes","type","includes","exports"],"sources":["FileExtension.ts"],"sourcesContent":["import { mimeTypes } from \"~/utils/mimeTypes\";\nimport type { PresignedPostPayloadData } from \"~/types\";\n\nexport class FileExtension {\n private data: PresignedPostPayloadData;\n\n constructor(data: PresignedPostPayloadData) {\n this.data = data;\n }\n\n getValue() {\n const name = (this.data.key || this.data.name).toLowerCase();\n\n const maybeExt = name.split(\".\").pop() as string;\n const extensions = mimeTypes[this.data.type];\n if (extensions && !extensions.includes(maybeExt)) {\n return extensions[0];\n }\n\n return \"\";\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAGO,MAAMC,aAAa,CAAC;EAGvBC,WAAWA,CAACC,IAA8B,EAAE;IACxC,IAAI,CAACA,IAAI,GAAGA,IAAI;EACpB;EAEAC,QAAQA,CAAA,EAAG;IACP,MAAMC,IAAI,GAAG,CAAC,IAAI,CAACF,IAAI,CAACG,GAAG,IAAI,IAAI,CAACH,IAAI,CAACE,IAAI,EAAEE,WAAW,CAAC,CAAC;IAE5D,MAAMC,QAAQ,GAAGH,IAAI,CAACI,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAW;IAChD,MAAMC,UAAU,GAAGC,oBAAS,CAAC,IAAI,CAACT,IAAI,CAACU,IAAI,CAAC;IAC5C,IAAIF,UAAU,IAAI,CAACA,UAAU,CAACG,QAAQ,CAACN,QAAQ,CAAC,EAAE;MAC9C,OAAOG,UAAU,CAAC,CAAC,CAAC;IACxB;IAEA,OAAO,EAAE;EACb;AACJ;AAACI,OAAA,CAAAd,aAAA,GAAAA,aAAA","ignoreList":[]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PresignedPostPayloadData } from "../types";
|
|
2
|
+
export declare class FileKey {
|
|
3
|
+
private data;
|
|
4
|
+
private extension;
|
|
5
|
+
private key;
|
|
6
|
+
constructor(data: PresignedPostPayloadData);
|
|
7
|
+
getExtension(): string;
|
|
8
|
+
setKey(key: string): this;
|
|
9
|
+
toString(): string;
|
|
10
|
+
private getSanitizedKey;
|
|
11
|
+
}
|
package/utils/FileKey.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.FileKey = void 0;
|
|
8
|
+
var _sanitizeFilename = _interopRequireDefault(require("sanitize-filename"));
|
|
9
|
+
var _FileExtension = require("./FileExtension");
|
|
10
|
+
class FileKey {
|
|
11
|
+
constructor(data) {
|
|
12
|
+
this.data = data;
|
|
13
|
+
this.extension = new _FileExtension.FileExtension(data);
|
|
14
|
+
this.key = this.getSanitizedKey();
|
|
15
|
+
}
|
|
16
|
+
getExtension() {
|
|
17
|
+
return this.extension.getValue();
|
|
18
|
+
}
|
|
19
|
+
setKey(key) {
|
|
20
|
+
this.key = key;
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
toString() {
|
|
24
|
+
return [this.data.keyPrefix, this.data.id, this.key].filter(Boolean).join("/");
|
|
25
|
+
}
|
|
26
|
+
getSanitizedKey() {
|
|
27
|
+
const key = (0, _sanitizeFilename.default)(this.data.key || this.data.name).replace(/\s/g, "");
|
|
28
|
+
return [key, this.getExtension()].filter(Boolean).join(".");
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.FileKey = FileKey;
|
|
32
|
+
|
|
33
|
+
//# sourceMappingURL=FileKey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_sanitizeFilename","_interopRequireDefault","require","_FileExtension","FileKey","constructor","data","extension","FileExtension","key","getSanitizedKey","getExtension","getValue","setKey","toString","keyPrefix","id","filter","Boolean","join","sanitizeFilename","name","replace","exports"],"sources":["FileKey.ts"],"sourcesContent":["import sanitizeFilename from \"sanitize-filename\";\nimport type { PresignedPostPayloadData } from \"~/types\";\nimport { FileExtension } from \"~/utils/FileExtension\";\n\nexport class FileKey {\n private data: PresignedPostPayloadData;\n private extension: FileExtension;\n private key: string;\n\n constructor(data: PresignedPostPayloadData) {\n this.data = data;\n this.extension = new FileExtension(data);\n this.key = this.getSanitizedKey();\n }\n\n getExtension() {\n return this.extension.getValue();\n }\n\n setKey(key: string) {\n this.key = key;\n return this;\n }\n\n toString() {\n return [this.data.keyPrefix, this.data.id, this.key].filter(Boolean).join(\"/\");\n }\n\n private getSanitizedKey() {\n const key = sanitizeFilename(this.data.key || this.data.name).replace(/\\s/g, \"\");\n\n return [key, this.getExtension()].filter(Boolean).join(\".\");\n }\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,iBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,cAAA,GAAAD,OAAA;AAEO,MAAME,OAAO,CAAC;EAKjBC,WAAWA,CAACC,IAA8B,EAAE;IACxC,IAAI,CAACA,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACC,SAAS,GAAG,IAAIC,4BAAa,CAACF,IAAI,CAAC;IACxC,IAAI,CAACG,GAAG,GAAG,IAAI,CAACC,eAAe,CAAC,CAAC;EACrC;EAEAC,YAAYA,CAAA,EAAG;IACX,OAAO,IAAI,CAACJ,SAAS,CAACK,QAAQ,CAAC,CAAC;EACpC;EAEAC,MAAMA,CAACJ,GAAW,EAAE;IAChB,IAAI,CAACA,GAAG,GAAGA,GAAG;IACd,OAAO,IAAI;EACf;EAEAK,QAAQA,CAAA,EAAG;IACP,OAAO,CAAC,IAAI,CAACR,IAAI,CAACS,SAAS,EAAE,IAAI,CAACT,IAAI,CAACU,EAAE,EAAE,IAAI,CAACP,GAAG,CAAC,CAACQ,MAAM,CAACC,OAAO,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC;EAClF;EAEQT,eAAeA,CAAA,EAAG;IACtB,MAAMD,GAAG,GAAG,IAAAW,yBAAgB,EAAC,IAAI,CAACd,IAAI,CAACG,GAAG,IAAI,IAAI,CAACH,IAAI,CAACe,IAAI,CAAC,CAACC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAEhF,OAAO,CAACb,GAAG,EAAE,IAAI,CAACE,YAAY,CAAC,CAAC,CAAC,CAACM,MAAM,CAACC,OAAO,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC;EAC/D;AACJ;AAACI,OAAA,CAAAnB,OAAA,GAAAA,OAAA","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _FileKey = require("./FileKey");
|
|
4
|
+
describe("FileKey", () => {
|
|
5
|
+
it("should generate a file key (extension is included in the name)", () => {
|
|
6
|
+
const fileKey = new _FileKey.FileKey({
|
|
7
|
+
size: 1071690,
|
|
8
|
+
name: "image-14.jpg",
|
|
9
|
+
type: "image/jpeg"
|
|
10
|
+
});
|
|
11
|
+
expect(fileKey.toString()).toEqual("image-14.jpg");
|
|
12
|
+
});
|
|
13
|
+
it("should generate a file key (extension derived from file type)", () => {
|
|
14
|
+
const fileKey = new _FileKey.FileKey({
|
|
15
|
+
size: 1071690,
|
|
16
|
+
name: "image-14",
|
|
17
|
+
type: "image/jpeg"
|
|
18
|
+
});
|
|
19
|
+
expect(fileKey.toString()).toEqual("image-14.jpeg");
|
|
20
|
+
});
|
|
21
|
+
it("should generate a file key containing id", () => {
|
|
22
|
+
const fileKey = new _FileKey.FileKey({
|
|
23
|
+
size: 1071690,
|
|
24
|
+
name: "image-14.jpeg",
|
|
25
|
+
type: "image/jpeg",
|
|
26
|
+
id: "12345678"
|
|
27
|
+
});
|
|
28
|
+
expect(fileKey.toString()).toEqual("12345678/image-14.jpeg");
|
|
29
|
+
});
|
|
30
|
+
it("should generate a file key containing prefix", () => {
|
|
31
|
+
const fileKey = new _FileKey.FileKey({
|
|
32
|
+
size: 1071690,
|
|
33
|
+
name: "image-14.jpeg",
|
|
34
|
+
type: "image/jpeg",
|
|
35
|
+
keyPrefix: "prefix"
|
|
36
|
+
});
|
|
37
|
+
expect(fileKey.toString()).toEqual("prefix/image-14.jpeg");
|
|
38
|
+
});
|
|
39
|
+
it("should generate a file key containing id and prefix", () => {
|
|
40
|
+
const fileKey = new _FileKey.FileKey({
|
|
41
|
+
size: 1071690,
|
|
42
|
+
name: "image-14.jpeg",
|
|
43
|
+
type: "image/jpeg",
|
|
44
|
+
id: "12345678",
|
|
45
|
+
keyPrefix: "prefix"
|
|
46
|
+
});
|
|
47
|
+
expect(fileKey.toString()).toEqual("prefix/12345678/image-14.jpeg");
|
|
48
|
+
});
|
|
49
|
+
it("should use the key defined in the input", () => {
|
|
50
|
+
const fileKey = new _FileKey.FileKey({
|
|
51
|
+
size: 1071690,
|
|
52
|
+
name: "image",
|
|
53
|
+
type: "image/jpeg",
|
|
54
|
+
key: "image-14.jpg"
|
|
55
|
+
});
|
|
56
|
+
expect(fileKey.toString()).toEqual("image-14.jpg");
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
//# sourceMappingURL=FileKey.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_FileKey","require","describe","it","fileKey","FileKey","size","name","type","expect","toString","toEqual","id","keyPrefix","key"],"sources":["FileKey.test.ts"],"sourcesContent":["import { FileKey } from \"./FileKey\";\n\ndescribe(\"FileKey\", () => {\n it(\"should generate a file key (extension is included in the name)\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image-14.jpg\",\n type: \"image/jpeg\"\n });\n\n expect(fileKey.toString()).toEqual(\"image-14.jpg\");\n });\n\n it(\"should generate a file key (extension derived from file type)\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image-14\",\n type: \"image/jpeg\"\n });\n\n expect(fileKey.toString()).toEqual(\"image-14.jpeg\");\n });\n\n it(\"should generate a file key containing id\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image-14.jpeg\",\n type: \"image/jpeg\",\n id: \"12345678\"\n });\n\n expect(fileKey.toString()).toEqual(\"12345678/image-14.jpeg\");\n });\n\n it(\"should generate a file key containing prefix\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image-14.jpeg\",\n type: \"image/jpeg\",\n keyPrefix: \"prefix\"\n });\n\n expect(fileKey.toString()).toEqual(\"prefix/image-14.jpeg\");\n });\n\n it(\"should generate a file key containing id and prefix\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image-14.jpeg\",\n type: \"image/jpeg\",\n id: \"12345678\",\n keyPrefix: \"prefix\"\n });\n\n expect(fileKey.toString()).toEqual(\"prefix/12345678/image-14.jpeg\");\n });\n\n it(\"should use the key defined in the input\", () => {\n const fileKey = new FileKey({\n size: 1071690,\n name: \"image\",\n type: \"image/jpeg\",\n key: \"image-14.jpg\"\n });\n\n expect(fileKey.toString()).toEqual(\"image-14.jpg\");\n });\n});\n"],"mappings":";;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAEAC,QAAQ,CAAC,SAAS,EAAE,MAAM;EACtBC,EAAE,CAAC,gEAAgE,EAAE,MAAM;IACvE,MAAMC,OAAO,GAAG,IAAIC,gBAAO,CAAC;MACxBC,IAAI,EAAE,OAAO;MACbC,IAAI,EAAE,cAAc;MACpBC,IAAI,EAAE;IACV,CAAC,CAAC;IAEFC,MAAM,CAACL,OAAO,CAACM,QAAQ,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,cAAc,CAAC;EACtD,CAAC,CAAC;EAEFR,EAAE,CAAC,+DAA+D,EAAE,MAAM;IACtE,MAAMC,OAAO,GAAG,IAAIC,gBAAO,CAAC;MACxBC,IAAI,EAAE,OAAO;MACbC,IAAI,EAAE,UAAU;MAChBC,IAAI,EAAE;IACV,CAAC,CAAC;IAEFC,MAAM,CAACL,OAAO,CAACM,QAAQ,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,eAAe,CAAC;EACvD,CAAC,CAAC;EAEFR,EAAE,CAAC,0CAA0C,EAAE,MAAM;IACjD,MAAMC,OAAO,GAAG,IAAIC,gBAAO,CAAC;MACxBC,IAAI,EAAE,OAAO;MACbC,IAAI,EAAE,eAAe;MACrBC,IAAI,EAAE,YAAY;MAClBI,EAAE,EAAE;IACR,CAAC,CAAC;IAEFH,MAAM,CAACL,OAAO,CAACM,QAAQ,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,wBAAwB,CAAC;EAChE,CAAC,CAAC;EAEFR,EAAE,CAAC,8CAA8C,EAAE,MAAM;IACrD,MAAMC,OAAO,GAAG,IAAIC,gBAAO,CAAC;MACxBC,IAAI,EAAE,OAAO;MACbC,IAAI,EAAE,eAAe;MACrBC,IAAI,EAAE,YAAY;MAClBK,SAAS,EAAE;IACf,CAAC,CAAC;IAEFJ,MAAM,CAACL,OAAO,CAACM,QAAQ,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,sBAAsB,CAAC;EAC9D,CAAC,CAAC;EAEFR,EAAE,CAAC,qDAAqD,EAAE,MAAM;IAC5D,MAAMC,OAAO,GAAG,IAAIC,gBAAO,CAAC;MACxBC,IAAI,EAAE,OAAO;MACbC,IAAI,EAAE,eAAe;MACrBC,IAAI,EAAE,YAAY;MAClBI,EAAE,EAAE,UAAU;MACdC,SAAS,EAAE;IACf,CAAC,CAAC;IAEFJ,MAAM,CAACL,OAAO,CAACM,QAAQ,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,+BAA+B,CAAC;EACvE,CAAC,CAAC;EAEFR,EAAE,CAAC,yCAAyC,EAAE,MAAM;IAChD,MAAMC,OAAO,GAAG,IAAIC,gBAAO,CAAC;MACxBC,IAAI,EAAE,OAAO;MACbC,IAAI,EAAE,OAAO;MACbC,IAAI,EAAE,YAAY;MAClBM,GAAG,EAAE;IACT,CAAC,CAAC;IAEFL,MAAM,CAACL,OAAO,CAACM,QAAQ,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,cAAc,CAAC;EACtD,CAAC,CAAC;AACN,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { FileData, PresignedPostPayloadData } from "../types";
|
|
2
|
+
import type { FileModifier } from "./FileUploadModifier";
|
|
3
|
+
export interface FileToSign {
|
|
4
|
+
name: string;
|
|
5
|
+
key: string;
|
|
6
|
+
type: string;
|
|
7
|
+
size: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* FileNormalizer normalizes file data, before it's signed for upload to S3.
|
|
11
|
+
* It generates a unique file id, and makes sure that the file key includes the unique id.
|
|
12
|
+
*
|
|
13
|
+
*/
|
|
14
|
+
export declare class FileNormalizer {
|
|
15
|
+
private readonly modifier;
|
|
16
|
+
constructor(modifier?: FileModifier);
|
|
17
|
+
normalizeFile(payload: PresignedPostPayloadData): Promise<FileData>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.FileNormalizer = void 0;
|
|
7
|
+
var _utils = require("@webiny/utils");
|
|
8
|
+
var _FileKey = require("./FileKey");
|
|
9
|
+
/**
|
|
10
|
+
* FileNormalizer normalizes file data, before it's signed for upload to S3.
|
|
11
|
+
* It generates a unique file id, and makes sure that the file key includes the unique id.
|
|
12
|
+
*
|
|
13
|
+
*/
|
|
14
|
+
class FileNormalizer {
|
|
15
|
+
constructor(modifier) {
|
|
16
|
+
this.modifier = modifier;
|
|
17
|
+
}
|
|
18
|
+
async normalizeFile(payload) {
|
|
19
|
+
const data = {
|
|
20
|
+
...payload,
|
|
21
|
+
id: payload.id || (0, _utils.mdbid)(),
|
|
22
|
+
type: payload.type || "application/octet-stream"
|
|
23
|
+
};
|
|
24
|
+
const key = new _FileKey.FileKey(data);
|
|
25
|
+
const defaultKey = key.toString();
|
|
26
|
+
const file = {
|
|
27
|
+
name: data.name,
|
|
28
|
+
type: data.type,
|
|
29
|
+
key: defaultKey,
|
|
30
|
+
size: data.size
|
|
31
|
+
};
|
|
32
|
+
if (this.modifier) {
|
|
33
|
+
Object.assign(file, await this.modifier(file));
|
|
34
|
+
}
|
|
35
|
+
if (defaultKey !== file.key) {
|
|
36
|
+
key.setKey(file.key);
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
id: data.id,
|
|
40
|
+
key: key.toString(),
|
|
41
|
+
name: file.name,
|
|
42
|
+
size: file.size,
|
|
43
|
+
type: file.type
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
exports.FileNormalizer = FileNormalizer;
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=FileNormalizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_utils","require","_FileKey","FileNormalizer","constructor","modifier","normalizeFile","payload","data","id","mdbid","type","key","FileKey","defaultKey","toString","file","name","size","Object","assign","setKey","exports"],"sources":["FileNormalizer.ts"],"sourcesContent":["import { mdbid } from \"@webiny/utils\";\nimport type { FileData, PresignedPostPayloadData } from \"~/types\";\nimport { FileKey } from \"~/utils/FileKey\";\nimport type { FileModifier } from \"./FileUploadModifier\";\n\nexport interface FileToSign {\n name: string;\n key: string;\n type: string;\n size: number;\n}\n\n/**\n * FileNormalizer normalizes file data, before it's signed for upload to S3.\n * It generates a unique file id, and makes sure that the file key includes the unique id.\n *\n */\nexport class FileNormalizer {\n private readonly modifier: FileModifier | undefined;\n\n constructor(modifier?: FileModifier) {\n this.modifier = modifier;\n }\n\n async normalizeFile(payload: PresignedPostPayloadData): Promise<FileData> {\n const data = {\n ...payload,\n id: payload.id || mdbid(),\n type: payload.type || \"application/octet-stream\"\n };\n\n const key = new FileKey(data);\n const defaultKey = key.toString();\n\n const file: FileToSign = {\n name: data.name,\n type: data.type,\n key: defaultKey,\n size: data.size\n };\n\n if (this.modifier) {\n Object.assign(file, await this.modifier(file));\n }\n\n if (defaultKey !== file.key) {\n key.setKey(file.key);\n }\n\n return {\n id: data.id,\n key: key.toString(),\n name: file.name,\n size: file.size,\n type: file.type\n };\n }\n}\n"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEA,IAAAC,QAAA,GAAAD,OAAA;AAUA;AACA;AACA;AACA;AACA;AACO,MAAME,cAAc,CAAC;EAGxBC,WAAWA,CAACC,QAAuB,EAAE;IACjC,IAAI,CAACA,QAAQ,GAAGA,QAAQ;EAC5B;EAEA,MAAMC,aAAaA,CAACC,OAAiC,EAAqB;IACtE,MAAMC,IAAI,GAAG;MACT,GAAGD,OAAO;MACVE,EAAE,EAAEF,OAAO,CAACE,EAAE,IAAI,IAAAC,YAAK,EAAC,CAAC;MACzBC,IAAI,EAAEJ,OAAO,CAACI,IAAI,IAAI;IAC1B,CAAC;IAED,MAAMC,GAAG,GAAG,IAAIC,gBAAO,CAACL,IAAI,CAAC;IAC7B,MAAMM,UAAU,GAAGF,GAAG,CAACG,QAAQ,CAAC,CAAC;IAEjC,MAAMC,IAAgB,GAAG;MACrBC,IAAI,EAAET,IAAI,CAACS,IAAI;MACfN,IAAI,EAAEH,IAAI,CAACG,IAAI;MACfC,GAAG,EAAEE,UAAU;MACfI,IAAI,EAAEV,IAAI,CAACU;IACf,CAAC;IAED,IAAI,IAAI,CAACb,QAAQ,EAAE;MACfc,MAAM,CAACC,MAAM,CAACJ,IAAI,EAAE,MAAM,IAAI,CAACX,QAAQ,CAACW,IAAI,CAAC,CAAC;IAClD;IAEA,IAAIF,UAAU,KAAKE,IAAI,CAACJ,GAAG,EAAE;MACzBA,GAAG,CAACS,MAAM,CAACL,IAAI,CAACJ,GAAG,CAAC;IACxB;IAEA,OAAO;MACHH,EAAE,EAAED,IAAI,CAACC,EAAE;MACXG,GAAG,EAAEA,GAAG,CAACG,QAAQ,CAAC,CAAC;MACnBE,IAAI,EAAED,IAAI,CAACC,IAAI;MACfC,IAAI,EAAEF,IAAI,CAACE,IAAI;MACfP,IAAI,EAAEK,IAAI,CAACL;IACf,CAAC;EACL;AACJ;AAACW,OAAA,CAAAnB,cAAA,GAAAA,cAAA","ignoreList":[]}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { Plugin } from "@webiny/plugins";
|
|
2
|
+
import type { FileToSign } from "./FileNormalizer";
|
|
3
|
+
interface Setter<T> {
|
|
4
|
+
(param: T): T;
|
|
5
|
+
}
|
|
6
|
+
declare class FileUploadModifier {
|
|
7
|
+
private fileSetters;
|
|
8
|
+
setFile(setter: Setter<FileToSign>): void;
|
|
9
|
+
execute(file: FileToSign): Promise<FileToSign>;
|
|
10
|
+
}
|
|
11
|
+
interface FileUploadModifierCallbackParams {
|
|
12
|
+
modifier: {
|
|
13
|
+
setFile: FileUploadModifier["setFile"];
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export declare class FileUploadModifierPlugin extends Plugin {
|
|
17
|
+
static type: string;
|
|
18
|
+
private readonly cb;
|
|
19
|
+
constructor(cb: FileUploadModifierCallable);
|
|
20
|
+
execute(params: FileUploadModifierCallbackParams): void;
|
|
21
|
+
}
|
|
22
|
+
interface FileUploadModifierCallable {
|
|
23
|
+
(params: FileUploadModifierCallbackParams): void;
|
|
24
|
+
}
|
|
25
|
+
export declare const createFileUploadModifier: (cb: FileUploadModifierCallable) => FileUploadModifierPlugin;
|
|
26
|
+
export interface FileModifier {
|
|
27
|
+
(file: FileToSign): Promise<Partial<FileToSign>> | Partial<FileToSign>;
|
|
28
|
+
}
|
|
29
|
+
export declare const createModifierFromPlugins: (plugins?: FileUploadModifierPlugin[]) => FileModifier;
|
|
30
|
+
export {};
|