@webiny/api-file-manager-s3 5.37.0-beta.0 → 5.37.0-beta.2

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.
Files changed (47) hide show
  1. package/index.d.ts +2 -1
  2. package/index.js +7 -0
  3. package/index.js.map +1 -1
  4. package/multiPartUpload/CompleteMultiPartUploadUseCase.js.map +1 -1
  5. package/multiPartUpload/CreateMultiPartUploadUseCase.d.ts +4 -7
  6. package/multiPartUpload/CreateMultiPartUploadUseCase.js +5 -4
  7. package/multiPartUpload/CreateMultiPartUploadUseCase.js.map +1 -1
  8. package/package.json +16 -12
  9. package/plugins/checkPermissions.d.ts +4 -0
  10. package/plugins/checkPermissions.js +42 -0
  11. package/plugins/checkPermissions.js.map +1 -0
  12. package/plugins/fileStorageS3.d.ts +2 -2
  13. package/plugins/fileStorageS3.js +38 -33
  14. package/plugins/fileStorageS3.js.map +1 -1
  15. package/plugins/graphqlFileStorageS3.js +29 -15
  16. package/plugins/graphqlFileStorageS3.js.map +1 -1
  17. package/types.d.ts +2 -2
  18. package/types.js.map +1 -1
  19. package/utils/FileExtension.d.ts +6 -0
  20. package/utils/FileExtension.js +28 -0
  21. package/utils/FileExtension.js.map +1 -0
  22. package/utils/FileKey.d.ts +11 -0
  23. package/utils/FileKey.js +35 -0
  24. package/utils/FileKey.js.map +1 -0
  25. package/utils/FileNormalizer.d.ts +18 -0
  26. package/utils/FileNormalizer.js +50 -0
  27. package/utils/FileNormalizer.js.map +1 -0
  28. package/utils/FileUploadModifier.d.ts +30 -0
  29. package/utils/FileUploadModifier.js +49 -0
  30. package/utils/FileUploadModifier.js.map +1 -0
  31. package/utils/createFileNormalizerFromContext.d.ts +3 -0
  32. package/utils/createFileNormalizerFromContext.js +13 -0
  33. package/utils/createFileNormalizerFromContext.js.map +1 -0
  34. package/utils/getPresignedPostPayload.d.ts +2 -2
  35. package/utils/getPresignedPostPayload.js +1 -3
  36. package/utils/getPresignedPostPayload.js.map +1 -1
  37. package/utils/mimeTypes.js.map +1 -1
  38. package/utils/uploadFileToS3.js.map +1 -1
  39. package/plugins/checkBasePermissions.d.ts +0 -5
  40. package/plugins/checkBasePermissions.js +0 -24
  41. package/plugins/checkBasePermissions.js.map +0 -1
  42. package/plugins/checkPermission.d.ts +0 -4
  43. package/plugins/checkPermission.js +0 -25
  44. package/plugins/checkPermission.js.map +0 -1
  45. package/utils/prepareFileData.d.ts +0 -2
  46. package/utils/prepareFileData.js +0 -62
  47. package/utils/prepareFileData.js.map +0 -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-file-manager/plugins/FilePhysicalStoragePlugin").FilePhysicalStoragePlugin<import("@webiny/api-file-manager/plugins/FilePhysicalStoragePlugin").FilePhysicalStoragePluginUploadParams, import("@webiny/api-file-manager/plugins/FilePhysicalStoragePlugin").FilePhysicalStoragePluginDeleteParams>)[];
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
@@ -4,8 +4,15 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
+ Object.defineProperty(exports, "createFileUploadModifier", {
8
+ enumerable: true,
9
+ get: function () {
10
+ return _FileUploadModifier.createFileUploadModifier;
11
+ }
12
+ });
7
13
  exports.default = void 0;
8
14
  var _graphqlFileStorageS = _interopRequireDefault(require("./plugins/graphqlFileStorageS3"));
9
15
  var _fileStorageS = _interopRequireDefault(require("./plugins/fileStorageS3"));
16
+ var _FileUploadModifier = require("./utils/FileUploadModifier");
10
17
  var _default = () => [(0, _fileStorageS.default)(), _graphqlFileStorageS.default];
11
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":";;;;;;;AAAA;AACA;AAAoD,eAErC,MAAM,CAAC,IAAAA,qBAAa,GAAE,EAAEC,4BAAoB,CAAC;AAAA"}
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"}
@@ -1 +1 @@
1
- {"version":3,"names":["CompleteMultiPartUploadUseCase","constructor","bucket","s3Client","s3","execute","params","uploadParams","Bucket","Key","fileKey","UploadId","uploadId","allParts","getAllUploadParts","s3Params","MultipartUpload","Parts","Promise","resolve","reject","completeMultipartUpload","err","data","console","error","log","parts","marker","undefined","PartNumberMarker","listParts","promise","forEach","part","push","map","ETag","PartNumber"],"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,WAAW,CAACC,MAAc,EAAEC,QAAY,EAAE;IAAA;IAAA;IACtC,IAAI,CAACD,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACE,EAAE,GAAGD,QAAQ;EACtB;EAEA,MAAME,OAAO,CAACC,MAAqC,EAAE;IACjD,MAAMC,YAAY,GAAG;MACjBC,MAAM,EAAE,IAAI,CAACN,MAAM;MACnBO,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,+DACPR,YAAY;MACfS,eAAe,EAAE;QACbC,KAAK,EAAEJ;MACX;IAAC,EACJ;IAED,OAAO,IAAIK,OAAO,CAAO,CAACC,OAAO,EAAEC,MAAM,KAAK;MAC1C,IAAI,CAAChB,EAAE,CAACiB,uBAAuB,CAACN,QAAQ,EAAE,CAACO,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,EAAE;MACb,CAAC,CAAC;IACN,CAAC,CAAC;EACN;EAEA,MAAcL,iBAAiB,CAACR,MAA+B,EAAE;IAC7D,MAAMqB,KAAe,GAAG,EAAE;IAE1B,IAAIC,MAA0B,GAAGC,SAAS;IAC1C,OAAO,IAAI,EAAE;MACT,MAAM;QAAEZ,KAAK;QAAEa;MAAqC,CAAC,GAAG,MAAM,IAAI,CAAC1B,EAAE,CAChE2B,SAAS,6DACHzB,MAAM;QACTwB,gBAAgB,EAAEF;MAAM,GAC1B,CACDI,OAAO,EAAE;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;AAAC"}
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"}
@@ -1,18 +1,15 @@
1
1
  import S3 from "aws-sdk/clients/s3";
2
+ import { FileData } from "../types";
2
3
  interface CreateMultiPartUploadParams {
3
- file: {
4
- name: string;
5
- type: string;
6
- size: number;
7
- };
4
+ file: FileData;
8
5
  numberOfParts: number;
9
6
  }
10
7
  export declare class CreateMultiPartUploadUseCase {
11
8
  private readonly s3;
12
9
  private readonly bucket;
13
10
  constructor(bucket: string, s3Client: S3);
14
- execute(params: CreateMultiPartUploadParams): Promise<{
15
- file: import("../types").FileData;
11
+ execute({ file, numberOfParts }: CreateMultiPartUploadParams): Promise<{
12
+ file: FileData;
16
13
  uploadId: string | undefined;
17
14
  parts: {
18
15
  url: string;
@@ -7,7 +7,6 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.CreateMultiPartUploadUseCase = void 0;
8
8
  var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
- var _prepareFileData = require("../utils/prepareFileData");
11
10
  class CreateMultiPartUploadUseCase {
12
11
  constructor(bucket, s3Client) {
13
12
  (0, _defineProperty2.default)(this, "s3", void 0);
@@ -15,8 +14,10 @@ class CreateMultiPartUploadUseCase {
15
14
  this.bucket = bucket;
16
15
  this.s3 = s3Client;
17
16
  }
18
- async execute(params) {
19
- const file = (0, _prepareFileData.prepareFileData)(params.file);
17
+ async execute({
18
+ file,
19
+ numberOfParts
20
+ }) {
20
21
  const s3Params = {
21
22
  Bucket: this.bucket,
22
23
  Key: file.key
@@ -25,7 +26,7 @@ class CreateMultiPartUploadUseCase {
25
26
  UploadId
26
27
  } = await this.s3.createMultipartUpload(s3Params).promise();
27
28
  const parts = await Promise.all(Array.from({
28
- length: params.numberOfParts
29
+ length: numberOfParts
29
30
  }).map((_, index) => {
30
31
  return this.s3.getSignedUrlPromise("uploadPart", (0, _objectSpread2.default)((0, _objectSpread2.default)({}, s3Params), {}, {
31
32
  UploadId,
@@ -1 +1 @@
1
- {"version":3,"names":["CreateMultiPartUploadUseCase","constructor","bucket","s3Client","s3","execute","params","file","prepareFileData","s3Params","Bucket","Key","key","UploadId","createMultipartUpload","promise","parts","Promise","all","Array","from","length","numberOfParts","map","_","index","getSignedUrlPromise","PartNumber","Expires","then","url","partNumber","uploadId"],"sources":["CreateMultiPartUploadUseCase.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\nimport { prepareFileData } from \"~/utils/prepareFileData\";\n\ninterface CreateMultiPartUploadParams {\n file: {\n name: string;\n type: string;\n size: number;\n };\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(params: CreateMultiPartUploadParams) {\n const file = prepareFileData(params.file);\n\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: params.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":";;;;;;;;;AACA;AAWO,MAAMA,4BAA4B,CAAC;EAItCC,WAAW,CAACC,MAAc,EAAEC,QAAY,EAAE;IAAA;IAAA;IACtC,IAAI,CAACD,MAAM,GAAGA,MAAM;IACpB,IAAI,CAACE,EAAE,GAAGD,QAAQ;EACtB;EAEA,MAAME,OAAO,CAACC,MAAmC,EAAE;IAC/C,MAAMC,IAAI,GAAG,IAAAC,gCAAe,EAACF,MAAM,CAACC,IAAI,CAAC;IAEzC,MAAME,QAAQ,GAAG;MAAEC,MAAM,EAAE,IAAI,CAACR,MAAM;MAAES,GAAG,EAAEJ,IAAI,CAACK;IAAI,CAAC;IAEvD,MAAM;MAAEC;IAAS,CAAC,GAAG,MAAM,IAAI,CAACT,EAAE,CAACU,qBAAqB,CAACL,QAAQ,CAAC,CAACM,OAAO,EAAE;IAE5E,MAAMC,KAAK,GAAG,MAAMC,OAAO,CAACC,GAAG,CAC3BC,KAAK,CAACC,IAAI,CAAC;MAAEC,MAAM,EAAEf,MAAM,CAACgB;IAAc,CAAC,CAAC,CAACC,GAAG,CAAC,CAACC,CAAC,EAAEC,KAAK,KAAK;MAC3D,OAAO,IAAI,CAACrB,EAAE,CACTsB,mBAAmB,CAAC,YAAY,8DAC1BjB,QAAQ;QACXI,QAAQ;QACRc,UAAU,EAAEF,KAAK,GAAG,CAAC;QACrB;QACAG,OAAO,EAAE;MAAK,GAChB,CACDC,IAAI,CAACC,GAAG,KAAK;QACVA,GAAG;QACHC,UAAU,EAAEN,KAAK,GAAG;MACxB,CAAC,CAAC,CAAC;IACX,CAAC,CAAC,CACL;IAED,OAAO;MACHlB,IAAI;MACJyB,QAAQ,EAAEnB,QAAQ;MAClBG;IACJ,CAAC;EACL;AACJ;AAAC"}
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": "5.37.0-beta.0",
3
+ "version": "5.37.0-beta.2",
4
4
  "main": "index.js",
5
5
  "repository": {
6
6
  "type": "git",
@@ -10,23 +10,27 @@
10
10
  "author": "Webiny Ltd",
11
11
  "license": "MIT",
12
12
  "dependencies": {
13
- "@webiny/api-file-manager": "5.37.0-beta.0",
14
- "@webiny/api-security": "5.37.0-beta.0",
15
- "@webiny/error": "5.37.0-beta.0",
16
- "@webiny/handler-graphql": "5.37.0-beta.0",
17
- "@webiny/utils": "5.37.0-beta.0",
18
- "@webiny/validation": "5.37.0-beta.0",
13
+ "@webiny/api": "5.37.0-beta.2",
14
+ "@webiny/api-file-manager": "5.37.0-beta.2",
15
+ "@webiny/api-security": "5.37.0-beta.2",
16
+ "@webiny/error": "5.37.0-beta.2",
17
+ "@webiny/handler-graphql": "5.37.0-beta.2",
18
+ "@webiny/plugins": "5.37.0-beta.2",
19
+ "@webiny/utils": "5.37.0-beta.2",
20
+ "@webiny/validation": "5.37.0-beta.2",
19
21
  "form-data": "4.0.0",
20
22
  "mime": "3.0.0",
21
23
  "node-fetch": "2.6.9",
24
+ "p-map": "4.0.0",
25
+ "p-reduce": "2.1.0",
22
26
  "sanitize-filename": "1.6.3"
23
27
  },
24
28
  "devDependencies": {
25
- "@babel/cli": "7.20.7",
26
- "@babel/core": "7.20.12",
29
+ "@babel/cli": "7.22.6",
30
+ "@babel/core": "7.22.8",
27
31
  "@types/node-fetch": "2.6.2",
28
- "@webiny/cli": "5.37.0-beta.0",
29
- "@webiny/project-utils": "5.37.0-beta.0",
32
+ "@webiny/cli": "5.37.0-beta.2",
33
+ "@webiny/project-utils": "5.37.0-beta.2",
30
34
  "rimraf": "3.0.2",
31
35
  "typescript": "4.7.4"
32
36
  },
@@ -38,5 +42,5 @@
38
42
  "build": "yarn webiny run build",
39
43
  "watch": "yarn webiny run watch"
40
44
  },
41
- "gitHead": "7bb6232942f0414e22a4549113dd112bb92e52c5"
45
+ "gitHead": "8d3f4ba102f9f73b0a17455fc401a15aea68ce63"
42
46
  }
@@ -0,0 +1,4 @@
1
+ import { FileManagerContext, FilePermission } from "@webiny/api-file-manager/types";
2
+ export declare const checkPermissions: (context: FileManagerContext, check?: {
3
+ rwd?: string;
4
+ }) => Promise<FilePermission[]>;
@@ -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,3 +1,3 @@
1
- import { FilePhysicalStoragePlugin } from "@webiny/api-file-manager/plugins/FilePhysicalStoragePlugin";
2
- declare const _default: () => FilePhysicalStoragePlugin;
1
+ import { ContextPlugin } from "@webiny/api";
2
+ declare const _default: () => ContextPlugin<import("@webiny/api/types").Context>;
3
3
  export default _default;
@@ -7,9 +7,11 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.default = void 0;
8
8
  var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
9
9
  var _s = _interopRequireDefault(require("aws-sdk/clients/s3"));
10
+ var _FilePhysicalStoragePlugin = require("@webiny/api-file-manager/plugins/FilePhysicalStoragePlugin");
10
11
  var _getPresignedPostPayload = require("../utils/getPresignedPostPayload");
11
12
  var _uploadFileToS = _interopRequireDefault(require("../utils/uploadFileToS3"));
12
- var _FilePhysicalStoragePlugin = require("@webiny/api-file-manager/plugins/FilePhysicalStoragePlugin");
13
+ var _api = require("@webiny/api");
14
+ var _createFileNormalizerFromContext = require("../utils/createFileNormalizerFromContext");
13
15
  const _excluded = ["settings", "buffer"];
14
16
  const S3_BUCKET = process.env.S3_BUCKET;
15
17
  var _default = () => {
@@ -17,39 +19,42 @@ var _default = () => {
17
19
  * We need to extend the type for FilePhysicalStoragePlugin.
18
20
  * Otherwise, the `getPresignedPostPayload` doesn't know it has all required values in params.
19
21
  */
20
- return new _FilePhysicalStoragePlugin.FilePhysicalStoragePlugin({
21
- upload: async params => {
22
- const {
23
- settings,
24
- buffer
25
- } = params,
26
- data = (0, _objectWithoutProperties2.default)(params, _excluded);
27
- const {
28
- data: preSignedPostPayload,
29
- file
30
- } = await (0, _getPresignedPostPayload.getPresignedPostPayload)(data, settings);
31
- const response = await (0, _uploadFileToS.default)(buffer, preSignedPostPayload);
32
- if (!response.ok) {
33
- throw Error("Unable to upload file.");
34
- }
35
- return {
36
- data: preSignedPostPayload,
37
- file
38
- };
39
- },
40
- delete: async params => {
41
- const {
42
- key
43
- } = params;
44
- const s3 = new _s.default();
45
- if (!key || !S3_BUCKET) {
46
- return;
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();
47
56
  }
48
- await s3.deleteObject({
49
- Bucket: S3_BUCKET,
50
- Key: key
51
- }).promise();
52
- }
57
+ }));
53
58
  });
54
59
  };
55
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 \"~/utils/getPresignedPostPayload\";\nimport uploadFileToS3 from \"../utils/uploadFileToS3\";\nimport { FilePhysicalStoragePlugin } from \"@webiny/api-file-manager/plugins/FilePhysicalStoragePlugin\";\nimport { PresignedPostPayloadData } from \"~/types\";\n\nconst S3_BUCKET = process.env.S3_BUCKET;\n\nexport default (): FilePhysicalStoragePlugin => {\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 FilePhysicalStoragePlugin({\n upload: async params => {\n const { settings, buffer, ...data } = params;\n\n const { data: preSignedPostPayload, file } = await getPresignedPostPayload(\n 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"],"mappings":";;;;;;;;AAAA;AACA;AACA;AACA;AAAuG;AAGvG,MAAMA,SAAS,GAAGC,OAAO,CAACC,GAAG,CAACF,SAAS;AAAC,eAEzB,MAAiC;EAC5C;AACJ;AACA;AACA;EACI,OAAO,IAAIG,oDAAyB,CAAC;IACjCC,MAAM,EAAE,MAAMC,MAAM,IAAI;MACpB,MAAM;UAAEC,QAAQ;UAAEC;QAAgB,CAAC,GAAGF,MAAM;QAAfG,IAAI,0CAAKH,MAAM;MAE5C,MAAM;QAAEG,IAAI,EAAEC,oBAAoB;QAAEC;MAAK,CAAC,GAAG,MAAM,IAAAC,gDAAuB,EACtEH,IAAI,EACJF,QAAQ,CACX;MAED,MAAMM,QAAQ,GAAG,MAAM,IAAAC,sBAAc,EAACN,MAAM,EAAEE,oBAAoB,CAAC;MACnE,IAAI,CAACG,QAAQ,CAACE,EAAE,EAAE;QACd,MAAMC,KAAK,CAAC,wBAAwB,CAAC;MACzC;MAEA,OAAO;QACHP,IAAI,EAAEC,oBAAoB;QAC1BC;MACJ,CAAC;IACL,CAAC;IACDM,MAAM,EAAE,MAAMX,MAAM,IAAI;MACpB,MAAM;QAAEY;MAAI,CAAC,GAAGZ,MAAM;MACtB,MAAMa,EAAE,GAAG,IAAIC,UAAE,EAAE;MAEnB,IAAI,CAACF,GAAG,IAAI,CAACjB,SAAS,EAAE;QACpB;MACJ;MAEA,MAAMkB,EAAE,CACHE,YAAY,CAAC;QACVC,MAAM,EAAErB,SAAS;QACjBsB,GAAG,EAAEL;MACT,CAAC,CAAC,CACDM,OAAO,EAAE;IAClB;EACJ,CAAC,CAAC;AACN,CAAC;AAAA"}
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"}
@@ -6,17 +6,27 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _s = _interopRequireDefault(require("aws-sdk/clients/s3"));
9
+ var _pMap = _interopRequireDefault(require("p-map"));
9
10
  var _responses = require("@webiny/handler-graphql/responses");
10
11
  var _getPresignedPostPayload = require("../utils/getPresignedPostPayload");
11
12
  var _error = _interopRequireDefault(require("@webiny/error"));
12
- var _checkPermission = require("./checkPermission");
13
+ var _checkPermissions = require("./checkPermissions");
13
14
  var _CreateMultiPartUploadUseCase = require("../multiPartUpload/CreateMultiPartUploadUseCase");
14
15
  var _CompleteMultiPartUploadUseCase = require("../multiPartUpload/CompleteMultiPartUploadUseCase");
16
+ var _createFileNormalizerFromContext = require("../utils/createFileNormalizerFromContext");
15
17
  const plugin = {
16
18
  type: "graphql-schema",
17
19
  name: "graphql-schema-api-file-manager-s3",
18
20
  schema: {
19
21
  typeDefs: /* GraphQL */`
22
+ type UploadFileResponseDataFile {
23
+ id: ID!
24
+ name: String!
25
+ type: String!
26
+ size: Long!
27
+ key: String!
28
+ }
29
+
20
30
  input PreSignedPostPayloadInput {
21
31
  name: String!
22
32
  type: String!
@@ -38,7 +48,7 @@ const plugin = {
38
48
  }
39
49
 
40
50
  type GetPreSignedPostPayloadResponse {
41
- error: FileError
51
+ error: FmError
42
52
  data: GetPreSignedPostPayloadResponseData
43
53
  }
44
54
 
@@ -55,11 +65,11 @@ const plugin = {
55
65
 
56
66
  type CompleteMultiPartUploadResponse {
57
67
  data: Boolean
58
- error: FileError
68
+ error: FmError
59
69
  }
60
70
 
61
71
  type GetPreSignedPostPayloadsResponse {
62
- error: FileError
72
+ error: FmError
63
73
  data: [GetPreSignedPostPayloadResponseData!]!
64
74
  }
65
75
 
@@ -74,7 +84,7 @@ const plugin = {
74
84
 
75
85
  type CreateMultiPartUploadResponse {
76
86
  data: CreateMultiPartUploadResponseData
77
- error: FileError
87
+ error: FmError
78
88
  }
79
89
 
80
90
  input MultiPartUploadFilePartInput {
@@ -98,17 +108,19 @@ const plugin = {
98
108
  FmQuery: {
99
109
  getPreSignedPostPayload: async (_, args, context) => {
100
110
  try {
101
- await (0, _checkPermission.checkPermission)(context, {
111
+ await (0, _checkPermissions.checkPermissions)(context, {
102
112
  rwd: "w"
103
113
  });
104
- const file = args.data;
114
+ const data = args.data;
105
115
  const settings = await context.fileManager.getSettings();
106
116
  if (!settings) {
107
117
  throw new _error.default("Missing File Manager Settings.", "FILE_MANAGER_SETTINGS_ERROR", {
108
- file
118
+ file: data
109
119
  });
110
120
  }
111
- return new _responses.Response((0, _getPresignedPostPayload.getPresignedPostPayload)(file, settings));
121
+ const normalizer = (0, _createFileNormalizerFromContext.createFileNormalizerFromContext)(context);
122
+ const presignedPayload = (0, _getPresignedPostPayload.getPresignedPostPayload)(await normalizer.normalizeFile(data), settings);
123
+ return new _responses.Response(presignedPayload);
112
124
  } catch (e) {
113
125
  return new _responses.ErrorResponse({
114
126
  message: e.message,
@@ -118,7 +130,7 @@ const plugin = {
118
130
  }
119
131
  },
120
132
  getPreSignedPostPayloads: async (_, args, context) => {
121
- await (0, _checkPermission.checkPermission)(context, {
133
+ await (0, _checkPermissions.checkPermissions)(context, {
122
134
  rwd: "w"
123
135
  });
124
136
  const files = args.data;
@@ -129,8 +141,9 @@ const plugin = {
129
141
  files
130
142
  });
131
143
  }
132
- const presignedPayloads = files.map(file => {
133
- return (0, _getPresignedPostPayload.getPresignedPostPayload)(file, settings);
144
+ const normalizer = (0, _createFileNormalizerFromContext.createFileNormalizerFromContext)(context);
145
+ const presignedPayloads = await (0, _pMap.default)(files, async data => {
146
+ return (0, _getPresignedPostPayload.getPresignedPostPayload)(await normalizer.normalizeFile(data), settings);
134
147
  });
135
148
  return new _responses.Response(presignedPayloads);
136
149
  } catch (e) {
@@ -144,7 +157,7 @@ const plugin = {
144
157
  },
145
158
  FmMutation: {
146
159
  createMultiPartUpload: async (_, args, context) => {
147
- await (0, _checkPermission.checkPermission)(context, {
160
+ await (0, _checkPermissions.checkPermissions)(context, {
148
161
  rwd: "w"
149
162
  });
150
163
  const s3Client = new _s.default({
@@ -153,8 +166,9 @@ const plugin = {
153
166
  });
154
167
  try {
155
168
  const useCase = new _CreateMultiPartUploadUseCase.CreateMultiPartUploadUseCase(String(process.env.S3_BUCKET), s3Client);
169
+ const normalizer = (0, _createFileNormalizerFromContext.createFileNormalizerFromContext)(context);
156
170
  const multiPartUpload = await useCase.execute({
157
- file: args.data,
171
+ file: await normalizer.normalizeFile(args.data),
158
172
  numberOfParts: args.numberOfParts
159
173
  });
160
174
  return new _responses.Response(multiPartUpload);
@@ -167,7 +181,7 @@ const plugin = {
167
181
  }
168
182
  },
169
183
  completeMultiPartUpload: async (_, args, context) => {
170
- await (0, _checkPermission.checkPermission)(context, {
184
+ await (0, _checkPermissions.checkPermissions)(context, {
171
185
  rwd: "w"
172
186
  });
173
187
  const s3Client = new _s.default({
@@ -1 +1 @@
1
- {"version":3,"names":["plugin","type","name","schema","typeDefs","resolvers","FmQuery","getPreSignedPostPayload","_","args","context","checkPermission","rwd","file","data","settings","fileManager","getSettings","WebinyError","Response","getPresignedPostPayload","e","ErrorResponse","message","code","getPreSignedPostPayloads","files","presignedPayloads","map","FmMutation","createMultiPartUpload","s3Client","S3","region","process","env","AWS_REGION","signatureVersion","useCase","CreateMultiPartUploadUseCase","String","S3_BUCKET","multiPartUpload","execute","numberOfParts","completeMultiPartUpload","CompleteMultiPartUploadUseCase","fileKey","uploadId"],"sources":["graphqlFileStorageS3.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\nimport { GraphQLSchemaPlugin } from \"@webiny/handler-graphql/types\";\nimport { ErrorResponse, Response } from \"@webiny/handler-graphql/responses\";\nimport { FileManagerContext } from \"@webiny/api-file-manager/types\";\nimport { getPresignedPostPayload } from \"~/utils/getPresignedPostPayload\";\nimport WebinyError from \"@webiny/error\";\nimport { checkPermission } from \"~/plugins/checkPermission\";\nimport { PresignedPostPayloadData } from \"~/types\";\nimport { CreateMultiPartUploadUseCase } from \"~/multiPartUpload/CreateMultiPartUploadUseCase\";\nimport { CompleteMultiPartUploadUseCase } from \"~/multiPartUpload/CompleteMultiPartUploadUseCase\";\n\nconst plugin: GraphQLSchemaPlugin<FileManagerContext> = {\n type: \"graphql-schema\",\n name: \"graphql-schema-api-file-manager-s3\",\n schema: {\n typeDefs: /* GraphQL */ `\n input PreSignedPostPayloadInput {\n name: String!\n type: String!\n size: Long!\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: FileError\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: FileError\n }\n\n type GetPreSignedPostPayloadsResponse {\n error: FileError\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: FileError\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 checkPermission(context, { rwd: \"w\" });\n\n const file = 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 }\n );\n }\n\n return new Response(getPresignedPostPayload(file, settings));\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 checkPermission(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 presignedPayloads = files.map(file => {\n return getPresignedPostPayload(file, settings);\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 checkPermission(context, { rwd: \"w\" });\n\n const s3Client = new S3({\n region: process.env.AWS_REGION,\n signatureVersion: \"v4\"\n });\n\n try {\n const useCase = new CreateMultiPartUploadUseCase(\n String(process.env.S3_BUCKET),\n s3Client\n );\n\n const multiPartUpload = await useCase.execute({\n file: 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 checkPermission(context, { rwd: \"w\" });\n\n const s3Client = new S3({\n region: process.env.AWS_REGION,\n signatureVersion: \"v4\"\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":";;;;;;;AAAA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAEA,MAAMA,MAA+C,GAAG;EACpDC,IAAI,EAAE,gBAAgB;EACtBC,IAAI,EAAE,oCAAoC;EAC1CC,MAAM,EAAE;IACJC,QAAQ,EAAE,aAAe;AACjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;IACDC,SAAS,EAAE;MACPC,OAAO,EAAE;QACLC,uBAAuB,EAAE,OAAOC,CAAC,EAAEC,IAAS,EAAEC,OAAO,KAAK;UACtD,IAAI;YACA,MAAM,IAAAC,gCAAe,EAACD,OAAO,EAAE;cAAEE,GAAG,EAAE;YAAI,CAAC,CAAC;YAE5C,MAAMC,IAAI,GAAGJ,IAAI,CAACK,IAAgC;YAElD,MAAMC,QAAQ,GAAG,MAAML,OAAO,CAACM,WAAW,CAACC,WAAW,EAAE;YACxD,IAAI,CAACF,QAAQ,EAAE;cACX,MAAM,IAAIG,cAAW,CACjB,gCAAgC,EAChC,6BAA6B,EAC7B;gBAAEL;cAAK,CAAC,CACX;YACL;YAEA,OAAO,IAAIM,mBAAQ,CAAC,IAAAC,gDAAuB,EAACP,IAAI,EAAEE,QAAQ,CAAC,CAAC;UAChE,CAAC,CAAC,OAAOM,CAAC,EAAE;YACR,OAAO,IAAIC,wBAAa,CAAC;cACrBC,OAAO,EAAEF,CAAC,CAACE,OAAO;cAClBC,IAAI,EAAEH,CAAC,CAACG,IAAI;cACZV,IAAI,EAAEO,CAAC,CAACP;YACZ,CAAC,CAAC;UACN;QACJ,CAAC;QACDW,wBAAwB,EAAE,OAAOjB,CAAC,EAAEC,IAAI,EAAEC,OAAO,KAAK;UAClD,MAAM,IAAAC,gCAAe,EAACD,OAAO,EAAE;YAAEE,GAAG,EAAE;UAAI,CAAC,CAAC;UAE5C,MAAMc,KAAK,GAAGjB,IAAI,CAACK,IAAkC;UAErD,IAAI;YACA,MAAMC,QAAQ,GAAG,MAAML,OAAO,CAACM,WAAW,CAACC,WAAW,EAAE;YACxD,IAAI,CAACF,QAAQ,EAAE;cACX,MAAM,IAAIG,cAAW,CACjB,gCAAgC,EAChC,6BAA6B,EAC7B;gBAAEQ;cAAM,CAAC,CACZ;YACL;YAEA,MAAMC,iBAAiB,GAAGD,KAAK,CAACE,GAAG,CAACf,IAAI,IAAI;cACxC,OAAO,IAAAO,gDAAuB,EAACP,IAAI,EAAEE,QAAQ,CAAC;YAClD,CAAC,CAAC;YAEF,OAAO,IAAII,mBAAQ,CAACQ,iBAAiB,CAAC;UAC1C,CAAC,CAAC,OAAON,CAAC,EAAE;YACR,OAAO,IAAIC,wBAAa,CAAC;cACrBC,OAAO,EAAEF,CAAC,CAACE,OAAO;cAClBC,IAAI,EAAEH,CAAC,CAACG,IAAI;cACZV,IAAI,EAAEO,CAAC,CAACP;YACZ,CAAC,CAAC;UACN;QACJ;MACJ,CAAC;MACDe,UAAU,EAAE;QACRC,qBAAqB,EAAE,OAAOtB,CAAC,EAAEC,IAAI,EAAEC,OAAO,KAAK;UAC/C,MAAM,IAAAC,gCAAe,EAACD,OAAO,EAAE;YAAEE,GAAG,EAAE;UAAI,CAAC,CAAC;UAE5C,MAAMmB,QAAQ,GAAG,IAAIC,UAAE,CAAC;YACpBC,MAAM,EAAEC,OAAO,CAACC,GAAG,CAACC,UAAU;YAC9BC,gBAAgB,EAAE;UACtB,CAAC,CAAC;UAEF,IAAI;YACA,MAAMC,OAAO,GAAG,IAAIC,0DAA4B,CAC5CC,MAAM,CAACN,OAAO,CAACC,GAAG,CAACM,SAAS,CAAC,EAC7BV,QAAQ,CACX;YAED,MAAMW,eAAe,GAAG,MAAMJ,OAAO,CAACK,OAAO,CAAC;cAC1C9B,IAAI,EAAEJ,IAAI,CAACK,IAAI;cACf8B,aAAa,EAAEnC,IAAI,CAACmC;YACxB,CAAC,CAAC;YAEF,OAAO,IAAIzB,mBAAQ,CAACuB,eAAe,CAAC;UACxC,CAAC,CAAC,OAAOrB,CAAC,EAAE;YACR,OAAO,IAAIC,wBAAa,CAAC;cACrBC,OAAO,EAAEF,CAAC,CAACE,OAAO;cAClBC,IAAI,EAAEH,CAAC,CAACG,IAAI;cACZV,IAAI,EAAEO,CAAC,CAACP;YACZ,CAAC,CAAC;UACN;QACJ,CAAC;QACD+B,uBAAuB,EAAE,OAAOrC,CAAC,EAAEC,IAAI,EAAEC,OAAO,KAAK;UACjD,MAAM,IAAAC,gCAAe,EAACD,OAAO,EAAE;YAAEE,GAAG,EAAE;UAAI,CAAC,CAAC;UAE5C,MAAMmB,QAAQ,GAAG,IAAIC,UAAE,CAAC;YACpBC,MAAM,EAAEC,OAAO,CAACC,GAAG,CAACC,UAAU;YAC9BC,gBAAgB,EAAE;UACtB,CAAC,CAAC;UAEF,IAAI;YACA,MAAMC,OAAO,GAAG,IAAIQ,8DAA8B,CAC9CN,MAAM,CAACN,OAAO,CAACC,GAAG,CAACM,SAAS,CAAC,EAC7BV,QAAQ,CACX;YAED,MAAMO,OAAO,CAACK,OAAO,CAAC;cAClBI,OAAO,EAAEtC,IAAI,CAACsC,OAAO;cACrBC,QAAQ,EAAEvC,IAAI,CAACuC;YACnB,CAAC,CAAC;YAEF,OAAO,IAAI7B,mBAAQ,CAAC,IAAI,CAAC;UAC7B,CAAC,CAAC,OAAOE,CAAC,EAAE;YACR,OAAO,IAAIC,wBAAa,CAAC;cACrBC,OAAO,EAAEF,CAAC,CAACE,OAAO;cAClBC,IAAI,EAAEH,CAAC,CAACG,IAAI;cACZV,IAAI,EAAEO,CAAC,CAACP;YACZ,CAAC,CAAC;UACN;QACJ;MACJ;IACJ;EACJ;AACJ,CAAC;AAAC,eAEad,MAAM;AAAA"}
1
+ {"version":3,"names":["_s","_interopRequireDefault","require","_pMap","_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","signatureVersion","useCase","CreateMultiPartUploadUseCase","String","S3_BUCKET","multiPartUpload","execute","numberOfParts","completeMultiPartUpload","CompleteMultiPartUploadUseCase","fileKey","uploadId","_default","exports","default"],"sources":["graphqlFileStorageS3.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\nimport pMap from \"p-map\";\nimport { GraphQLSchemaPlugin } from \"@webiny/handler-graphql/types\";\nimport { ErrorResponse, Response } from \"@webiny/handler-graphql/responses\";\nimport { FileManagerContext } from \"@webiny/api-file-manager/types\";\nimport { getPresignedPostPayload } from \"~/utils/getPresignedPostPayload\";\nimport WebinyError from \"@webiny/error\";\nimport { checkPermissions } from \"~/plugins/checkPermissions\";\nimport { 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 name: String!\n type: String!\n size: Long!\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 = 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 signatureVersion: \"v4\"\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 signatureVersion: \"v4\"\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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"}
package/types.d.ts CHANGED
@@ -9,10 +9,10 @@ export interface PresignedPostPayloadData {
9
9
  }
10
10
  export interface FileData {
11
11
  id: string;
12
- name: string;
13
12
  key: string;
14
- type: string;
13
+ name: string;
15
14
  size: number;
15
+ type: string;
16
16
  }
17
17
  export interface PresignedPostPayloadDataResponse {
18
18
  data: S3.PresignedPost;
package/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/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 name: string;\n key: string;\n type: string;\n size: number;\n}\n\nexport interface PresignedPostPayloadDataResponse {\n data: S3.PresignedPost;\n file: FileData;\n}\n"],"mappings":""}
1
+ {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/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: S3.PresignedPost;\n file: FileData;\n}\n"],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import { PresignedPostPayloadData } from "../types";
2
+ export declare class FileExtension {
3
+ private data;
4
+ constructor(data: PresignedPostPayloadData);
5
+ getValue(): string;
6
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.FileExtension = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _mimeTypes = require("./mimeTypes");
10
+ class FileExtension {
11
+ constructor(data) {
12
+ (0, _defineProperty2.default)(this, "data", void 0);
13
+ this.data = data;
14
+ }
15
+ getValue() {
16
+ const name = this.data.name.toLowerCase();
17
+ const maybeHasExtension = name.includes(".");
18
+ if (maybeHasExtension) {
19
+ const maybeExt = name.split(".").pop();
20
+ const extensions = _mimeTypes.mimeTypes[this.data.type];
21
+ if (extensions && !extensions.includes(maybeExt)) {
22
+ return extensions[0];
23
+ }
24
+ }
25
+ return "";
26
+ }
27
+ }
28
+ exports.FileExtension = FileExtension;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_mimeTypes","require","FileExtension","constructor","data","_defineProperty2","default","getValue","name","toLowerCase","maybeHasExtension","includes","maybeExt","split","pop","extensions","mimeTypes","type","exports"],"sources":["FileExtension.ts"],"sourcesContent":["import { mimeTypes } from \"~/utils/mimeTypes\";\nimport { 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.name.toLowerCase();\n const maybeHasExtension = name.includes(\".\");\n\n if (maybeHasExtension) {\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\n return \"\";\n }\n}\n"],"mappings":";;;;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAGO,MAAMC,aAAa,CAAC;EAGvBC,WAAWA,CAACC,IAA8B,EAAE;IAAA,IAAAC,gBAAA,CAAAC,OAAA;IACxC,IAAI,CAACF,IAAI,GAAGA,IAAI;EACpB;EAEAG,QAAQA,CAAA,EAAG;IACP,MAAMC,IAAI,GAAG,IAAI,CAACJ,IAAI,CAACI,IAAI,CAACC,WAAW,CAAC,CAAC;IACzC,MAAMC,iBAAiB,GAAGF,IAAI,CAACG,QAAQ,CAAC,GAAG,CAAC;IAE5C,IAAID,iBAAiB,EAAE;MACnB,MAAME,QAAQ,GAAGJ,IAAI,CAACK,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,CAAC,CAAW;MAChD,MAAMC,UAAU,GAAGC,oBAAS,CAAC,IAAI,CAACZ,IAAI,CAACa,IAAI,CAAC;MAC5C,IAAIF,UAAU,IAAI,CAACA,UAAU,CAACJ,QAAQ,CAACC,QAAQ,CAAC,EAAE;QAC9C,OAAOG,UAAU,CAAC,CAAC,CAAC;MACxB;IACJ;IAEA,OAAO,EAAE;EACb;AACJ;AAACG,OAAA,CAAAhB,aAAA,GAAAA,aAAA"}
@@ -0,0 +1,11 @@
1
+ import { 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
+ }
@@ -0,0 +1,35 @@
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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _sanitizeFilename = _interopRequireDefault(require("sanitize-filename"));
10
+ var _FileExtension = require("./FileExtension");
11
+ class FileKey {
12
+ constructor(data) {
13
+ (0, _defineProperty2.default)(this, "data", void 0);
14
+ (0, _defineProperty2.default)(this, "extension", void 0);
15
+ (0, _defineProperty2.default)(this, "key", void 0);
16
+ this.data = data;
17
+ this.extension = new _FileExtension.FileExtension(data);
18
+ this.key = this.getSanitizedKey();
19
+ }
20
+ getExtension() {
21
+ return this.extension.getValue();
22
+ }
23
+ setKey(key) {
24
+ this.key = key;
25
+ return this;
26
+ }
27
+ toString() {
28
+ return [this.data.keyPrefix, this.data.id, this.key].filter(Boolean).join("/");
29
+ }
30
+ getSanitizedKey() {
31
+ const key = (0, _sanitizeFilename.default)(this.data.name).replace(/\s/g, "");
32
+ return [key, this.getExtension()].filter(Boolean).join(".");
33
+ }
34
+ }
35
+ exports.FileKey = FileKey;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_sanitizeFilename","_interopRequireDefault","require","_FileExtension","FileKey","constructor","data","_defineProperty2","default","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 { 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.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;IAAA,IAAAC,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA;IAAA,IAAAD,gBAAA,CAAAC,OAAA;IACxC,IAAI,CAACF,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACG,SAAS,GAAG,IAAIC,4BAAa,CAACJ,IAAI,CAAC;IACxC,IAAI,CAACK,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,CAACV,IAAI,CAACW,SAAS,EAAE,IAAI,CAACX,IAAI,CAACY,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,CAAChB,IAAI,CAACiB,IAAI,CAAC,CAACC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAE/D,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,CAAArB,OAAA,GAAAA,OAAA"}
@@ -0,0 +1,18 @@
1
+ import { FileData, PresignedPostPayloadData } from "../types";
2
+ import { 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,50 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.FileNormalizer = void 0;
8
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _utils = require("@webiny/utils");
11
+ var _FileKey = require("./FileKey");
12
+ /**
13
+ * FileNormalizer normalizes file data, before it's signed for upload to S3.
14
+ * It generates a unique file id, and makes sure that the file key includes the unique id.
15
+ *
16
+ */
17
+ class FileNormalizer {
18
+ constructor(modifier) {
19
+ (0, _defineProperty2.default)(this, "modifier", void 0);
20
+ this.modifier = modifier;
21
+ }
22
+ async normalizeFile(payload) {
23
+ const data = (0, _objectSpread2.default)((0, _objectSpread2.default)({}, payload), {}, {
24
+ id: payload.id || (0, _utils.mdbid)(),
25
+ type: payload.type || "application/octet-stream"
26
+ });
27
+ const key = new _FileKey.FileKey(data);
28
+ const defaultKey = key.toString();
29
+ const file = {
30
+ name: data.name,
31
+ type: data.type,
32
+ key: defaultKey,
33
+ size: data.size
34
+ };
35
+ if (this.modifier) {
36
+ Object.assign(file, await this.modifier(file));
37
+ }
38
+ if (defaultKey !== file.key) {
39
+ key.setKey(file.key);
40
+ }
41
+ return {
42
+ id: data.id,
43
+ key: key.toString(),
44
+ name: file.name,
45
+ size: file.size,
46
+ type: file.type
47
+ };
48
+ }
49
+ }
50
+ exports.FileNormalizer = FileNormalizer;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_utils","require","_FileKey","FileNormalizer","constructor","modifier","_defineProperty2","default","normalizeFile","payload","data","_objectSpread2","id","mdbid","type","key","FileKey","defaultKey","toString","file","name","size","Object","assign","setKey","exports"],"sources":["FileNormalizer.ts"],"sourcesContent":["import { mdbid } from \"@webiny/utils\";\nimport { FileData, PresignedPostPayloadData } from \"~/types\";\nimport { FileKey } from \"~/utils/FileKey\";\nimport { 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;IAAA,IAAAC,gBAAA,CAAAC,OAAA;IACjC,IAAI,CAACF,QAAQ,GAAGA,QAAQ;EAC5B;EAEA,MAAMG,aAAaA,CAACC,OAAiC,EAAqB;IACtE,MAAMC,IAAI,OAAAC,cAAA,CAAAJ,OAAA,MAAAI,cAAA,CAAAJ,OAAA,MACHE,OAAO;MACVG,EAAE,EAAEH,OAAO,CAACG,EAAE,IAAI,IAAAC,YAAK,EAAC,CAAC;MACzBC,IAAI,EAAEL,OAAO,CAACK,IAAI,IAAI;IAA0B,EACnD;IAED,MAAMC,GAAG,GAAG,IAAIC,gBAAO,CAACN,IAAI,CAAC;IAC7B,MAAMO,UAAU,GAAGF,GAAG,CAACG,QAAQ,CAAC,CAAC;IAEjC,MAAMC,IAAgB,GAAG;MACrBC,IAAI,EAAEV,IAAI,CAACU,IAAI;MACfN,IAAI,EAAEJ,IAAI,CAACI,IAAI;MACfC,GAAG,EAAEE,UAAU;MACfI,IAAI,EAAEX,IAAI,CAACW;IACf,CAAC;IAED,IAAI,IAAI,CAAChB,QAAQ,EAAE;MACfiB,MAAM,CAACC,MAAM,CAACJ,IAAI,EAAE,MAAM,IAAI,CAACd,QAAQ,CAACc,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,EAAEF,IAAI,CAACE,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,CAAAtB,cAAA,GAAAA,cAAA"}
@@ -0,0 +1,30 @@
1
+ import { Plugin } from "@webiny/plugins";
2
+ import { 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 {};
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.createModifierFromPlugins = exports.createFileUploadModifier = exports.FileUploadModifierPlugin = void 0;
8
+ var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _pReduce = _interopRequireDefault(require("p-reduce"));
11
+ var _plugins = require("@webiny/plugins");
12
+ class FileUploadModifier {
13
+ constructor() {
14
+ (0, _defineProperty2.default)(this, "fileSetters", []);
15
+ }
16
+ setFile(setter) {
17
+ this.fileSetters.push(setter);
18
+ }
19
+ execute(file) {
20
+ return (0, _pReduce.default)(this.fileSetters, async (file, setter) => {
21
+ // We need to spread the original file, then add (potentially) partial changes.
22
+ return (0, _objectSpread2.default)((0, _objectSpread2.default)({}, file), await setter(file));
23
+ }, file);
24
+ }
25
+ }
26
+ class FileUploadModifierPlugin extends _plugins.Plugin {
27
+ constructor(cb) {
28
+ super();
29
+ (0, _defineProperty2.default)(this, "cb", void 0);
30
+ this.cb = cb;
31
+ }
32
+ execute(params) {
33
+ return this.cb(params);
34
+ }
35
+ }
36
+ exports.FileUploadModifierPlugin = FileUploadModifierPlugin;
37
+ (0, _defineProperty2.default)(FileUploadModifierPlugin, "type", "fm.s3.uploadModifier");
38
+ const createFileUploadModifier = cb => {
39
+ return new FileUploadModifierPlugin(cb);
40
+ };
41
+ exports.createFileUploadModifier = createFileUploadModifier;
42
+ const createModifierFromPlugins = (plugins = []) => {
43
+ const modifier = new FileUploadModifier();
44
+ plugins.forEach(pl => pl.execute({
45
+ modifier
46
+ }));
47
+ return file => modifier.execute(file);
48
+ };
49
+ exports.createModifierFromPlugins = createModifierFromPlugins;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_pReduce","_interopRequireDefault","require","_plugins","FileUploadModifier","constructor","_defineProperty2","default","setFile","setter","fileSetters","push","execute","file","pReduce","_objectSpread2","FileUploadModifierPlugin","Plugin","cb","params","exports","createFileUploadModifier","createModifierFromPlugins","plugins","modifier","forEach","pl"],"sources":["FileUploadModifier.ts"],"sourcesContent":["import pReduce from \"p-reduce\";\nimport { Plugin } from \"@webiny/plugins\";\nimport { FileToSign } from \"~/utils/FileNormalizer\";\n\ninterface Setter<T> {\n (param: T): T;\n}\n\nclass FileUploadModifier {\n private fileSetters: Setter<FileToSign>[] = [];\n\n setFile(setter: Setter<FileToSign>): void {\n this.fileSetters.push(setter);\n }\n\n execute(file: FileToSign) {\n return pReduce(\n this.fileSetters,\n async (file, setter) => {\n // We need to spread the original file, then add (potentially) partial changes.\n return { ...file, ...(await setter(file)) };\n },\n file\n );\n }\n}\n\ninterface FileUploadModifierCallbackParams {\n modifier: {\n setFile: FileUploadModifier[\"setFile\"];\n };\n}\n\nexport class FileUploadModifierPlugin extends Plugin {\n public static override type = \"fm.s3.uploadModifier\";\n private readonly cb: FileUploadModifierCallable;\n\n constructor(cb: FileUploadModifierCallable) {\n super();\n this.cb = cb;\n }\n\n execute(params: FileUploadModifierCallbackParams) {\n return this.cb(params);\n }\n}\n\ninterface FileUploadModifierCallable {\n (params: FileUploadModifierCallbackParams): void;\n}\n\nexport const createFileUploadModifier = (cb: FileUploadModifierCallable) => {\n return new FileUploadModifierPlugin(cb);\n};\n\nexport interface FileModifier {\n (file: FileToSign): Promise<Partial<FileToSign>> | Partial<FileToSign>;\n}\n\nexport const createModifierFromPlugins = (\n plugins: FileUploadModifierPlugin[] = []\n): FileModifier => {\n const modifier = new FileUploadModifier();\n plugins.forEach(pl => pl.execute({ modifier }));\n\n return (file: FileToSign) => modifier.execute(file);\n};\n"],"mappings":";;;;;;;;;AAAA,IAAAA,QAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,QAAA,GAAAD,OAAA;AAOA,MAAME,kBAAkB,CAAC;EAAAC,YAAA;IAAA,IAAAC,gBAAA,CAAAC,OAAA,uBACuB,EAAE;EAAA;EAE9CC,OAAOA,CAACC,MAA0B,EAAQ;IACtC,IAAI,CAACC,WAAW,CAACC,IAAI,CAACF,MAAM,CAAC;EACjC;EAEAG,OAAOA,CAACC,IAAgB,EAAE;IACtB,OAAO,IAAAC,gBAAO,EACV,IAAI,CAACJ,WAAW,EAChB,OAAOG,IAAI,EAAEJ,MAAM,KAAK;MACpB;MACA,WAAAM,cAAA,CAAAR,OAAA,MAAAQ,cAAA,CAAAR,OAAA,MAAYM,IAAI,GAAM,MAAMJ,MAAM,CAACI,IAAI,CAAC;IAC5C,CAAC,EACDA,IACJ,CAAC;EACL;AACJ;AAQO,MAAMG,wBAAwB,SAASC,eAAM,CAAC;EAIjDZ,WAAWA,CAACa,EAA8B,EAAE;IACxC,KAAK,CAAC,CAAC;IAAC,IAAAZ,gBAAA,CAAAC,OAAA;IACR,IAAI,CAACW,EAAE,GAAGA,EAAE;EAChB;EAEAN,OAAOA,CAACO,MAAwC,EAAE;IAC9C,OAAO,IAAI,CAACD,EAAE,CAACC,MAAM,CAAC;EAC1B;AACJ;AAACC,OAAA,CAAAJ,wBAAA,GAAAA,wBAAA;AAAA,IAAAV,gBAAA,CAAAC,OAAA,EAZYS,wBAAwB,UACH,sBAAsB;AAiBjD,MAAMK,wBAAwB,GAAIH,EAA8B,IAAK;EACxE,OAAO,IAAIF,wBAAwB,CAACE,EAAE,CAAC;AAC3C,CAAC;AAACE,OAAA,CAAAC,wBAAA,GAAAA,wBAAA;AAMK,MAAMC,yBAAyB,GAAGA,CACrCC,OAAmC,GAAG,EAAE,KACzB;EACf,MAAMC,QAAQ,GAAG,IAAIpB,kBAAkB,CAAC,CAAC;EACzCmB,OAAO,CAACE,OAAO,CAACC,EAAE,IAAIA,EAAE,CAACd,OAAO,CAAC;IAAEY;EAAS,CAAC,CAAC,CAAC;EAE/C,OAAQX,IAAgB,IAAKW,QAAQ,CAACZ,OAAO,CAACC,IAAI,CAAC;AACvD,CAAC;AAACO,OAAA,CAAAE,yBAAA,GAAAA,yBAAA"}
@@ -0,0 +1,3 @@
1
+ import { Context } from "@webiny/api/types";
2
+ import { FileNormalizer } from "./FileNormalizer";
3
+ export declare const createFileNormalizerFromContext: (context: Context) => FileNormalizer;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createFileNormalizerFromContext = void 0;
7
+ var _FileNormalizer = require("./FileNormalizer");
8
+ var _FileUploadModifier = require("./FileUploadModifier");
9
+ const createFileNormalizerFromContext = context => {
10
+ const modifierPlugins = context.plugins.byType(_FileUploadModifier.FileUploadModifierPlugin.type);
11
+ return new _FileNormalizer.FileNormalizer((0, _FileUploadModifier.createModifierFromPlugins)(modifierPlugins));
12
+ };
13
+ exports.createFileNormalizerFromContext = createFileNormalizerFromContext;
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_FileNormalizer","require","_FileUploadModifier","createFileNormalizerFromContext","context","modifierPlugins","plugins","byType","FileUploadModifierPlugin","type","FileNormalizer","createModifierFromPlugins","exports"],"sources":["createFileNormalizerFromContext.ts"],"sourcesContent":["import { Context } from \"@webiny/api/types\";\nimport { FileNormalizer } from \"~/utils/FileNormalizer\";\nimport { createModifierFromPlugins, FileUploadModifierPlugin } from \"~/utils/FileUploadModifier\";\n\nexport const createFileNormalizerFromContext = (context: Context) => {\n const modifierPlugins = context.plugins.byType<FileUploadModifierPlugin>(\n FileUploadModifierPlugin.type\n );\n\n return new FileNormalizer(createModifierFromPlugins(modifierPlugins));\n};\n"],"mappings":";;;;;;AACA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,mBAAA,GAAAD,OAAA;AAEO,MAAME,+BAA+B,GAAIC,OAAgB,IAAK;EACjE,MAAMC,eAAe,GAAGD,OAAO,CAACE,OAAO,CAACC,MAAM,CAC1CC,4CAAwB,CAACC,IAC7B,CAAC;EAED,OAAO,IAAIC,8BAAc,CAAC,IAAAC,6CAAyB,EAACN,eAAe,CAAC,CAAC;AACzE,CAAC;AAACO,OAAA,CAAAT,+BAAA,GAAAA,+BAAA"}
@@ -1,3 +1,3 @@
1
1
  import { FileManagerSettings } from "@webiny/api-file-manager/types";
2
- import { PresignedPostPayloadData, PresignedPostPayloadDataResponse } from "../types";
3
- export declare const getPresignedPostPayload: (data: PresignedPostPayloadData, settings: FileManagerSettings) => PresignedPostPayloadDataResponse;
2
+ import { FileData, PresignedPostPayloadDataResponse } from "../types";
3
+ export declare const getPresignedPostPayload: (file: FileData, settings: FileManagerSettings) => PresignedPostPayloadDataResponse;
@@ -7,7 +7,6 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.getPresignedPostPayload = void 0;
8
8
  var _s = _interopRequireDefault(require("aws-sdk/clients/s3"));
9
9
  var _validation = require("@webiny/validation");
10
- var _prepareFileData = require("./prepareFileData");
11
10
  const S3_BUCKET = process.env.S3_BUCKET;
12
11
  const UPLOAD_MAX_FILE_SIZE_DEFAULT = 1099511627776; // 1TB
13
12
 
@@ -20,8 +19,7 @@ const sanitizeFileSizeValue = (value, defaultValue) => {
20
19
  return defaultValue;
21
20
  }
22
21
  };
23
- const getPresignedPostPayload = (data, settings) => {
24
- const file = (0, _prepareFileData.prepareFileData)(data);
22
+ const getPresignedPostPayload = (file, settings) => {
25
23
  const uploadMinFileSize = sanitizeFileSizeValue(settings.uploadMinFileSize, 0);
26
24
  const uploadMaxFileSize = sanitizeFileSizeValue(settings.uploadMaxFileSize, UPLOAD_MAX_FILE_SIZE_DEFAULT);
27
25
  const params = {
@@ -1 +1 @@
1
- {"version":3,"names":["S3_BUCKET","process","env","UPLOAD_MAX_FILE_SIZE_DEFAULT","sanitizeFileSizeValue","value","defaultValue","validation","validateSync","e","getPresignedPostPayload","data","settings","file","prepareFileData","uploadMinFileSize","uploadMaxFileSize","params","Expires","Bucket","Conditions","Fields","type","key","startsWith","slice","s3","S3","payload","createPresignedPost"],"sources":["getPresignedPostPayload.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\nimport { validation } from \"@webiny/validation\";\nimport { FileManagerSettings } from \"@webiny/api-file-manager/types\";\nimport { prepareFileData } from \"~/utils/prepareFileData\";\nimport { PresignedPostPayloadData, PresignedPostPayloadDataResponse } from \"~/types\";\n\nconst S3_BUCKET = process.env.S3_BUCKET;\nconst UPLOAD_MAX_FILE_SIZE_DEFAULT = 1099511627776; // 1TB\n\nconst sanitizeFileSizeValue = (value: number, defaultValue: number): number => {\n try {\n validation.validateSync(value, \"required,numeric,gte:0\");\n return value;\n } catch (e) {\n // TODO @ts-refactor No need to log the error?\n return defaultValue;\n }\n};\n\nexport const getPresignedPostPayload = (\n data: PresignedPostPayloadData,\n settings: FileManagerSettings\n): PresignedPostPayloadDataResponse => {\n const file = prepareFileData(data);\n\n const uploadMinFileSize = sanitizeFileSizeValue(settings.uploadMinFileSize, 0);\n const uploadMaxFileSize = sanitizeFileSizeValue(\n settings.uploadMaxFileSize,\n UPLOAD_MAX_FILE_SIZE_DEFAULT\n );\n\n const params = {\n Expires: 60,\n Bucket: S3_BUCKET,\n Conditions: [[\"content-length-range\", uploadMinFileSize, uploadMaxFileSize]],\n Fields: {\n \"Content-Type\": file.type,\n key: file.key\n }\n };\n\n if (params.Fields.key.startsWith(\"/\")) {\n params.Fields.key = params.Fields.key.slice(1);\n }\n\n const s3 = new S3();\n const payload = s3.createPresignedPost(params);\n\n return {\n data: payload,\n file\n };\n};\n"],"mappings":";;;;;;;AAAA;AACA;AAEA;AAGA,MAAMA,SAAS,GAAGC,OAAO,CAACC,GAAG,CAACF,SAAS;AACvC,MAAMG,4BAA4B,GAAG,aAAa,CAAC,CAAC;;AAEpD,MAAMC,qBAAqB,GAAG,CAACC,KAAa,EAAEC,YAAoB,KAAa;EAC3E,IAAI;IACAC,sBAAU,CAACC,YAAY,CAACH,KAAK,EAAE,wBAAwB,CAAC;IACxD,OAAOA,KAAK;EAChB,CAAC,CAAC,OAAOI,CAAC,EAAE;IACR;IACA,OAAOH,YAAY;EACvB;AACJ,CAAC;AAEM,MAAMI,uBAAuB,GAAG,CACnCC,IAA8B,EAC9BC,QAA6B,KACM;EACnC,MAAMC,IAAI,GAAG,IAAAC,gCAAe,EAACH,IAAI,CAAC;EAElC,MAAMI,iBAAiB,GAAGX,qBAAqB,CAACQ,QAAQ,CAACG,iBAAiB,EAAE,CAAC,CAAC;EAC9E,MAAMC,iBAAiB,GAAGZ,qBAAqB,CAC3CQ,QAAQ,CAACI,iBAAiB,EAC1Bb,4BAA4B,CAC/B;EAED,MAAMc,MAAM,GAAG;IACXC,OAAO,EAAE,EAAE;IACXC,MAAM,EAAEnB,SAAS;IACjBoB,UAAU,EAAE,CAAC,CAAC,sBAAsB,EAAEL,iBAAiB,EAAEC,iBAAiB,CAAC,CAAC;IAC5EK,MAAM,EAAE;MACJ,cAAc,EAAER,IAAI,CAACS,IAAI;MACzBC,GAAG,EAAEV,IAAI,CAACU;IACd;EACJ,CAAC;EAED,IAAIN,MAAM,CAACI,MAAM,CAACE,GAAG,CAACC,UAAU,CAAC,GAAG,CAAC,EAAE;IACnCP,MAAM,CAACI,MAAM,CAACE,GAAG,GAAGN,MAAM,CAACI,MAAM,CAACE,GAAG,CAACE,KAAK,CAAC,CAAC,CAAC;EAClD;EAEA,MAAMC,EAAE,GAAG,IAAIC,UAAE,EAAE;EACnB,MAAMC,OAAO,GAAGF,EAAE,CAACG,mBAAmB,CAACZ,MAAM,CAAC;EAE9C,OAAO;IACHN,IAAI,EAAEiB,OAAO;IACbf;EACJ,CAAC;AACL,CAAC;AAAC"}
1
+ {"version":3,"names":["_s","_interopRequireDefault","require","_validation","S3_BUCKET","process","env","UPLOAD_MAX_FILE_SIZE_DEFAULT","sanitizeFileSizeValue","value","defaultValue","validation","validateSync","e","getPresignedPostPayload","file","settings","uploadMinFileSize","uploadMaxFileSize","params","Expires","Bucket","Conditions","Fields","type","key","startsWith","slice","s3","S3","payload","createPresignedPost","data","exports"],"sources":["getPresignedPostPayload.ts"],"sourcesContent":["import S3 from \"aws-sdk/clients/s3\";\nimport { validation } from \"@webiny/validation\";\nimport { FileManagerSettings } from \"@webiny/api-file-manager/types\";\nimport { FileData, PresignedPostPayloadDataResponse } from \"~/types\";\n\nconst S3_BUCKET = process.env.S3_BUCKET;\nconst UPLOAD_MAX_FILE_SIZE_DEFAULT = 1099511627776; // 1TB\n\nconst sanitizeFileSizeValue = (value: number, defaultValue: number): number => {\n try {\n validation.validateSync(value, \"required,numeric,gte:0\");\n return value;\n } catch (e) {\n // TODO @ts-refactor No need to log the error?\n return defaultValue;\n }\n};\n\nexport const getPresignedPostPayload = (\n file: FileData,\n settings: FileManagerSettings\n): PresignedPostPayloadDataResponse => {\n const uploadMinFileSize = sanitizeFileSizeValue(settings.uploadMinFileSize, 0);\n const uploadMaxFileSize = sanitizeFileSizeValue(\n settings.uploadMaxFileSize,\n UPLOAD_MAX_FILE_SIZE_DEFAULT\n );\n\n const params = {\n Expires: 60,\n Bucket: S3_BUCKET,\n Conditions: [[\"content-length-range\", uploadMinFileSize, uploadMaxFileSize]],\n Fields: {\n \"Content-Type\": file.type,\n key: file.key\n }\n };\n\n if (params.Fields.key.startsWith(\"/\")) {\n params.Fields.key = params.Fields.key.slice(1);\n }\n\n const s3 = new S3();\n const payload = s3.createPresignedPost(params);\n\n return {\n data: payload,\n file\n };\n};\n"],"mappings":";;;;;;;AAAA,IAAAA,EAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,WAAA,GAAAD,OAAA;AAIA,MAAME,SAAS,GAAGC,OAAO,CAACC,GAAG,CAACF,SAAS;AACvC,MAAMG,4BAA4B,GAAG,aAAa,CAAC,CAAC;;AAEpD,MAAMC,qBAAqB,GAAGA,CAACC,KAAa,EAAEC,YAAoB,KAAa;EAC3E,IAAI;IACAC,sBAAU,CAACC,YAAY,CAACH,KAAK,EAAE,wBAAwB,CAAC;IACxD,OAAOA,KAAK;EAChB,CAAC,CAAC,OAAOI,CAAC,EAAE;IACR;IACA,OAAOH,YAAY;EACvB;AACJ,CAAC;AAEM,MAAMI,uBAAuB,GAAGA,CACnCC,IAAc,EACdC,QAA6B,KACM;EACnC,MAAMC,iBAAiB,GAAGT,qBAAqB,CAACQ,QAAQ,CAACC,iBAAiB,EAAE,CAAC,CAAC;EAC9E,MAAMC,iBAAiB,GAAGV,qBAAqB,CAC3CQ,QAAQ,CAACE,iBAAiB,EAC1BX,4BACJ,CAAC;EAED,MAAMY,MAAM,GAAG;IACXC,OAAO,EAAE,EAAE;IACXC,MAAM,EAAEjB,SAAS;IACjBkB,UAAU,EAAE,CAAC,CAAC,sBAAsB,EAAEL,iBAAiB,EAAEC,iBAAiB,CAAC,CAAC;IAC5EK,MAAM,EAAE;MACJ,cAAc,EAAER,IAAI,CAACS,IAAI;MACzBC,GAAG,EAAEV,IAAI,CAACU;IACd;EACJ,CAAC;EAED,IAAIN,MAAM,CAACI,MAAM,CAACE,GAAG,CAACC,UAAU,CAAC,GAAG,CAAC,EAAE;IACnCP,MAAM,CAACI,MAAM,CAACE,GAAG,GAAGN,MAAM,CAACI,MAAM,CAACE,GAAG,CAACE,KAAK,CAAC,CAAC,CAAC;EAClD;EAEA,MAAMC,EAAE,GAAG,IAAIC,UAAE,CAAC,CAAC;EACnB,MAAMC,OAAO,GAAGF,EAAE,CAACG,mBAAmB,CAACZ,MAAM,CAAC;EAE9C,OAAO;IACHa,IAAI,EAAEF,OAAO;IACbf;EACJ,CAAC;AACL,CAAC;AAACkB,OAAA,CAAAnB,uBAAA,GAAAA,uBAAA"}
@@ -1 +1 @@
1
- {"version":3,"names":["mimeTypes","vendorTypes","standardTypes"],"sources":["mimeTypes.ts"],"sourcesContent":["// @ts-ignore\nimport vendorTypes from \"mime/types/other\";\n// @ts-ignore\nimport standardTypes from \"mime/types/standard\";\n\n/**\n * We need to get all extensions that are defined for a specific content type.\n * This operation is not available via the `mime` package, so we create such an object ourselves.\n */\nexport const mimeTypes: Record<string, string[]> = {\n ...vendorTypes,\n ...standardTypes\n};\n"],"mappings":";;;;;;;;AACA;AAEA;AAHA;;AAEA;;AAGA;AACA;AACA;AACA;AACO,MAAMA,SAAmC,+DACzCC,cAAW,GACXC,iBAAa,CACnB;AAAC"}
1
+ {"version":3,"names":["_other","_interopRequireDefault","require","_standard","mimeTypes","_objectSpread2","default","vendorTypes","standardTypes","exports"],"sources":["mimeTypes.ts"],"sourcesContent":["// @ts-ignore\nimport vendorTypes from \"mime/types/other\";\n// @ts-ignore\nimport standardTypes from \"mime/types/standard\";\n\n/**\n * We need to get all extensions that are defined for a specific content type.\n * This operation is not available via the `mime` package, so we create such an object ourselves.\n */\nexport const mimeTypes: Record<string, string[]> = {\n ...vendorTypes,\n ...standardTypes\n};\n"],"mappings":";;;;;;;;AACA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,SAAA,GAAAF,sBAAA,CAAAC,OAAA;AAHA;;AAEA;;AAGA;AACA;AACA;AACA;AACO,MAAME,SAAmC,OAAAC,cAAA,CAAAC,OAAA,MAAAD,cAAA,CAAAC,OAAA,MACzCC,cAAW,GACXC,iBAAa,CACnB;AAACC,OAAA,CAAAL,SAAA,GAAAA,SAAA"}
@@ -1 +1 @@
1
- {"version":3,"names":["buffer","preSignedPostPayload","formData","FormData","Object","keys","fields","forEach","key","append","fetch","url","method","body"],"sources":["uploadFileToS3.ts"],"sourcesContent":["import FormData from \"form-data\";\nimport fetch, { Response } from \"node-fetch\";\nimport S3 from \"aws-sdk/clients/s3\";\n\nexport default async (\n buffer: Buffer,\n preSignedPostPayload: S3.PresignedPost\n): Promise<Response> => {\n const formData = new FormData();\n // Add all pre signed payload field to \"FormData\".\n Object.keys(preSignedPostPayload.fields).forEach(key => {\n formData.append(key, preSignedPostPayload.fields[key]);\n });\n // Add file content to \"FormData\".\n formData.append(\"file\", buffer);\n // Finally make the upload request to S3.\n return fetch(preSignedPostPayload.url, {\n method: \"POST\",\n body: formData\n });\n};\n"],"mappings":";;;;;;;AAAA;AACA;AAA6C,eAG9B,OACXA,MAAc,EACdC,oBAAsC,KAClB;EACpB,MAAMC,QAAQ,GAAG,IAAIC,iBAAQ,EAAE;EAC/B;EACAC,MAAM,CAACC,IAAI,CAACJ,oBAAoB,CAACK,MAAM,CAAC,CAACC,OAAO,CAACC,GAAG,IAAI;IACpDN,QAAQ,CAACO,MAAM,CAACD,GAAG,EAAEP,oBAAoB,CAACK,MAAM,CAACE,GAAG,CAAC,CAAC;EAC1D,CAAC,CAAC;EACF;EACAN,QAAQ,CAACO,MAAM,CAAC,MAAM,EAAET,MAAM,CAAC;EAC/B;EACA,OAAO,IAAAU,kBAAK,EAACT,oBAAoB,CAACU,GAAG,EAAE;IACnCC,MAAM,EAAE,MAAM;IACdC,IAAI,EAAEX;EACV,CAAC,CAAC;AACN,CAAC;AAAA"}
1
+ {"version":3,"names":["_formData","_interopRequireDefault","require","_nodeFetch","_default","buffer","preSignedPostPayload","formData","FormData","Object","keys","fields","forEach","key","append","fetch","url","method","body","exports","default"],"sources":["uploadFileToS3.ts"],"sourcesContent":["import FormData from \"form-data\";\nimport fetch, { Response } from \"node-fetch\";\nimport S3 from \"aws-sdk/clients/s3\";\n\nexport default async (\n buffer: Buffer,\n preSignedPostPayload: S3.PresignedPost\n): Promise<Response> => {\n const formData = new FormData();\n // Add all pre signed payload field to \"FormData\".\n Object.keys(preSignedPostPayload.fields).forEach(key => {\n formData.append(key, preSignedPostPayload.fields[key]);\n });\n // Add file content to \"FormData\".\n formData.append(\"file\", buffer);\n // Finally make the upload request to S3.\n return fetch(preSignedPostPayload.url, {\n method: \"POST\",\n body: formData\n });\n};\n"],"mappings":";;;;;;;AAAA,IAAAA,SAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,UAAA,GAAAF,sBAAA,CAAAC,OAAA;AAA6C,IAAAE,QAAA,GAG9B,MAAAA,CACXC,MAAc,EACdC,oBAAsC,KAClB;EACpB,MAAMC,QAAQ,GAAG,IAAIC,iBAAQ,CAAC,CAAC;EAC/B;EACAC,MAAM,CAACC,IAAI,CAACJ,oBAAoB,CAACK,MAAM,CAAC,CAACC,OAAO,CAACC,GAAG,IAAI;IACpDN,QAAQ,CAACO,MAAM,CAACD,GAAG,EAAEP,oBAAoB,CAACK,MAAM,CAACE,GAAG,CAAC,CAAC;EAC1D,CAAC,CAAC;EACF;EACAN,QAAQ,CAACO,MAAM,CAAC,MAAM,EAAET,MAAM,CAAC;EAC/B;EACA,OAAO,IAAAU,kBAAK,EAACT,oBAAoB,CAACU,GAAG,EAAE;IACnCC,MAAM,EAAE,MAAM;IACdC,IAAI,EAAEX;EACV,CAAC,CAAC;AACN,CAAC;AAAAY,OAAA,CAAAC,OAAA,GAAAhB,QAAA"}
@@ -1,5 +0,0 @@
1
- import { GetPermission } from "@webiny/api-security/types";
2
- import { FilePermission } from "@webiny/api-file-manager/types";
3
- export declare const checkBasePermissions: (getPermission: GetPermission, check?: {
4
- rwd?: string;
5
- }) => Promise<FilePermission>;
@@ -1,24 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.checkBasePermissions = void 0;
7
- var _apiSecurity = require("@webiny/api-security");
8
- const checkBasePermissions = async (getPermission, check = {}) => {
9
- const filePermission = await getPermission("fm.file");
10
- if (!filePermission) {
11
- throw new _apiSecurity.NotAuthorizedError();
12
- }
13
- if (check.rwd && !hasRwd(filePermission, check.rwd)) {
14
- throw new _apiSecurity.NotAuthorizedError();
15
- }
16
- return filePermission;
17
- };
18
- exports.checkBasePermissions = checkBasePermissions;
19
- const hasRwd = (filesFilePermission, rwd) => {
20
- if (typeof filesFilePermission.rwd !== "string") {
21
- return true;
22
- }
23
- return filesFilePermission.rwd.includes(rwd);
24
- };
@@ -1 +0,0 @@
1
- {"version":3,"names":["checkBasePermissions","getPermission","check","filePermission","NotAuthorizedError","rwd","hasRwd","filesFilePermission","includes"],"sources":["checkBasePermissions.ts"],"sourcesContent":["import { NotAuthorizedError } from \"@webiny/api-security\";\nimport { GetPermission } from \"@webiny/api-security/types\";\nimport { FilePermission } from \"@webiny/api-file-manager/types\";\n\nexport const checkBasePermissions = async (\n getPermission: GetPermission,\n check: { rwd?: string } = {}\n): Promise<FilePermission> => {\n const filePermission = await getPermission<FilePermission>(\"fm.file\");\n\n if (!filePermission) {\n throw new NotAuthorizedError();\n }\n if (check.rwd && !hasRwd(filePermission, check.rwd)) {\n throw new NotAuthorizedError();\n }\n\n return filePermission;\n};\n\nconst hasRwd = (filesFilePermission: FilePermission, rwd: string): boolean => {\n if (typeof filesFilePermission.rwd !== \"string\") {\n return true;\n }\n\n return filesFilePermission.rwd.includes(rwd);\n};\n"],"mappings":";;;;;;AAAA;AAIO,MAAMA,oBAAoB,GAAG,OAChCC,aAA4B,EAC5BC,KAAuB,GAAG,CAAC,CAAC,KACF;EAC1B,MAAMC,cAAc,GAAG,MAAMF,aAAa,CAAiB,SAAS,CAAC;EAErE,IAAI,CAACE,cAAc,EAAE;IACjB,MAAM,IAAIC,+BAAkB,EAAE;EAClC;EACA,IAAIF,KAAK,CAACG,GAAG,IAAI,CAACC,MAAM,CAACH,cAAc,EAAED,KAAK,CAACG,GAAG,CAAC,EAAE;IACjD,MAAM,IAAID,+BAAkB,EAAE;EAClC;EAEA,OAAOD,cAAc;AACzB,CAAC;AAAC;AAEF,MAAMG,MAAM,GAAG,CAACC,mBAAmC,EAAEF,GAAW,KAAc;EAC1E,IAAI,OAAOE,mBAAmB,CAACF,GAAG,KAAK,QAAQ,EAAE;IAC7C,OAAO,IAAI;EACf;EAEA,OAAOE,mBAAmB,CAACF,GAAG,CAACG,QAAQ,CAACH,GAAG,CAAC;AAChD,CAAC"}
@@ -1,4 +0,0 @@
1
- import { FileManagerContext, FilePermission } from "@webiny/api-file-manager/types";
2
- export declare const checkPermission: (context: FileManagerContext, check?: {
3
- rwd?: string;
4
- }) => Promise<FilePermission>;
@@ -1,25 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.checkPermission = void 0;
7
- var _apiSecurity = require("@webiny/api-security");
8
- const checkPermission = async (context, check = {}) => {
9
- await context.i18n.checkI18NContentPermission();
10
- const filePermission = await context.security.getPermission("fm.file");
11
- if (!filePermission) {
12
- throw new _apiSecurity.NotAuthorizedError();
13
- }
14
- if (check.rwd && !hasRwd(filePermission, check.rwd)) {
15
- throw new _apiSecurity.NotAuthorizedError();
16
- }
17
- return filePermission;
18
- };
19
- exports.checkPermission = checkPermission;
20
- const hasRwd = (filesFilePermission, rwd) => {
21
- if (typeof filesFilePermission.rwd !== "string") {
22
- return true;
23
- }
24
- return filesFilePermission.rwd.includes(rwd);
25
- };
@@ -1 +0,0 @@
1
- {"version":3,"names":["checkPermission","context","check","i18n","checkI18NContentPermission","filePermission","security","getPermission","NotAuthorizedError","rwd","hasRwd","filesFilePermission","includes"],"sources":["checkPermission.ts"],"sourcesContent":["import { FileManagerContext, FilePermission } from \"@webiny/api-file-manager/types\";\nimport { NotAuthorizedError } from \"@webiny/api-security\";\n\nexport const checkPermission = async (\n context: FileManagerContext,\n check: { rwd?: string } = {}\n) => {\n await context.i18n.checkI18NContentPermission();\n\n const filePermission = await context.security.getPermission<FilePermission>(\"fm.file\");\n\n if (!filePermission) {\n throw new NotAuthorizedError();\n }\n if (check.rwd && !hasRwd(filePermission, check.rwd)) {\n throw new NotAuthorizedError();\n }\n\n return filePermission;\n};\n\nconst hasRwd = (filesFilePermission: FilePermission, rwd: string): boolean => {\n if (typeof filesFilePermission.rwd !== \"string\") {\n return true;\n }\n\n return filesFilePermission.rwd.includes(rwd);\n};\n"],"mappings":";;;;;;AACA;AAEO,MAAMA,eAAe,GAAG,OAC3BC,OAA2B,EAC3BC,KAAuB,GAAG,CAAC,CAAC,KAC3B;EACD,MAAMD,OAAO,CAACE,IAAI,CAACC,0BAA0B,EAAE;EAE/C,MAAMC,cAAc,GAAG,MAAMJ,OAAO,CAACK,QAAQ,CAACC,aAAa,CAAiB,SAAS,CAAC;EAEtF,IAAI,CAACF,cAAc,EAAE;IACjB,MAAM,IAAIG,+BAAkB,EAAE;EAClC;EACA,IAAIN,KAAK,CAACO,GAAG,IAAI,CAACC,MAAM,CAACL,cAAc,EAAEH,KAAK,CAACO,GAAG,CAAC,EAAE;IACjD,MAAM,IAAID,+BAAkB,EAAE;EAClC;EAEA,OAAOH,cAAc;AACzB,CAAC;AAAC;AAEF,MAAMK,MAAM,GAAG,CAACC,mBAAmC,EAAEF,GAAW,KAAc;EAC1E,IAAI,OAAOE,mBAAmB,CAACF,GAAG,KAAK,QAAQ,EAAE;IAC7C,OAAO,IAAI;EACf;EAEA,OAAOE,mBAAmB,CAACF,GAAG,CAACG,QAAQ,CAACH,GAAG,CAAC;AAChD,CAAC"}
@@ -1,2 +0,0 @@
1
- import { PresignedPostPayloadData, FileData } from "../types";
2
- export declare const prepareFileData: (data: PresignedPostPayloadData) => FileData;
@@ -1,62 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
4
- Object.defineProperty(exports, "__esModule", {
5
- value: true
6
- });
7
- exports.prepareFileData = void 0;
8
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
- var _sanitizeFilename = _interopRequireDefault(require("sanitize-filename"));
10
- var _utils = require("@webiny/utils");
11
- var _mimeTypes = require("./mimeTypes");
12
- class FileKey {
13
- constructor(name, type) {
14
- (0, _defineProperty2.default)(this, "name", void 0);
15
- (0, _defineProperty2.default)(this, "type", void 0);
16
- (0, _defineProperty2.default)(this, "prefix", void 0);
17
- (0, _defineProperty2.default)(this, "id", void 0);
18
- (0, _defineProperty2.default)(this, "extension", "");
19
- this.type = type;
20
- this.name = name;
21
- }
22
- setId(id) {
23
- if (!this.name.startsWith(`${id}/`)) {
24
- this.id = id;
25
- }
26
- }
27
- setPrefix(prefix) {
28
- this.prefix = prefix;
29
- }
30
- getKey() {
31
- const key = (0, _sanitizeFilename.default)(this.name).replace(/\s/g, "");
32
- const maybeHasExtension = key.toLowerCase().includes(".");
33
- if (maybeHasExtension) {
34
- const maybeExt = key.toLowerCase().split(".").pop();
35
- const extensions = _mimeTypes.mimeTypes[this.type];
36
- if (extensions && !extensions.includes(maybeExt)) {
37
- this.extension = extensions[0];
38
- }
39
- }
40
- const keyWithExt = [key, this.extension].filter(Boolean).join(".");
41
- return [this.prefix, this.id, keyWithExt].filter(Boolean).join("/");
42
- }
43
- }
44
- const prepareFileData = data => {
45
- // If type is missing, let's use the default "application/octet-stream" type,
46
- // which is also the default type that the Amazon S3 would use.
47
- const contentType = data.type || "application/octet-stream";
48
- const id = data.id || (0, _utils.mdbid)();
49
- const key = new FileKey(data.key || data.name, data.type);
50
- key.setId(id);
51
- if (data.keyPrefix) {
52
- key.setPrefix(data.keyPrefix);
53
- }
54
- return {
55
- id,
56
- name: data.name,
57
- key: key.getKey(),
58
- type: contentType,
59
- size: data.size
60
- };
61
- };
62
- exports.prepareFileData = prepareFileData;
@@ -1 +0,0 @@
1
- {"version":3,"names":["FileKey","constructor","name","type","setId","id","startsWith","setPrefix","prefix","getKey","key","sanitizeFilename","replace","maybeHasExtension","toLowerCase","includes","maybeExt","split","pop","extensions","mimeTypes","extension","keyWithExt","filter","Boolean","join","prepareFileData","data","contentType","mdbid","keyPrefix","size"],"sources":["prepareFileData.ts"],"sourcesContent":["import sanitizeFilename from \"sanitize-filename\";\nimport { mdbid } from \"@webiny/utils\";\nimport { PresignedPostPayloadData, FileData } from \"~/types\";\nimport { mimeTypes } from \"./mimeTypes\";\n\nclass FileKey {\n private readonly name: string;\n private readonly type: string;\n private prefix: string | undefined;\n private id: string | undefined;\n private extension = \"\";\n\n constructor(name: string, type: string) {\n this.type = type;\n this.name = name;\n }\n\n setId(id: string) {\n if (!this.name.startsWith(`${id}/`)) {\n this.id = id;\n }\n }\n\n setPrefix(prefix: string) {\n this.prefix = prefix;\n }\n\n getKey() {\n const key = sanitizeFilename(this.name).replace(/\\s/g, \"\");\n const maybeHasExtension = key.toLowerCase().includes(\".\");\n\n if (maybeHasExtension) {\n const maybeExt = key.toLowerCase().split(\".\").pop() as string;\n const extensions = mimeTypes[this.type];\n if (extensions && !extensions.includes(maybeExt)) {\n this.extension = extensions[0];\n }\n }\n\n const keyWithExt = [key, this.extension].filter(Boolean).join(\".\");\n return [this.prefix, this.id, keyWithExt].filter(Boolean).join(\"/\");\n }\n}\n\nexport const prepareFileData = (data: PresignedPostPayloadData): FileData => {\n // If type is missing, let's use the default \"application/octet-stream\" type,\n // which is also the default type that the Amazon S3 would use.\n const contentType = data.type || \"application/octet-stream\";\n\n const id = data.id || mdbid();\n const key = new FileKey(data.key || data.name, data.type);\n\n key.setId(id);\n\n if (data.keyPrefix) {\n key.setPrefix(data.keyPrefix);\n }\n\n return {\n id,\n name: data.name,\n key: key.getKey(),\n type: contentType,\n size: data.size\n };\n};\n"],"mappings":";;;;;;;;AAAA;AACA;AAEA;AAEA,MAAMA,OAAO,CAAC;EAOVC,WAAW,CAACC,IAAY,EAAEC,IAAY,EAAE;IAAA;IAAA;IAAA;IAAA;IAAA,iDAFpB,EAAE;IAGlB,IAAI,CAACA,IAAI,GAAGA,IAAI;IAChB,IAAI,CAACD,IAAI,GAAGA,IAAI;EACpB;EAEAE,KAAK,CAACC,EAAU,EAAE;IACd,IAAI,CAAC,IAAI,CAACH,IAAI,CAACI,UAAU,CAAE,GAAED,EAAG,GAAE,CAAC,EAAE;MACjC,IAAI,CAACA,EAAE,GAAGA,EAAE;IAChB;EACJ;EAEAE,SAAS,CAACC,MAAc,EAAE;IACtB,IAAI,CAACA,MAAM,GAAGA,MAAM;EACxB;EAEAC,MAAM,GAAG;IACL,MAAMC,GAAG,GAAG,IAAAC,yBAAgB,EAAC,IAAI,CAACT,IAAI,CAAC,CAACU,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAC1D,MAAMC,iBAAiB,GAAGH,GAAG,CAACI,WAAW,EAAE,CAACC,QAAQ,CAAC,GAAG,CAAC;IAEzD,IAAIF,iBAAiB,EAAE;MACnB,MAAMG,QAAQ,GAAGN,GAAG,CAACI,WAAW,EAAE,CAACG,KAAK,CAAC,GAAG,CAAC,CAACC,GAAG,EAAY;MAC7D,MAAMC,UAAU,GAAGC,oBAAS,CAAC,IAAI,CAACjB,IAAI,CAAC;MACvC,IAAIgB,UAAU,IAAI,CAACA,UAAU,CAACJ,QAAQ,CAACC,QAAQ,CAAC,EAAE;QAC9C,IAAI,CAACK,SAAS,GAAGF,UAAU,CAAC,CAAC,CAAC;MAClC;IACJ;IAEA,MAAMG,UAAU,GAAG,CAACZ,GAAG,EAAE,IAAI,CAACW,SAAS,CAAC,CAACE,MAAM,CAACC,OAAO,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC;IAClE,OAAO,CAAC,IAAI,CAACjB,MAAM,EAAE,IAAI,CAACH,EAAE,EAAEiB,UAAU,CAAC,CAACC,MAAM,CAACC,OAAO,CAAC,CAACC,IAAI,CAAC,GAAG,CAAC;EACvE;AACJ;AAEO,MAAMC,eAAe,GAAIC,IAA8B,IAAe;EACzE;EACA;EACA,MAAMC,WAAW,GAAGD,IAAI,CAACxB,IAAI,IAAI,0BAA0B;EAE3D,MAAME,EAAE,GAAGsB,IAAI,CAACtB,EAAE,IAAI,IAAAwB,YAAK,GAAE;EAC7B,MAAMnB,GAAG,GAAG,IAAIV,OAAO,CAAC2B,IAAI,CAACjB,GAAG,IAAIiB,IAAI,CAACzB,IAAI,EAAEyB,IAAI,CAACxB,IAAI,CAAC;EAEzDO,GAAG,CAACN,KAAK,CAACC,EAAE,CAAC;EAEb,IAAIsB,IAAI,CAACG,SAAS,EAAE;IAChBpB,GAAG,CAACH,SAAS,CAACoB,IAAI,CAACG,SAAS,CAAC;EACjC;EAEA,OAAO;IACHzB,EAAE;IACFH,IAAI,EAAEyB,IAAI,CAACzB,IAAI;IACfQ,GAAG,EAAEA,GAAG,CAACD,MAAM,EAAE;IACjBN,IAAI,EAAEyB,WAAW;IACjBG,IAAI,EAAEJ,IAAI,CAACI;EACf,CAAC;AACL,CAAC;AAAC"}