@webiny/api-file-manager-s3 0.0.0-unstable.97a151f74d → 0.0.0-unstable.98511f29f1
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/index.d.ts +2 -1
- package/index.js +7 -5
- package/index.js.map +1 -1
- package/multiPartUpload/CompleteMultiPartUploadUseCase.d.ts +13 -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 +21 -15
- package/plugins/checkPermissions.d.ts +4 -0
- package/plugins/checkPermissions.js +42 -0
- package/plugins/checkPermissions.js.map +1 -0
- package/plugins/fileStorageS3.d.ts +2 -5
- package/plugins/fileStorageS3.js +41 -49
- package/plugins/fileStorageS3.js.map +1 -1
- package/plugins/graphqlFileStorageS3.js +126 -65
- package/plugins/graphqlFileStorageS3.js.map +1 -1
- package/types.d.ts +11 -7
- package/types.js.map +1 -1
- package/utils/FileExtension.d.ts +6 -0
- package/utils/FileExtension.js +28 -0
- package/utils/FileExtension.js.map +1 -0
- package/utils/FileKey.d.ts +11 -0
- package/utils/FileKey.js +35 -0
- package/utils/FileKey.js.map +1 -0
- package/utils/FileNormalizer.d.ts +18 -0
- package/utils/FileNormalizer.js +50 -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 +13 -0
- package/utils/createFileNormalizerFromContext.js.map +1 -0
- package/utils/getPresignedPostPayload.d.ts +2 -3
- package/utils/getPresignedPostPayload.js +7 -50
- package/utils/getPresignedPostPayload.js.map +1 -1
- package/utils/mimeTypes.d.ts +5 -0
- package/utils/mimeTypes.js +20 -0
- package/utils/mimeTypes.js.map +1 -0
- package/utils/uploadFileToS3.js +6 -11
- package/utils/uploadFileToS3.js.map +1 -1
package/index.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
declare const _default: () => (import("@webiny/handler-graphql/types").GraphQLSchemaPlugin<import("@webiny/api-file-manager/types").FileManagerContext> | import("@webiny/api
|
|
1
|
+
declare const _default: () => (import("@webiny/handler-graphql/types").GraphQLSchemaPlugin<import("@webiny/api-file-manager/types").FileManagerContext> | import("@webiny/api").ContextPlugin<import("@webiny/api/types").Context>)[];
|
|
2
2
|
export default _default;
|
|
3
|
+
export { createFileUploadModifier } from "./utils/FileUploadModifier";
|
package/index.js
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
7
|
+
Object.defineProperty(exports, "createFileUploadModifier", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function () {
|
|
10
|
+
return _FileUploadModifier.createFileUploadModifier;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
8
13
|
exports.default = void 0;
|
|
9
|
-
|
|
10
14
|
var _graphqlFileStorageS = _interopRequireDefault(require("./plugins/graphqlFileStorageS3"));
|
|
11
|
-
|
|
12
15
|
var _fileStorageS = _interopRequireDefault(require("./plugins/fileStorageS3"));
|
|
13
|
-
|
|
16
|
+
var _FileUploadModifier = require("./utils/FileUploadModifier");
|
|
14
17
|
var _default = () => [(0, _fileStorageS.default)(), _graphqlFileStorageS.default];
|
|
15
|
-
|
|
16
18
|
exports.default = _default;
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["fileStorageS3","graphqlFileStorageS3"],"sources":["index.ts"],"sourcesContent":["import graphqlFileStorageS3 from \"./plugins/graphqlFileStorageS3\";\nimport fileStorageS3 from \"./plugins/fileStorageS3\";\n\nexport default () => [fileStorageS3(), graphqlFileStorageS3];\n"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_graphqlFileStorageS","_interopRequireDefault","require","_fileStorageS","_FileUploadModifier","_default","fileStorageS3","graphqlFileStorageS3","exports","default"],"sources":["index.ts"],"sourcesContent":["import graphqlFileStorageS3 from \"./plugins/graphqlFileStorageS3\";\nimport fileStorageS3 from \"./plugins/fileStorageS3\";\n\nexport default () => [fileStorageS3(), graphqlFileStorageS3];\n\nexport { createFileUploadModifier } from \"./utils/FileUploadModifier\";\n"],"mappings":";;;;;;;;;;;;;AAAA,IAAAA,oBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,aAAA,GAAAF,sBAAA,CAAAC,OAAA;AAIA,IAAAE,mBAAA,GAAAF,OAAA;AAAsE,IAAAG,QAAA,GAFvDA,CAAA,KAAM,CAAC,IAAAC,qBAAa,EAAC,CAAC,EAAEC,4BAAoB,CAAC;AAAAC,OAAA,CAAAC,OAAA,GAAAJ,QAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import S3 from "aws-sdk/clients/s3";
|
|
2
|
+
interface CompleteMultiPartUploadParams {
|
|
3
|
+
fileKey: string;
|
|
4
|
+
uploadId: string;
|
|
5
|
+
}
|
|
6
|
+
export declare class CompleteMultiPartUploadUseCase {
|
|
7
|
+
private readonly s3;
|
|
8
|
+
private readonly bucket;
|
|
9
|
+
constructor(bucket: string, s3Client: S3);
|
|
10
|
+
execute(params: CompleteMultiPartUploadParams): Promise<void>;
|
|
11
|
+
private getAllUploadParts;
|
|
12
|
+
}
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.CompleteMultiPartUploadUseCase = void 0;
|
|
8
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
9
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
|
+
class CompleteMultiPartUploadUseCase {
|
|
11
|
+
constructor(bucket, s3Client) {
|
|
12
|
+
(0, _defineProperty2.default)(this, "s3", void 0);
|
|
13
|
+
(0, _defineProperty2.default)(this, "bucket", void 0);
|
|
14
|
+
this.bucket = bucket;
|
|
15
|
+
this.s3 = s3Client;
|
|
16
|
+
}
|
|
17
|
+
async execute(params) {
|
|
18
|
+
const uploadParams = {
|
|
19
|
+
Bucket: this.bucket,
|
|
20
|
+
Key: params.fileKey,
|
|
21
|
+
UploadId: params.uploadId
|
|
22
|
+
};
|
|
23
|
+
const allParts = await this.getAllUploadParts(uploadParams);
|
|
24
|
+
const s3Params = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, uploadParams), {}, {
|
|
25
|
+
MultipartUpload: {
|
|
26
|
+
Parts: allParts
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
return new Promise((resolve, reject) => {
|
|
30
|
+
this.s3.completeMultipartUpload(s3Params, (err, data) => {
|
|
31
|
+
if (err) {
|
|
32
|
+
console.error(err);
|
|
33
|
+
reject(err);
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
console.log(data);
|
|
37
|
+
resolve();
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
async getAllUploadParts(params) {
|
|
42
|
+
const parts = [];
|
|
43
|
+
let marker = undefined;
|
|
44
|
+
while (true) {
|
|
45
|
+
const {
|
|
46
|
+
Parts,
|
|
47
|
+
PartNumberMarker
|
|
48
|
+
} = await this.s3.listParts((0, _objectSpread2.default)((0, _objectSpread2.default)({}, params), {}, {
|
|
49
|
+
PartNumberMarker: marker
|
|
50
|
+
})).promise();
|
|
51
|
+
if (Parts) {
|
|
52
|
+
Parts.forEach(part => parts.push(part));
|
|
53
|
+
}
|
|
54
|
+
marker = PartNumberMarker || undefined;
|
|
55
|
+
if (!marker) {
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return parts.map(part => ({
|
|
60
|
+
ETag: part.ETag,
|
|
61
|
+
PartNumber: part.PartNumber
|
|
62
|
+
}));
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
exports.CompleteMultiPartUploadUseCase = CompleteMultiPartUploadUseCase;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["CompleteMultiPartUploadUseCase","constructor","bucket","s3Client","_defineProperty2","default","s3","execute","params","uploadParams","Bucket","Key","fileKey","UploadId","uploadId","allParts","getAllUploadParts","s3Params","_objectSpread2","MultipartUpload","Parts","Promise","resolve","reject","completeMultipartUpload","err","data","console","error","log","parts","marker","undefined","PartNumberMarker","listParts","promise","forEach","part","push","map","ETag","PartNumber","exports"],"sources":["CompleteMultiPartUploadUseCase.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\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\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 return new Promise<void>((resolve, reject) => {\n this.s3.completeMultipartUpload(s3Params, (err, data) => {\n if (err) {\n console.error(err);\n reject(err);\n return;\n }\n\n console.log(data);\n resolve();\n });\n });\n }\n\n private async getAllUploadParts(params: GetAllUploadPartsParams) {\n const parts: S3.Parts = [];\n\n let marker: number | undefined = undefined;\n while (true) {\n const { Parts, PartNumberMarker }: S3.ListPartsOutput = await this.s3\n .listParts({\n ...params,\n PartNumberMarker: marker\n })\n .promise();\n\n if (Parts) {\n Parts.forEach(part => parts.push(part));\n }\n\n marker = PartNumberMarker || undefined;\n if (!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"],"mappings":";;;;;;;;;AAaO,MAAMA,8BAA8B,CAAC;EAIxCC,WAAWA,CAACC,MAAc,EAAEC,QAAY,EAAE;IAAA,IAAAC,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA;IACtC,IAAI,CAACH,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACI,EAAE,GAAGH,QAAQ;EACtB;EAEA,MAAMI,OAAOA,CAACC,MAAqC,EAAE;IACjD,MAAMC,YAAY,GAAG;MACjBC,MAAM,EAAE,IAAI,CAACR,MAAM;MACnBS,GAAG,EAAEH,MAAM,CAACI,OAAO;MACnBC,QAAQ,EAAEL,MAAM,CAACM;IACrB,CAAC;IAED,MAAMC,QAAQ,GAAG,MAAM,IAAI,CAACC,iBAAiB,CAACP,YAAY,CAAC;IAE3D,MAAMQ,QAAQ,OAAAC,cAAA,CAAAb,OAAA,MAAAa,cAAA,CAAAb,OAAA,MACPI,YAAY;MACfU,eAAe,EAAE;QACbC,KAAK,EAAEL;MACX;IAAC,EACJ;IAED,OAAO,IAAIM,OAAO,CAAO,CAACC,OAAO,EAAEC,MAAM,KAAK;MAC1C,IAAI,CAACjB,EAAE,CAACkB,uBAAuB,CAACP,QAAQ,EAAE,CAACQ,GAAG,EAAEC,IAAI,KAAK;QACrD,IAAID,GAAG,EAAE;UACLE,OAAO,CAACC,KAAK,CAACH,GAAG,CAAC;UAClBF,MAAM,CAACE,GAAG,CAAC;UACX;QACJ;QAEAE,OAAO,CAACE,GAAG,CAACH,IAAI,CAAC;QACjBJ,OAAO,CAAC,CAAC;MACb,CAAC,CAAC;IACN,CAAC,CAAC;EACN;EAEA,MAAcN,iBAAiBA,CAACR,MAA+B,EAAE;IAC7D,MAAMsB,KAAe,GAAG,EAAE;IAE1B,IAAIC,MAA0B,GAAGC,SAAS;IAC1C,OAAO,IAAI,EAAE;MACT,MAAM;QAAEZ,KAAK;QAAEa;MAAqC,CAAC,GAAG,MAAM,IAAI,CAAC3B,EAAE,CAChE4B,SAAS,KAAAhB,cAAA,CAAAb,OAAA,MAAAa,cAAA,CAAAb,OAAA,MACHG,MAAM;QACTyB,gBAAgB,EAAEF;MAAM,EAC3B,CAAC,CACDI,OAAO,CAAC,CAAC;MAEd,IAAIf,KAAK,EAAE;QACPA,KAAK,CAACgB,OAAO,CAACC,IAAI,IAAIP,KAAK,CAACQ,IAAI,CAACD,IAAI,CAAC,CAAC;MAC3C;MAEAN,MAAM,GAAGE,gBAAgB,IAAID,SAAS;MACtC,IAAI,CAACD,MAAM,EAAE;QACT;MACJ;IACJ;IAEA,OAAOD,KAAK,CAACS,GAAG,CAACF,IAAI,KAAK;MACtBG,IAAI,EAAEH,IAAI,CAACG,IAAc;MACzBC,UAAU,EAAEJ,IAAI,CAACI;IACrB,CAAC,CAAC,CAAC;EACP;AACJ;AAACC,OAAA,CAAA1C,8BAAA,GAAAA,8BAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import S3 from "aws-sdk/clients/s3";
|
|
2
|
+
import { FileData } from "../types";
|
|
3
|
+
interface CreateMultiPartUploadParams {
|
|
4
|
+
file: FileData;
|
|
5
|
+
numberOfParts: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class CreateMultiPartUploadUseCase {
|
|
8
|
+
private readonly s3;
|
|
9
|
+
private readonly bucket;
|
|
10
|
+
constructor(bucket: string, s3Client: S3);
|
|
11
|
+
execute({ file, numberOfParts }: CreateMultiPartUploadParams): Promise<{
|
|
12
|
+
file: FileData;
|
|
13
|
+
uploadId: string | undefined;
|
|
14
|
+
parts: {
|
|
15
|
+
url: string;
|
|
16
|
+
partNumber: number;
|
|
17
|
+
}[];
|
|
18
|
+
}>;
|
|
19
|
+
}
|
|
20
|
+
export {};
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.CreateMultiPartUploadUseCase = void 0;
|
|
8
|
+
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
|
|
9
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
10
|
+
class CreateMultiPartUploadUseCase {
|
|
11
|
+
constructor(bucket, s3Client) {
|
|
12
|
+
(0, _defineProperty2.default)(this, "s3", void 0);
|
|
13
|
+
(0, _defineProperty2.default)(this, "bucket", void 0);
|
|
14
|
+
this.bucket = bucket;
|
|
15
|
+
this.s3 = s3Client;
|
|
16
|
+
}
|
|
17
|
+
async execute({
|
|
18
|
+
file,
|
|
19
|
+
numberOfParts
|
|
20
|
+
}) {
|
|
21
|
+
const s3Params = {
|
|
22
|
+
Bucket: this.bucket,
|
|
23
|
+
Key: file.key
|
|
24
|
+
};
|
|
25
|
+
const {
|
|
26
|
+
UploadId
|
|
27
|
+
} = await this.s3.createMultipartUpload(s3Params).promise();
|
|
28
|
+
const parts = await Promise.all(Array.from({
|
|
29
|
+
length: numberOfParts
|
|
30
|
+
}).map((_, index) => {
|
|
31
|
+
return this.s3.getSignedUrlPromise("uploadPart", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, s3Params), {}, {
|
|
32
|
+
UploadId,
|
|
33
|
+
PartNumber: index + 1,
|
|
34
|
+
// URL expires after 24 hours.
|
|
35
|
+
Expires: 86400
|
|
36
|
+
})).then(url => ({
|
|
37
|
+
url,
|
|
38
|
+
partNumber: index + 1
|
|
39
|
+
}));
|
|
40
|
+
}));
|
|
41
|
+
return {
|
|
42
|
+
file,
|
|
43
|
+
uploadId: UploadId,
|
|
44
|
+
parts
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.CreateMultiPartUploadUseCase = CreateMultiPartUploadUseCase;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["CreateMultiPartUploadUseCase","constructor","bucket","s3Client","_defineProperty2","default","s3","execute","file","numberOfParts","s3Params","Bucket","Key","key","UploadId","createMultipartUpload","promise","parts","Promise","all","Array","from","length","map","_","index","getSignedUrlPromise","_objectSpread2","PartNumber","Expires","then","url","partNumber","uploadId","exports"],"sources":["CreateMultiPartUploadUseCase.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\nimport { FileData } from \"~/types\";\n\ninterface CreateMultiPartUploadParams {\n file: FileData;\n numberOfParts: number;\n}\n\nexport class CreateMultiPartUploadUseCase {\n private readonly s3: S3;\n private readonly bucket: string;\n\n constructor(bucket: string, s3Client: S3) {\n this.bucket = bucket;\n this.s3 = s3Client;\n }\n\n async execute({ file, numberOfParts }: CreateMultiPartUploadParams) {\n const s3Params = { Bucket: this.bucket, Key: file.key };\n\n const { UploadId } = await this.s3.createMultipartUpload(s3Params).promise();\n\n const parts = await Promise.all(\n Array.from({ length: numberOfParts }).map((_, index) => {\n return this.s3\n .getSignedUrlPromise(\"uploadPart\", {\n ...s3Params,\n UploadId,\n PartNumber: index + 1,\n // URL expires after 24 hours.\n Expires: 86400\n })\n .then(url => ({\n url,\n partNumber: index + 1\n }));\n })\n );\n\n return {\n file,\n uploadId: UploadId,\n parts\n };\n }\n}\n"],"mappings":";;;;;;;;;AAQO,MAAMA,4BAA4B,CAAC;EAItCC,WAAWA,CAACC,MAAc,EAAEC,QAAY,EAAE;IAAA,IAAAC,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA;IACtC,IAAI,CAACH,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACI,EAAE,GAAGH,QAAQ;EACtB;EAEA,MAAMI,OAAOA,CAAC;IAAEC,IAAI;IAAEC;EAA2C,CAAC,EAAE;IAChE,MAAMC,QAAQ,GAAG;MAAEC,MAAM,EAAE,IAAI,CAACT,MAAM;MAAEU,GAAG,EAAEJ,IAAI,CAACK;IAAI,CAAC;IAEvD,MAAM;MAAEC;IAAS,CAAC,GAAG,MAAM,IAAI,CAACR,EAAE,CAACS,qBAAqB,CAACL,QAAQ,CAAC,CAACM,OAAO,CAAC,CAAC;IAE5E,MAAMC,KAAK,GAAG,MAAMC,OAAO,CAACC,GAAG,CAC3BC,KAAK,CAACC,IAAI,CAAC;MAAEC,MAAM,EAAEb;IAAc,CAAC,CAAC,CAACc,GAAG,CAAC,CAACC,CAAC,EAAEC,KAAK,KAAK;MACpD,OAAO,IAAI,CAACnB,EAAE,CACToB,mBAAmB,CAAC,YAAY,MAAAC,cAAA,CAAAtB,OAAA,MAAAsB,cAAA,CAAAtB,OAAA,MAC1BK,QAAQ;QACXI,QAAQ;QACRc,UAAU,EAAEH,KAAK,GAAG,CAAC;QACrB;QACAI,OAAO,EAAE;MAAK,EACjB,CAAC,CACDC,IAAI,CAACC,GAAG,KAAK;QACVA,GAAG;QACHC,UAAU,EAAEP,KAAK,GAAG;MACxB,CAAC,CAAC,CAAC;IACX,CAAC,CACL,CAAC;IAED,OAAO;MACHjB,IAAI;MACJyB,QAAQ,EAAEnB,QAAQ;MAClBG;IACJ,CAAC;EACL;AACJ;AAACiB,OAAA,CAAAlC,4BAAA,GAAAA,4BAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/api-file-manager-s3",
|
|
3
|
-
"version": "0.0.0-unstable.
|
|
3
|
+
"version": "0.0.0-unstable.98511f29f1",
|
|
4
4
|
"main": "index.js",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -10,22 +10,28 @@
|
|
|
10
10
|
"author": "Webiny Ltd",
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@webiny/api
|
|
14
|
-
"@webiny/
|
|
15
|
-
"@webiny/
|
|
16
|
-
"@webiny/
|
|
13
|
+
"@webiny/api": "0.0.0-unstable.98511f29f1",
|
|
14
|
+
"@webiny/api-file-manager": "0.0.0-unstable.98511f29f1",
|
|
15
|
+
"@webiny/api-security": "0.0.0-unstable.98511f29f1",
|
|
16
|
+
"@webiny/error": "0.0.0-unstable.98511f29f1",
|
|
17
|
+
"@webiny/handler-graphql": "0.0.0-unstable.98511f29f1",
|
|
18
|
+
"@webiny/plugins": "0.0.0-unstable.98511f29f1",
|
|
19
|
+
"@webiny/utils": "0.0.0-unstable.98511f29f1",
|
|
20
|
+
"@webiny/validation": "0.0.0-unstable.98511f29f1",
|
|
17
21
|
"form-data": "4.0.0",
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
22
|
+
"mime": "3.0.0",
|
|
23
|
+
"node-fetch": "2.6.9",
|
|
24
|
+
"p-map": "4.0.0",
|
|
25
|
+
"p-reduce": "2.1.0",
|
|
26
|
+
"sanitize-filename": "1.6.3"
|
|
21
27
|
},
|
|
22
28
|
"devDependencies": {
|
|
23
|
-
"@babel/cli": "
|
|
24
|
-
"@babel/core": "
|
|
25
|
-
"@types/node-fetch": "
|
|
26
|
-
"@webiny/cli": "
|
|
27
|
-
"@webiny/project-utils": "
|
|
28
|
-
"rimraf": "
|
|
29
|
+
"@babel/cli": "7.22.6",
|
|
30
|
+
"@babel/core": "7.22.8",
|
|
31
|
+
"@types/node-fetch": "2.6.2",
|
|
32
|
+
"@webiny/cli": "0.0.0-unstable.98511f29f1",
|
|
33
|
+
"@webiny/project-utils": "0.0.0-unstable.98511f29f1",
|
|
34
|
+
"rimraf": "3.0.2",
|
|
29
35
|
"typescript": "4.7.4"
|
|
30
36
|
},
|
|
31
37
|
"publishConfig": {
|
|
@@ -36,5 +42,5 @@
|
|
|
36
42
|
"build": "yarn webiny run build",
|
|
37
43
|
"watch": "yarn webiny run watch"
|
|
38
44
|
},
|
|
39
|
-
"gitHead": "
|
|
45
|
+
"gitHead": "98511f29f1e1fc7d03ed0d1379d0a0aeff6dae84"
|
|
40
46
|
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.checkPermissions = void 0;
|
|
7
|
+
var _apiSecurity = require("@webiny/api-security");
|
|
8
|
+
const checkPermissions = async (context, check = {}) => {
|
|
9
|
+
const filePermissions = await context.security.getPermissions("fm.file");
|
|
10
|
+
const relevantFilePermissions = filePermissions.filter(current => {
|
|
11
|
+
if (check.rwd && !hasRwd(current, check.rwd)) {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
return true;
|
|
15
|
+
});
|
|
16
|
+
if (relevantFilePermissions.length === 0) {
|
|
17
|
+
throw new _apiSecurity.NotAuthorizedError();
|
|
18
|
+
}
|
|
19
|
+
return relevantFilePermissions;
|
|
20
|
+
};
|
|
21
|
+
exports.checkPermissions = checkPermissions;
|
|
22
|
+
const hasRwd = (filesFilePermissions, rwd) => {
|
|
23
|
+
if (!Array.isArray(filesFilePermissions)) {
|
|
24
|
+
filesFilePermissions = [filesFilePermissions];
|
|
25
|
+
}
|
|
26
|
+
if (!rwd) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Is there a permission that doesn't restrict RWD permissions, that means all RWD permissions are allowed.
|
|
31
|
+
const permissionWithoutRwdRestrictions = filesFilePermissions.some(permission => {
|
|
32
|
+
return typeof permission.rwd !== "string";
|
|
33
|
+
});
|
|
34
|
+
if (permissionWithoutRwdRestrictions) {
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// If there is no permission that doesn't restrict RWD permissions, that means we need to check if the RWD.
|
|
39
|
+
return filesFilePermissions.some(permission => {
|
|
40
|
+
return permission.rwd && permission.rwd.includes(rwd);
|
|
41
|
+
});
|
|
42
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_apiSecurity","require","checkPermissions","context","check","filePermissions","security","getPermissions","relevantFilePermissions","filter","current","rwd","hasRwd","length","NotAuthorizedError","exports","filesFilePermissions","Array","isArray","permissionWithoutRwdRestrictions","some","permission","includes"],"sources":["checkPermissions.ts"],"sourcesContent":["import { FileManagerContext, FilePermission } from \"@webiny/api-file-manager/types\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\n\nexport const checkPermissions = async (\n context: FileManagerContext,\n check: { rwd?: string } = {}\n) => {\n const filePermissions = await context.security.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"],"mappings":";;;;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AAEO,MAAMC,gBAAgB,GAAG,MAAAA,CAC5BC,OAA2B,EAC3BC,KAAuB,GAAG,CAAC,CAAC,KAC3B;EACD,MAAMC,eAAe,GAAG,MAAMF,OAAO,CAACG,QAAQ,CAACC,cAAc,CAAiB,SAAS,CAAC;EAExF,MAAMC,uBAAuB,GAAGH,eAAe,CAACI,MAAM,CAACC,OAAO,IAAI;IAC9D,IAAIN,KAAK,CAACO,GAAG,IAAI,CAACC,MAAM,CAACF,OAAO,EAAEN,KAAK,CAACO,GAAG,CAAC,EAAE;MAC1C,OAAO,KAAK;IAChB;IAEA,OAAO,IAAI;EACf,CAAC,CAAC;EAEF,IAAIH,uBAAuB,CAACK,MAAM,KAAK,CAAC,EAAE;IACtC,MAAM,IAAIC,+BAAkB,CAAC,CAAC;EAClC;EAEA,OAAON,uBAAuB;AAClC,CAAC;AAACO,OAAA,CAAAb,gBAAA,GAAAA,gBAAA;AAEF,MAAMU,MAAM,GAAGA,CAACI,oBAAuD,EAAEL,GAAW,KAAc;EAC9F,IAAI,CAACM,KAAK,CAACC,OAAO,CAACF,oBAAoB,CAAC,EAAE;IACtCA,oBAAoB,GAAG,CAACA,oBAAoB,CAAC;EACjD;EAEA,IAAI,CAACL,GAAG,EAAE;IACN,OAAO,IAAI;EACf;;EAEA;EACA,MAAMQ,gCAAgC,GAAGH,oBAAoB,CAACI,IAAI,CAACC,UAAU,IAAI;IAC7E,OAAO,OAAOA,UAAU,CAACV,GAAG,KAAK,QAAQ;EAC7C,CAAC,CAAC;EAEF,IAAIQ,gCAAgC,EAAE;IAClC,OAAO,IAAI;EACf;;EAEA;EACA,OAAOH,oBAAoB,CAACI,IAAI,CAACC,UAAU,IAAI;IAC3C,OAAOA,UAAU,CAACV,GAAG,IAAIU,UAAU,CAACV,GAAG,CAACW,QAAQ,CAACX,GAAG,CAAC;EACzD,CAAC,CAAC;AACN,CAAC"}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export interface S3FilePhysicalStoragePluginUploadParams extends FilePhysicalStoragePluginUploadParams, PresignedPostPayloadData {
|
|
4
|
-
}
|
|
5
|
-
declare const _default: () => FilePhysicalStoragePlugin;
|
|
1
|
+
import { ContextPlugin } from "@webiny/api";
|
|
2
|
+
declare const _default: () => ContextPlugin<import("@webiny/api/types").Context>;
|
|
6
3
|
export default _default;
|
package/plugins/fileStorageS3.js
CHANGED
|
@@ -1,68 +1,60 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
-
|
|
5
4
|
Object.defineProperty(exports, "__esModule", {
|
|
6
5
|
value: true
|
|
7
6
|
});
|
|
8
7
|
exports.default = void 0;
|
|
9
|
-
|
|
10
8
|
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
11
|
-
|
|
12
9
|
var _s = _interopRequireDefault(require("aws-sdk/clients/s3"));
|
|
13
|
-
|
|
14
|
-
var _getPresignedPostPayload =
|
|
15
|
-
|
|
10
|
+
var _FilePhysicalStoragePlugin = require("@webiny/api-file-manager/plugins/FilePhysicalStoragePlugin");
|
|
11
|
+
var _getPresignedPostPayload = require("../utils/getPresignedPostPayload");
|
|
16
12
|
var _uploadFileToS = _interopRequireDefault(require("../utils/uploadFileToS3"));
|
|
17
|
-
|
|
18
|
-
var
|
|
19
|
-
|
|
13
|
+
var _api = require("@webiny/api");
|
|
14
|
+
var _createFileNormalizerFromContext = require("../utils/createFileNormalizerFromContext");
|
|
20
15
|
const _excluded = ["settings", "buffer"];
|
|
21
16
|
const S3_BUCKET = process.env.S3_BUCKET;
|
|
22
|
-
|
|
23
17
|
var _default = () => {
|
|
24
18
|
/**
|
|
25
|
-
* We need to
|
|
26
|
-
* Otherwise the getPresignedPostPayload
|
|
19
|
+
* We need to extend the type for FilePhysicalStoragePlugin.
|
|
20
|
+
* Otherwise, the `getPresignedPostPayload` doesn't know it has all required values in params.
|
|
27
21
|
*/
|
|
28
|
-
return new
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
22
|
+
return new _api.ContextPlugin(context => {
|
|
23
|
+
context.plugins.register(new _FilePhysicalStoragePlugin.FilePhysicalStoragePlugin({
|
|
24
|
+
upload: async params => {
|
|
25
|
+
const {
|
|
26
|
+
settings,
|
|
27
|
+
buffer
|
|
28
|
+
} = params,
|
|
29
|
+
data = (0, _objectWithoutProperties2.default)(params, _excluded);
|
|
30
|
+
const normalizer = (0, _createFileNormalizerFromContext.createFileNormalizerFromContext)(context);
|
|
31
|
+
const {
|
|
32
|
+
data: preSignedPostPayload,
|
|
33
|
+
file
|
|
34
|
+
} = await (0, _getPresignedPostPayload.getPresignedPostPayload)(await normalizer.normalizeFile(data), settings);
|
|
35
|
+
const response = await (0, _uploadFileToS.default)(buffer, preSignedPostPayload);
|
|
36
|
+
if (!response.ok) {
|
|
37
|
+
throw Error("Unable to upload file.");
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
data: preSignedPostPayload,
|
|
41
|
+
file
|
|
42
|
+
};
|
|
43
|
+
},
|
|
44
|
+
delete: async params => {
|
|
45
|
+
const {
|
|
46
|
+
key
|
|
47
|
+
} = params;
|
|
48
|
+
const s3 = new _s.default();
|
|
49
|
+
if (!key || !S3_BUCKET) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
await s3.deleteObject({
|
|
53
|
+
Bucket: S3_BUCKET,
|
|
54
|
+
Key: key
|
|
55
|
+
}).promise();
|
|
43
56
|
}
|
|
44
|
-
|
|
45
|
-
return {
|
|
46
|
-
data: preSignedPostPayload,
|
|
47
|
-
file
|
|
48
|
-
};
|
|
49
|
-
},
|
|
50
|
-
delete: async params => {
|
|
51
|
-
const {
|
|
52
|
-
key
|
|
53
|
-
} = params;
|
|
54
|
-
const s3 = new _s.default();
|
|
55
|
-
|
|
56
|
-
if (!key || !S3_BUCKET) {
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
await s3.deleteObject({
|
|
61
|
-
Bucket: S3_BUCKET,
|
|
62
|
-
Key: key
|
|
63
|
-
}).promise();
|
|
64
|
-
}
|
|
57
|
+
}));
|
|
65
58
|
});
|
|
66
59
|
};
|
|
67
|
-
|
|
68
60
|
exports.default = _default;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["S3_BUCKET","process","env","FilePhysicalStoragePlugin","upload","params","settings","buffer","data","preSignedPostPayload","file","getPresignedPostPayload","response","uploadFileToS3","ok","Error","delete","key","s3","S3","deleteObject","Bucket","Key","promise"],"sources":["fileStorageS3.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\nimport getPresignedPostPayload from \"
|
|
1
|
+
{"version":3,"names":["_s","_interopRequireDefault","require","_FilePhysicalStoragePlugin","_getPresignedPostPayload","_uploadFileToS","_api","_createFileNormalizerFromContext","_excluded","S3_BUCKET","process","env","_default","ContextPlugin","context","plugins","register","FilePhysicalStoragePlugin","upload","params","settings","buffer","data","_objectWithoutProperties2","default","normalizer","createFileNormalizerFromContext","preSignedPostPayload","file","getPresignedPostPayload","normalizeFile","response","uploadFileToS3","ok","Error","delete","key","s3","S3","deleteObject","Bucket","Key","promise","exports"],"sources":["fileStorageS3.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\nimport { FilePhysicalStoragePlugin } from \"@webiny/api-file-manager/plugins/FilePhysicalStoragePlugin\";\nimport { getPresignedPostPayload } from \"~/utils/getPresignedPostPayload\";\nimport uploadFileToS3 from \"../utils/uploadFileToS3\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport { createFileNormalizerFromContext } from \"~/utils/createFileNormalizerFromContext\";\nimport { PresignedPostPayloadData } from \"~/types\";\n\nconst S3_BUCKET = process.env.S3_BUCKET;\n\nexport default () => {\n /**\n * We need to extend the type for FilePhysicalStoragePlugin.\n * Otherwise, the `getPresignedPostPayload` doesn't know it has all required values in params.\n */\n return new ContextPlugin(context => {\n context.plugins.register(\n new FilePhysicalStoragePlugin({\n upload: async params => {\n const { settings, buffer, ...data } = params;\n\n const normalizer = createFileNormalizerFromContext(context);\n\n const { data: preSignedPostPayload, file } = await getPresignedPostPayload(\n await normalizer.normalizeFile(data as PresignedPostPayloadData),\n settings\n );\n\n const response = await uploadFileToS3(buffer, preSignedPostPayload);\n if (!response.ok) {\n throw Error(\"Unable to upload file.\");\n }\n\n return {\n data: preSignedPostPayload,\n file\n };\n },\n delete: async params => {\n const { key } = params;\n const s3 = new S3();\n\n if (!key || !S3_BUCKET) {\n return;\n }\n\n await s3\n .deleteObject({\n Bucket: S3_BUCKET,\n Key: key\n })\n .promise();\n }\n })\n );\n });\n};\n"],"mappings":";;;;;;;;AAAA,IAAAA,EAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,0BAAA,GAAAD,OAAA;AACA,IAAAE,wBAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,IAAA,GAAAJ,OAAA;AACA,IAAAK,gCAAA,GAAAL,OAAA;AAA0F,MAAAM,SAAA;AAG1F,MAAMC,SAAS,GAAGC,OAAO,CAACC,GAAG,CAACF,SAAS;AAAC,IAAAG,QAAA,GAEzBA,CAAA,KAAM;EACjB;AACJ;AACA;AACA;EACI,OAAO,IAAIC,kBAAa,CAACC,OAAO,IAAI;IAChCA,OAAO,CAACC,OAAO,CAACC,QAAQ,CACpB,IAAIC,oDAAyB,CAAC;MAC1BC,MAAM,EAAE,MAAMC,MAAM,IAAI;QACpB,MAAM;YAAEC,QAAQ;YAAEC;UAAgB,CAAC,GAAGF,MAAM;UAAfG,IAAI,OAAAC,yBAAA,CAAAC,OAAA,EAAKL,MAAM,EAAAX,SAAA;QAE5C,MAAMiB,UAAU,GAAG,IAAAC,gEAA+B,EAACZ,OAAO,CAAC;QAE3D,MAAM;UAAEQ,IAAI,EAAEK,oBAAoB;UAAEC;QAAK,CAAC,GAAG,MAAM,IAAAC,gDAAuB,EACtE,MAAMJ,UAAU,CAACK,aAAa,CAACR,IAAgC,CAAC,EAChEF,QACJ,CAAC;QAED,MAAMW,QAAQ,GAAG,MAAM,IAAAC,sBAAc,EAACX,MAAM,EAAEM,oBAAoB,CAAC;QACnE,IAAI,CAACI,QAAQ,CAACE,EAAE,EAAE;UACd,MAAMC,KAAK,CAAC,wBAAwB,CAAC;QACzC;QAEA,OAAO;UACHZ,IAAI,EAAEK,oBAAoB;UAC1BC;QACJ,CAAC;MACL,CAAC;MACDO,MAAM,EAAE,MAAMhB,MAAM,IAAI;QACpB,MAAM;UAAEiB;QAAI,CAAC,GAAGjB,MAAM;QACtB,MAAMkB,EAAE,GAAG,IAAIC,UAAE,CAAC,CAAC;QAEnB,IAAI,CAACF,GAAG,IAAI,CAAC3B,SAAS,EAAE;UACpB;QACJ;QAEA,MAAM4B,EAAE,CACHE,YAAY,CAAC;UACVC,MAAM,EAAE/B,SAAS;UACjBgC,GAAG,EAAEL;QACT,CAAC,CAAC,CACDM,OAAO,CAAC,CAAC;MAClB;IACJ,CAAC,CACL,CAAC;EACL,CAAC,CAAC;AACN,CAAC;AAAAC,OAAA,CAAAnB,OAAA,GAAAZ,QAAA"}
|