@webiny/api-file-manager-s3 0.0.0-unstable.c59b9cc5b9 → 0.0.0-unstable.c7dec08bb0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/api-file-manager-s3",
3
- "version": "0.0.0-unstable.c59b9cc5b9",
3
+ "version": "0.0.0-unstable.c7dec08bb0",
4
4
  "main": "index.js",
5
5
  "repository": {
6
6
  "type": "git",
@@ -10,12 +10,12 @@
10
10
  "author": "Webiny Ltd",
11
11
  "license": "MIT",
12
12
  "dependencies": {
13
- "@webiny/api-file-manager": "0.0.0-unstable.c59b9cc5b9",
14
- "@webiny/api-security": "0.0.0-unstable.c59b9cc5b9",
15
- "@webiny/error": "0.0.0-unstable.c59b9cc5b9",
16
- "@webiny/handler-graphql": "0.0.0-unstable.c59b9cc5b9",
17
- "@webiny/utils": "0.0.0-unstable.c59b9cc5b9",
18
- "@webiny/validation": "0.0.0-unstable.c59b9cc5b9",
13
+ "@webiny/api-file-manager": "0.0.0-unstable.c7dec08bb0",
14
+ "@webiny/api-security": "0.0.0-unstable.c7dec08bb0",
15
+ "@webiny/error": "0.0.0-unstable.c7dec08bb0",
16
+ "@webiny/handler-graphql": "0.0.0-unstable.c7dec08bb0",
17
+ "@webiny/utils": "0.0.0-unstable.c7dec08bb0",
18
+ "@webiny/validation": "0.0.0-unstable.c7dec08bb0",
19
19
  "form-data": "4.0.0",
20
20
  "mime": "3.0.0",
21
21
  "node-fetch": "2.6.9",
@@ -25,8 +25,8 @@
25
25
  "@babel/cli": "7.20.7",
26
26
  "@babel/core": "7.20.12",
27
27
  "@types/node-fetch": "2.6.2",
28
- "@webiny/cli": "0.0.0-unstable.c59b9cc5b9",
29
- "@webiny/project-utils": "0.0.0-unstable.c59b9cc5b9",
28
+ "@webiny/cli": "0.0.0-unstable.c7dec08bb0",
29
+ "@webiny/project-utils": "0.0.0-unstable.c7dec08bb0",
30
30
  "rimraf": "3.0.2",
31
31
  "typescript": "4.7.4"
32
32
  },
@@ -38,5 +38,5 @@
38
38
  "build": "yarn webiny run build",
39
39
  "watch": "yarn webiny run watch"
40
40
  },
41
- "gitHead": "c59b9cc5b96b7fd91388de93c7fff2d977d25220"
41
+ "gitHead": "c7dec08bb095467cca6a61381bd399d66b7bb147"
42
42
  }
@@ -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":["checkPermissions","context","check","filePermissions","security","getPermissions","relevantFilePermissions","filter","current","rwd","hasRwd","length","NotAuthorizedError","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;AAEO,MAAMA,gBAAgB,GAAG,OAC5BC,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,EAAE;EAClC;EAEA,OAAON,uBAAuB;AAClC,CAAC;AAAC;AAEF,MAAMI,MAAM,GAAG,CAACG,oBAAuD,EAAEJ,GAAW,KAAc;EAC9F,IAAI,CAACK,KAAK,CAACC,OAAO,CAACF,oBAAoB,CAAC,EAAE;IACtCA,oBAAoB,GAAG,CAACA,oBAAoB,CAAC;EACjD;EAEA,IAAI,CAACJ,GAAG,EAAE;IACN,OAAO,IAAI;EACf;;EAEA;EACA,MAAMO,gCAAgC,GAAGH,oBAAoB,CAACI,IAAI,CAACC,UAAU,IAAI;IAC7E,OAAO,OAAOA,UAAU,CAACT,GAAG,KAAK,QAAQ;EAC7C,CAAC,CAAC;EAEF,IAAIO,gCAAgC,EAAE;IAClC,OAAO,IAAI;EACf;;EAEA;EACA,OAAOH,oBAAoB,CAACI,IAAI,CAACC,UAAU,IAAI;IAC3C,OAAOA,UAAU,CAACT,GAAG,IAAIS,UAAU,CAACT,GAAG,CAACU,QAAQ,CAACV,GAAG,CAAC;EACzD,CAAC,CAAC;AACN,CAAC"}
@@ -9,7 +9,7 @@ var _s = _interopRequireDefault(require("aws-sdk/clients/s3"));
9
9
  var _responses = require("@webiny/handler-graphql/responses");
10
10
  var _getPresignedPostPayload = require("../utils/getPresignedPostPayload");
11
11
  var _error = _interopRequireDefault(require("@webiny/error"));
12
- var _checkPermission = require("./checkPermission");
12
+ var _checkPermissions = require("./checkPermissions");
13
13
  var _CreateMultiPartUploadUseCase = require("../multiPartUpload/CreateMultiPartUploadUseCase");
14
14
  var _CompleteMultiPartUploadUseCase = require("../multiPartUpload/CompleteMultiPartUploadUseCase");
15
15
  const plugin = {
@@ -17,6 +17,14 @@ const plugin = {
17
17
  name: "graphql-schema-api-file-manager-s3",
18
18
  schema: {
19
19
  typeDefs: /* GraphQL */`
20
+ type UploadFileResponseDataFile {
21
+ id: ID!
22
+ name: String!
23
+ type: String!
24
+ size: Long!
25
+ key: String!
26
+ }
27
+
20
28
  input PreSignedPostPayloadInput {
21
29
  name: String!
22
30
  type: String!
@@ -38,7 +46,7 @@ const plugin = {
38
46
  }
39
47
 
40
48
  type GetPreSignedPostPayloadResponse {
41
- error: FileError
49
+ error: FmError
42
50
  data: GetPreSignedPostPayloadResponseData
43
51
  }
44
52
 
@@ -55,11 +63,11 @@ const plugin = {
55
63
 
56
64
  type CompleteMultiPartUploadResponse {
57
65
  data: Boolean
58
- error: FileError
66
+ error: FmError
59
67
  }
60
68
 
61
69
  type GetPreSignedPostPayloadsResponse {
62
- error: FileError
70
+ error: FmError
63
71
  data: [GetPreSignedPostPayloadResponseData!]!
64
72
  }
65
73
 
@@ -74,7 +82,7 @@ const plugin = {
74
82
 
75
83
  type CreateMultiPartUploadResponse {
76
84
  data: CreateMultiPartUploadResponseData
77
- error: FileError
85
+ error: FmError
78
86
  }
79
87
 
80
88
  input MultiPartUploadFilePartInput {
@@ -98,7 +106,7 @@ const plugin = {
98
106
  FmQuery: {
99
107
  getPreSignedPostPayload: async (_, args, context) => {
100
108
  try {
101
- await (0, _checkPermission.checkPermission)(context, {
109
+ await (0, _checkPermissions.checkPermissions)(context, {
102
110
  rwd: "w"
103
111
  });
104
112
  const file = args.data;
@@ -118,7 +126,7 @@ const plugin = {
118
126
  }
119
127
  },
120
128
  getPreSignedPostPayloads: async (_, args, context) => {
121
- await (0, _checkPermission.checkPermission)(context, {
129
+ await (0, _checkPermissions.checkPermissions)(context, {
122
130
  rwd: "w"
123
131
  });
124
132
  const files = args.data;
@@ -144,7 +152,7 @@ const plugin = {
144
152
  },
145
153
  FmMutation: {
146
154
  createMultiPartUpload: async (_, args, context) => {
147
- await (0, _checkPermission.checkPermission)(context, {
155
+ await (0, _checkPermissions.checkPermissions)(context, {
148
156
  rwd: "w"
149
157
  });
150
158
  const s3Client = new _s.default({
@@ -167,7 +175,7 @@ const plugin = {
167
175
  }
168
176
  },
169
177
  completeMultiPartUpload: async (_, args, context) => {
170
- await (0, _checkPermission.checkPermission)(context, {
178
+ await (0, _checkPermissions.checkPermissions)(context, {
171
179
  rwd: "w"
172
180
  });
173
181
  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":"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"}
1
+ {"version":3,"names":["plugin","type","name","schema","typeDefs","resolvers","FmQuery","getPreSignedPostPayload","_","args","context","checkPermissions","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 { checkPermissions } from \"~/plugins/checkPermissions\";\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 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 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 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 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 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 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 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":";;;;;;;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;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,kCAAgB,EAACD,OAAO,EAAE;cAAEE,GAAG,EAAE;YAAI,CAAC,CAAC;YAE7C,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;U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"}
@@ -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"}