@contember/engine-s3-plugin 2.0.0-alpha.36 → 2.0.0-alpha.37
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/dist/development/index.cjs +2 -5
- package/dist/development/index.cjs.map +1 -1
- package/dist/development/index.js +2 -5
- package/dist/development/index.js.map +1 -1
- package/dist/development/src/S3SchemaContributor.cjs +21 -11
- package/dist/development/src/S3SchemaContributor.cjs.map +1 -1
- package/dist/development/src/S3SchemaContributor.js +22 -12
- package/dist/development/src/S3SchemaContributor.js.map +1 -1
- package/dist/production/index.cjs +2 -5
- package/dist/production/index.cjs.map +1 -1
- package/dist/production/index.js +2 -5
- package/dist/production/index.js.map +1 -1
- package/dist/production/src/S3SchemaContributor.cjs +21 -11
- package/dist/production/src/S3SchemaContributor.cjs.map +1 -1
- package/dist/production/src/S3SchemaContributor.js +22 -12
- package/dist/production/src/S3SchemaContributor.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/S3SchemaContributor.d.ts +2 -3
- package/dist/types/S3SchemaContributor.d.ts.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/S3SchemaContributor.ts +24 -10
- package/src/index.ts +2 -5
|
@@ -14,12 +14,9 @@ class S3 {
|
|
|
14
14
|
getConfigProcessor() {
|
|
15
15
|
return new S3ConfigProcessor.S3ConfigProcessor();
|
|
16
16
|
}
|
|
17
|
-
getSchemaContributor({
|
|
18
|
-
if (!project.s3) {
|
|
19
|
-
return void 0;
|
|
20
|
-
}
|
|
17
|
+
getSchemaContributor({ providers }) {
|
|
21
18
|
const s3ServiceFactory = new S3Service.S3ServiceFactory();
|
|
22
|
-
return new S3SchemaContributor.S3SchemaContributor(
|
|
19
|
+
return new S3SchemaContributor.S3SchemaContributor(s3ServiceFactory, providers);
|
|
23
20
|
}
|
|
24
21
|
}
|
|
25
22
|
exports.S3SchemaContributor = S3SchemaContributor.S3SchemaContributor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../packages/engine-s3-plugin/src/index.ts"],"sourcesContent":["import { Plugin, SchemaContributorArgs } from '@contember/engine-plugins'\nimport { S3ConfigProcessor } from './S3ConfigProcessor'\nimport { S3SchemaContributor } from './S3SchemaContributor'\nimport { S3ServiceFactory } from './S3Service'\nimport { Project3Config } from './Config'\n\nexport * from './S3ObjectAuthorizator'\nexport * from './S3SchemaContributor'\nexport * from './S3Service'\n\nexport default class S3 implements Plugin<Project3Config> {\n\tname = 'contember/s3'\n\n\tgetConfigProcessor() {\n\t\treturn new S3ConfigProcessor()\n\t}\n\n\tgetSchemaContributor({
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../packages/engine-s3-plugin/src/index.ts"],"sourcesContent":["import { Plugin, SchemaContributorArgs } from '@contember/engine-plugins'\nimport { S3ConfigProcessor } from './S3ConfigProcessor'\nimport { S3SchemaContributor } from './S3SchemaContributor'\nimport { S3ServiceFactory } from './S3Service'\nimport { Project3Config } from './Config'\n\nexport * from './S3ObjectAuthorizator'\nexport * from './S3SchemaContributor'\nexport * from './S3Service'\n\nexport default class S3 implements Plugin<Project3Config> {\n\tname = 'contember/s3'\n\n\tgetConfigProcessor() {\n\t\treturn new S3ConfigProcessor()\n\t}\n\n\tgetSchemaContributor({ providers }: SchemaContributorArgs) {\n\t\tconst s3ServiceFactory = new S3ServiceFactory()\n\t\treturn new S3SchemaContributor(s3ServiceFactory, providers)\n\t}\n}\n"],"names":["S3ConfigProcessor","S3ServiceFactory","S3SchemaContributor"],"mappings":";;;;;;;;;AAUA,MAAqB,GAAqC;AAAA,EAA1D,cAAA;AACQ,kBAAA,MAAA,QAAA,cAAA;AAAA,EAAA;AAAA,EAEP,qBAAqB;AACpB,WAAO,IAAIA,kBAAAA,kBAAkB;AAAA,EAAA;AAAA,EAG9B,qBAAqB,EAAE,aAAoC;AACpD,UAAA,mBAAmB,IAAIC,2BAAiB;AACvC,WAAA,IAAIC,oBAAAA,oBAAoB,kBAAkB,SAAS;AAAA,EAAA;AAE5D;;;;;;"}
|
|
@@ -13,12 +13,9 @@ class S3 {
|
|
|
13
13
|
getConfigProcessor() {
|
|
14
14
|
return new S3ConfigProcessor();
|
|
15
15
|
}
|
|
16
|
-
getSchemaContributor({
|
|
17
|
-
if (!project.s3) {
|
|
18
|
-
return void 0;
|
|
19
|
-
}
|
|
16
|
+
getSchemaContributor({ providers }) {
|
|
20
17
|
const s3ServiceFactory = new S3ServiceFactory();
|
|
21
|
-
return new S3SchemaContributor(
|
|
18
|
+
return new S3SchemaContributor(s3ServiceFactory, providers);
|
|
22
19
|
}
|
|
23
20
|
}
|
|
24
21
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../packages/engine-s3-plugin/src/index.ts"],"sourcesContent":["import { Plugin, SchemaContributorArgs } from '@contember/engine-plugins'\nimport { S3ConfigProcessor } from './S3ConfigProcessor'\nimport { S3SchemaContributor } from './S3SchemaContributor'\nimport { S3ServiceFactory } from './S3Service'\nimport { Project3Config } from './Config'\n\nexport * from './S3ObjectAuthorizator'\nexport * from './S3SchemaContributor'\nexport * from './S3Service'\n\nexport default class S3 implements Plugin<Project3Config> {\n\tname = 'contember/s3'\n\n\tgetConfigProcessor() {\n\t\treturn new S3ConfigProcessor()\n\t}\n\n\tgetSchemaContributor({
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../packages/engine-s3-plugin/src/index.ts"],"sourcesContent":["import { Plugin, SchemaContributorArgs } from '@contember/engine-plugins'\nimport { S3ConfigProcessor } from './S3ConfigProcessor'\nimport { S3SchemaContributor } from './S3SchemaContributor'\nimport { S3ServiceFactory } from './S3Service'\nimport { Project3Config } from './Config'\n\nexport * from './S3ObjectAuthorizator'\nexport * from './S3SchemaContributor'\nexport * from './S3Service'\n\nexport default class S3 implements Plugin<Project3Config> {\n\tname = 'contember/s3'\n\n\tgetConfigProcessor() {\n\t\treturn new S3ConfigProcessor()\n\t}\n\n\tgetSchemaContributor({ providers }: SchemaContributorArgs) {\n\t\tconst s3ServiceFactory = new S3ServiceFactory()\n\t\treturn new S3SchemaContributor(s3ServiceFactory, providers)\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;AAUA,MAAqB,GAAqC;AAAA,EAA1D,cAAA;AACQ,kBAAA,MAAA,QAAA,cAAA;AAAA,EAAA;AAAA,EAEP,qBAAqB;AACpB,WAAO,IAAI,kBAAkB;AAAA,EAAA;AAAA,EAG9B,qBAAqB,EAAE,aAAoC;AACpD,UAAA,mBAAmB,IAAI,iBAAiB;AACvC,WAAA,IAAI,oBAAoB,kBAAkB,SAAS;AAAA,EAAA;AAE5D;"}
|
|
@@ -5,13 +5,15 @@ const Config = require("./Config.cjs");
|
|
|
5
5
|
const S3SchemaTypes = require("./S3SchemaTypes.cjs");
|
|
6
6
|
const S3ObjectAuthorizator = require("./S3ObjectAuthorizator.cjs");
|
|
7
7
|
class S3SchemaContributor {
|
|
8
|
-
constructor(
|
|
9
|
-
this.s3Config = s3Config;
|
|
8
|
+
constructor(s3Factory, providers) {
|
|
10
9
|
this.s3Factory = s3Factory;
|
|
11
10
|
this.providers = providers;
|
|
12
11
|
}
|
|
12
|
+
getCacheKey({ project }) {
|
|
13
|
+
return project.s3 ? "yes" : "no";
|
|
14
|
+
}
|
|
13
15
|
createSchema(context) {
|
|
14
|
-
if (!
|
|
16
|
+
if (!context.project.s3) {
|
|
15
17
|
return void 0;
|
|
16
18
|
}
|
|
17
19
|
const rules = context.identity.projectRoles.flatMap(
|
|
@@ -27,11 +29,9 @@ class S3SchemaContributor {
|
|
|
27
29
|
if (uploadRules.length === 0 && readRules.length == 0) {
|
|
28
30
|
return void 0;
|
|
29
31
|
}
|
|
30
|
-
const s3Config = Config.resolveS3Config(this.s3Config);
|
|
31
32
|
const authorizator = new S3ObjectAuthorizator.S3ObjectAuthorizator(uploadRules, readRules);
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const readMutation = this.createReadMutation(s3);
|
|
33
|
+
const uploadMutation = this.createUploadMutation(authorizator);
|
|
34
|
+
const readMutation = this.createReadMutation(authorizator);
|
|
35
35
|
const mutation = {
|
|
36
36
|
generateUploadUrl: uploadMutation,
|
|
37
37
|
generateReadUrl: readMutation
|
|
@@ -51,7 +51,7 @@ class S3SchemaContributor {
|
|
|
51
51
|
})
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
|
-
createReadMutation(
|
|
54
|
+
createReadMutation(authorizator) {
|
|
55
55
|
return {
|
|
56
56
|
type: new graphql.GraphQLNonNull(S3SchemaTypes.S3SignedRead),
|
|
57
57
|
args: {
|
|
@@ -62,12 +62,17 @@ class S3SchemaContributor {
|
|
|
62
62
|
type: graphql.GraphQLInt
|
|
63
63
|
}
|
|
64
64
|
},
|
|
65
|
-
resolve: async (parent, args) => {
|
|
65
|
+
resolve: async (parent, args, ctx) => {
|
|
66
|
+
if (!ctx.project.s3) {
|
|
67
|
+
throw new graphql.GraphQLError("S3 is not configured for this project");
|
|
68
|
+
}
|
|
69
|
+
const s3Config = Config.resolveS3Config(ctx.project.s3);
|
|
70
|
+
const s3 = this.s3Factory.create(s3Config, this.providers, authorizator);
|
|
66
71
|
return s3.getSignedReadUrl({ objectKey: args.objectKey, expiration: args.expiration ?? null });
|
|
67
72
|
}
|
|
68
73
|
};
|
|
69
74
|
}
|
|
70
|
-
createUploadMutation(
|
|
75
|
+
createUploadMutation(authorizator) {
|
|
71
76
|
return {
|
|
72
77
|
type: new graphql.GraphQLNonNull(S3SchemaTypes.S3SignedUpload),
|
|
73
78
|
args: {
|
|
@@ -77,7 +82,12 @@ class S3SchemaContributor {
|
|
|
77
82
|
prefix: { type: graphql.GraphQLString, deprecationReason: "Use input.prefix" },
|
|
78
83
|
acl: { type: S3SchemaTypes.S3Acl, deprecationReason: "Use input.acl" }
|
|
79
84
|
},
|
|
80
|
-
resolve: async (parent, args) => {
|
|
85
|
+
resolve: async (parent, args, ctx) => {
|
|
86
|
+
if (!ctx.project.s3) {
|
|
87
|
+
throw new graphql.GraphQLError("S3 is not configured for this project");
|
|
88
|
+
}
|
|
89
|
+
const s3Config = Config.resolveS3Config(ctx.project.s3);
|
|
90
|
+
const s3 = this.s3Factory.create(s3Config, this.providers, authorizator);
|
|
81
91
|
return s3.getSignedUploadUrl({
|
|
82
92
|
acl: args.input?.acl ?? args.acl ?? null,
|
|
83
93
|
contentDisposition: args.input?.contentDisposition ?? null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"S3SchemaContributor.cjs","sources":["../../../../packages/engine-s3-plugin/src/S3SchemaContributor.ts"],"sourcesContent":["import {\n\tGraphQLFieldConfig,\n\tGraphQLInt,\n\tGraphQLNonNull,\n\tGraphQLObjectType,\n\tGraphQLSchema,\n\tGraphQLSchemaConfig,\n\tGraphQLString,\n} from 'graphql'\nimport { S3Service, S3ServiceFactory } from './S3Service'\nimport { resolveS3Config, S3Config } from './Config'\nimport { GraphQLSchemaContributor, GraphQLSchemaContributorContext, Providers } from '@contember/engine-plugins'\nimport * as types from './S3SchemaTypes'\nimport { S3Acl, S3GenerateSignedUploadInput, S3SignedRead, S3SignedUpload } from './S3SchemaTypes'\nimport { S3ObjectAuthorizator } from './S3ObjectAuthorizator'\n\ninterface Identity {\n\tprojectRoles: string[]\n}\n\nexport type S3SchemaUploadAcl =\n\t| boolean\n\t| {\n\t\tmaxSize?: number\n\t}\n\nexport type S3SchemaAcl = Record<\n\tstring, // public/*.jpg\n\t{\n\t\tread?: boolean\n\t\tupload?: S3SchemaUploadAcl\n\t}\n>\n\n\nexport class S3SchemaContributor implements GraphQLSchemaContributor {\n\tconstructor(\n\t\tprivate readonly
|
|
1
|
+
{"version":3,"file":"S3SchemaContributor.cjs","sources":["../../../../packages/engine-s3-plugin/src/S3SchemaContributor.ts"],"sourcesContent":["import {\n\tGraphQLError,\n\tGraphQLFieldConfig,\n\tGraphQLInt,\n\tGraphQLNonNull,\n\tGraphQLObjectType,\n\tGraphQLSchema,\n\tGraphQLSchemaConfig,\n\tGraphQLString,\n} from 'graphql'\nimport { S3Service, S3ServiceFactory } from './S3Service'\nimport { Project3Config, resolveS3Config, S3Config } from './Config'\nimport { GraphQLSchemaContributor, GraphQLSchemaContributorContext, Providers } from '@contember/engine-plugins'\nimport * as types from './S3SchemaTypes'\nimport { S3Acl, S3GenerateSignedUploadInput, S3SignedRead, S3SignedUpload } from './S3SchemaTypes'\nimport { S3ObjectAuthorizator } from './S3ObjectAuthorizator'\n\ninterface Identity {\n\tprojectRoles: string[]\n}\n\nexport type S3SchemaUploadAcl =\n\t| boolean\n\t| {\n\t\tmaxSize?: number\n\t}\n\nexport type S3SchemaAcl = Record<\n\tstring, // public/*.jpg\n\t{\n\t\tread?: boolean\n\t\tupload?: S3SchemaUploadAcl\n\t}\n>\n\n\nexport class S3SchemaContributor implements GraphQLSchemaContributor {\n\tconstructor(\n\t\tprivate readonly s3Factory: S3ServiceFactory,\n\t\tprivate readonly providers: Providers,\n\t) {}\n\n\tgetCacheKey?({ project }: GraphQLSchemaContributorContext): string {\n\t\treturn project.s3 ? 'yes' : 'no'\n\t}\n\n\tcreateSchema(context: GraphQLSchemaContributorContext): GraphQLSchemaConfig | undefined {\n\t\tif (!context.project.s3) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst rules = context.identity.projectRoles.flatMap(it =>\n\t\t\tObject.entries((context.schema.acl.roles[it]?.s3 as S3SchemaAcl) || {}),\n\t\t)\n\n\n\t\tconst uploadRules = rules.filter(([, it]) => it.upload).map(([it, val]) => ({\n\t\t\tpattern: it,\n\t\t\t...(typeof val.upload !== 'boolean' ? val.upload : {}),\n\t\t}))\n\t\tconst readRules = rules.filter(([, it]) => it.read).map(([it]) => ({\n\t\t\tpattern: it,\n\t\t}))\n\n\t\tif (uploadRules.length === 0 && readRules.length == 0) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tconst authorizator = new S3ObjectAuthorizator(uploadRules, readRules)\n\t\tconst uploadMutation = this.createUploadMutation(authorizator)\n\t\tconst readMutation = this.createReadMutation(authorizator)\n\t\tconst mutation = {\n\t\t\tgenerateUploadUrl: uploadMutation as GraphQLFieldConfig<any, any, any>,\n\t\t\tgenerateReadUrl: readMutation,\n\t\t}\n\t\treturn {\n\t\t\tmutation: new GraphQLObjectType({\n\t\t\t\tname: 'Mutation',\n\t\t\t\tfields: () => mutation,\n\t\t\t}),\n\t\t\tquery: new GraphQLObjectType({\n\t\t\t\tname: 'Query',\n\t\t\t\tfields: () => ({\n\t\t\t\t\ts3DummyQuery: {\n\t\t\t\t\t\ttype: GraphQLString,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t}),\n\t\t}\n\t}\n\n\tprivate createReadMutation(authorizator: S3ObjectAuthorizator): GraphQLFieldConfig<any, { project: Project3Config }, any> {\n\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(S3SignedRead),\n\t\t\targs: {\n\t\t\t\tobjectKey: {\n\t\t\t\t\ttype: new GraphQLNonNull(GraphQLString),\n\t\t\t\t},\n\t\t\t\texpiration: {\n\t\t\t\t\ttype: GraphQLInt,\n\t\t\t\t},\n\t\t\t},\n\t\t\tresolve: async (parent: any, args: { objectKey: string; expiration?: number }, ctx: { project: Project3Config }) => {\n\t\t\t\tif (!ctx.project.s3) {\n\t\t\t\t\tthrow new GraphQLError('S3 is not configured for this project')\n\t\t\t\t}\n\t\t\t\tconst s3Config = resolveS3Config(ctx.project.s3)\n\t\t\t\tconst s3 = this.s3Factory.create(s3Config, this.providers, authorizator)\n\t\t\t\treturn s3.getSignedReadUrl({ objectKey: args.objectKey, expiration: args.expiration ?? null })\n\t\t\t},\n\t\t} as GraphQLFieldConfig<any, any, any>\n\t}\n\n\tprivate createUploadMutation(authorizator: S3ObjectAuthorizator): GraphQLFieldConfig<any, any, any> {\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(S3SignedUpload),\n\t\t\targs: {\n\t\t\t\tinput: { type: types.S3GenerateSignedUploadInput },\n\t\t\t\tcontentType: { type: GraphQLString, deprecationReason: 'Use input.contentType' },\n\t\t\t\texpiration: { type: GraphQLInt, deprecationReason: 'Use input.expiration' },\n\t\t\t\tprefix: { type: GraphQLString, deprecationReason: 'Use input.prefix' },\n\t\t\t\tacl: { type: types.S3Acl, deprecationReason: 'Use input.acl' },\n\t\t\t},\n\t\t\tresolve: async (\n\t\t\t\tparent: any,\n\t\t\t\targs: { input?: Partial<S3GenerateSignedUploadInput>; contentType?: string; acl?: S3Acl; expiration?: number; prefix?: string },\n\t\t\t\tctx: { project: Project3Config },\n\t\t\t) => {\n\t\t\t\tif (!ctx.project.s3) {\n\t\t\t\t\tthrow new GraphQLError('S3 is not configured for this project')\n\t\t\t\t}\n\t\t\t\tconst s3Config = resolveS3Config(ctx.project.s3)\n\t\t\t\tconst s3 = this.s3Factory.create(s3Config, this.providers, authorizator)\n\t\t\t\treturn s3.getSignedUploadUrl({\n\t\t\t\t\tacl: args.input?.acl ?? args.acl ?? null,\n\t\t\t\t\tcontentDisposition: args.input?.contentDisposition ?? null,\n\t\t\t\t\tcontentType: args.input?.contentType ?? args.contentType ?? null,\n\t\t\t\t\texpiration: args.input?.expiration ?? args.expiration ?? null,\n\t\t\t\t\textension: args.input?.extension ?? null,\n\t\t\t\t\tfileName: args.input?.fileName ?? null,\n\t\t\t\t\tprefix: args.input?.prefix ?? args.prefix ?? null,\n\t\t\t\t\tsuffix: args.input?.suffix ?? null,\n\t\t\t\t\tsize: args.input?.size ?? null,\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n}\n"],"names":["S3ObjectAuthorizator","GraphQLObjectType","GraphQLString","GraphQLNonNull","S3SignedRead","GraphQLInt","GraphQLError","resolveS3Config","S3SignedUpload","types.S3GenerateSignedUploadInput","types.S3Acl"],"mappings":"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"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import { GraphQLObjectType, GraphQLString, GraphQLNonNull, GraphQLInt } from "graphql";
|
|
1
|
+
import { GraphQLObjectType, GraphQLString, GraphQLNonNull, GraphQLInt, GraphQLError } from "graphql";
|
|
2
2
|
import { resolveS3Config } from "./Config.js";
|
|
3
3
|
import { S3SignedRead, S3SignedUpload, S3GenerateSignedUploadInput, S3Acl } from "./S3SchemaTypes.js";
|
|
4
4
|
import { S3ObjectAuthorizator } from "./S3ObjectAuthorizator.js";
|
|
5
5
|
class S3SchemaContributor {
|
|
6
|
-
constructor(
|
|
7
|
-
this.s3Config = s3Config;
|
|
6
|
+
constructor(s3Factory, providers) {
|
|
8
7
|
this.s3Factory = s3Factory;
|
|
9
8
|
this.providers = providers;
|
|
10
9
|
}
|
|
10
|
+
getCacheKey({ project }) {
|
|
11
|
+
return project.s3 ? "yes" : "no";
|
|
12
|
+
}
|
|
11
13
|
createSchema(context) {
|
|
12
|
-
if (!
|
|
14
|
+
if (!context.project.s3) {
|
|
13
15
|
return void 0;
|
|
14
16
|
}
|
|
15
17
|
const rules = context.identity.projectRoles.flatMap(
|
|
@@ -25,11 +27,9 @@ class S3SchemaContributor {
|
|
|
25
27
|
if (uploadRules.length === 0 && readRules.length == 0) {
|
|
26
28
|
return void 0;
|
|
27
29
|
}
|
|
28
|
-
const s3Config = resolveS3Config(this.s3Config);
|
|
29
30
|
const authorizator = new S3ObjectAuthorizator(uploadRules, readRules);
|
|
30
|
-
const
|
|
31
|
-
const
|
|
32
|
-
const readMutation = this.createReadMutation(s3);
|
|
31
|
+
const uploadMutation = this.createUploadMutation(authorizator);
|
|
32
|
+
const readMutation = this.createReadMutation(authorizator);
|
|
33
33
|
const mutation = {
|
|
34
34
|
generateUploadUrl: uploadMutation,
|
|
35
35
|
generateReadUrl: readMutation
|
|
@@ -49,7 +49,7 @@ class S3SchemaContributor {
|
|
|
49
49
|
})
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
|
-
createReadMutation(
|
|
52
|
+
createReadMutation(authorizator) {
|
|
53
53
|
return {
|
|
54
54
|
type: new GraphQLNonNull(S3SignedRead),
|
|
55
55
|
args: {
|
|
@@ -60,12 +60,17 @@ class S3SchemaContributor {
|
|
|
60
60
|
type: GraphQLInt
|
|
61
61
|
}
|
|
62
62
|
},
|
|
63
|
-
resolve: async (parent, args) => {
|
|
63
|
+
resolve: async (parent, args, ctx) => {
|
|
64
|
+
if (!ctx.project.s3) {
|
|
65
|
+
throw new GraphQLError("S3 is not configured for this project");
|
|
66
|
+
}
|
|
67
|
+
const s3Config = resolveS3Config(ctx.project.s3);
|
|
68
|
+
const s3 = this.s3Factory.create(s3Config, this.providers, authorizator);
|
|
64
69
|
return s3.getSignedReadUrl({ objectKey: args.objectKey, expiration: args.expiration ?? null });
|
|
65
70
|
}
|
|
66
71
|
};
|
|
67
72
|
}
|
|
68
|
-
createUploadMutation(
|
|
73
|
+
createUploadMutation(authorizator) {
|
|
69
74
|
return {
|
|
70
75
|
type: new GraphQLNonNull(S3SignedUpload),
|
|
71
76
|
args: {
|
|
@@ -75,7 +80,12 @@ class S3SchemaContributor {
|
|
|
75
80
|
prefix: { type: GraphQLString, deprecationReason: "Use input.prefix" },
|
|
76
81
|
acl: { type: S3Acl, deprecationReason: "Use input.acl" }
|
|
77
82
|
},
|
|
78
|
-
resolve: async (parent, args) => {
|
|
83
|
+
resolve: async (parent, args, ctx) => {
|
|
84
|
+
if (!ctx.project.s3) {
|
|
85
|
+
throw new GraphQLError("S3 is not configured for this project");
|
|
86
|
+
}
|
|
87
|
+
const s3Config = resolveS3Config(ctx.project.s3);
|
|
88
|
+
const s3 = this.s3Factory.create(s3Config, this.providers, authorizator);
|
|
79
89
|
return s3.getSignedUploadUrl({
|
|
80
90
|
acl: args.input?.acl ?? args.acl ?? null,
|
|
81
91
|
contentDisposition: args.input?.contentDisposition ?? null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"S3SchemaContributor.js","sources":["../../../../packages/engine-s3-plugin/src/S3SchemaContributor.ts"],"sourcesContent":["import {\n\tGraphQLFieldConfig,\n\tGraphQLInt,\n\tGraphQLNonNull,\n\tGraphQLObjectType,\n\tGraphQLSchema,\n\tGraphQLSchemaConfig,\n\tGraphQLString,\n} from 'graphql'\nimport { S3Service, S3ServiceFactory } from './S3Service'\nimport { resolveS3Config, S3Config } from './Config'\nimport { GraphQLSchemaContributor, GraphQLSchemaContributorContext, Providers } from '@contember/engine-plugins'\nimport * as types from './S3SchemaTypes'\nimport { S3Acl, S3GenerateSignedUploadInput, S3SignedRead, S3SignedUpload } from './S3SchemaTypes'\nimport { S3ObjectAuthorizator } from './S3ObjectAuthorizator'\n\ninterface Identity {\n\tprojectRoles: string[]\n}\n\nexport type S3SchemaUploadAcl =\n\t| boolean\n\t| {\n\t\tmaxSize?: number\n\t}\n\nexport type S3SchemaAcl = Record<\n\tstring, // public/*.jpg\n\t{\n\t\tread?: boolean\n\t\tupload?: S3SchemaUploadAcl\n\t}\n>\n\n\nexport class S3SchemaContributor implements GraphQLSchemaContributor {\n\tconstructor(\n\t\tprivate readonly
|
|
1
|
+
{"version":3,"file":"S3SchemaContributor.js","sources":["../../../../packages/engine-s3-plugin/src/S3SchemaContributor.ts"],"sourcesContent":["import {\n\tGraphQLError,\n\tGraphQLFieldConfig,\n\tGraphQLInt,\n\tGraphQLNonNull,\n\tGraphQLObjectType,\n\tGraphQLSchema,\n\tGraphQLSchemaConfig,\n\tGraphQLString,\n} from 'graphql'\nimport { S3Service, S3ServiceFactory } from './S3Service'\nimport { Project3Config, resolveS3Config, S3Config } from './Config'\nimport { GraphQLSchemaContributor, GraphQLSchemaContributorContext, Providers } from '@contember/engine-plugins'\nimport * as types from './S3SchemaTypes'\nimport { S3Acl, S3GenerateSignedUploadInput, S3SignedRead, S3SignedUpload } from './S3SchemaTypes'\nimport { S3ObjectAuthorizator } from './S3ObjectAuthorizator'\n\ninterface Identity {\n\tprojectRoles: string[]\n}\n\nexport type S3SchemaUploadAcl =\n\t| boolean\n\t| {\n\t\tmaxSize?: number\n\t}\n\nexport type S3SchemaAcl = Record<\n\tstring, // public/*.jpg\n\t{\n\t\tread?: boolean\n\t\tupload?: S3SchemaUploadAcl\n\t}\n>\n\n\nexport class S3SchemaContributor implements GraphQLSchemaContributor {\n\tconstructor(\n\t\tprivate readonly s3Factory: S3ServiceFactory,\n\t\tprivate readonly providers: Providers,\n\t) {}\n\n\tgetCacheKey?({ project }: GraphQLSchemaContributorContext): string {\n\t\treturn project.s3 ? 'yes' : 'no'\n\t}\n\n\tcreateSchema(context: GraphQLSchemaContributorContext): GraphQLSchemaConfig | undefined {\n\t\tif (!context.project.s3) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst rules = context.identity.projectRoles.flatMap(it =>\n\t\t\tObject.entries((context.schema.acl.roles[it]?.s3 as S3SchemaAcl) || {}),\n\t\t)\n\n\n\t\tconst uploadRules = rules.filter(([, it]) => it.upload).map(([it, val]) => ({\n\t\t\tpattern: it,\n\t\t\t...(typeof val.upload !== 'boolean' ? val.upload : {}),\n\t\t}))\n\t\tconst readRules = rules.filter(([, it]) => it.read).map(([it]) => ({\n\t\t\tpattern: it,\n\t\t}))\n\n\t\tif (uploadRules.length === 0 && readRules.length == 0) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tconst authorizator = new S3ObjectAuthorizator(uploadRules, readRules)\n\t\tconst uploadMutation = this.createUploadMutation(authorizator)\n\t\tconst readMutation = this.createReadMutation(authorizator)\n\t\tconst mutation = {\n\t\t\tgenerateUploadUrl: uploadMutation as GraphQLFieldConfig<any, any, any>,\n\t\t\tgenerateReadUrl: readMutation,\n\t\t}\n\t\treturn {\n\t\t\tmutation: new GraphQLObjectType({\n\t\t\t\tname: 'Mutation',\n\t\t\t\tfields: () => mutation,\n\t\t\t}),\n\t\t\tquery: new GraphQLObjectType({\n\t\t\t\tname: 'Query',\n\t\t\t\tfields: () => ({\n\t\t\t\t\ts3DummyQuery: {\n\t\t\t\t\t\ttype: GraphQLString,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t}),\n\t\t}\n\t}\n\n\tprivate createReadMutation(authorizator: S3ObjectAuthorizator): GraphQLFieldConfig<any, { project: Project3Config }, any> {\n\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(S3SignedRead),\n\t\t\targs: {\n\t\t\t\tobjectKey: {\n\t\t\t\t\ttype: new GraphQLNonNull(GraphQLString),\n\t\t\t\t},\n\t\t\t\texpiration: {\n\t\t\t\t\ttype: GraphQLInt,\n\t\t\t\t},\n\t\t\t},\n\t\t\tresolve: async (parent: any, args: { objectKey: string; expiration?: number }, ctx: { project: Project3Config }) => {\n\t\t\t\tif (!ctx.project.s3) {\n\t\t\t\t\tthrow new GraphQLError('S3 is not configured for this project')\n\t\t\t\t}\n\t\t\t\tconst s3Config = resolveS3Config(ctx.project.s3)\n\t\t\t\tconst s3 = this.s3Factory.create(s3Config, this.providers, authorizator)\n\t\t\t\treturn s3.getSignedReadUrl({ objectKey: args.objectKey, expiration: args.expiration ?? null })\n\t\t\t},\n\t\t} as GraphQLFieldConfig<any, any, any>\n\t}\n\n\tprivate createUploadMutation(authorizator: S3ObjectAuthorizator): GraphQLFieldConfig<any, any, any> {\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(S3SignedUpload),\n\t\t\targs: {\n\t\t\t\tinput: { type: types.S3GenerateSignedUploadInput },\n\t\t\t\tcontentType: { type: GraphQLString, deprecationReason: 'Use input.contentType' },\n\t\t\t\texpiration: { type: GraphQLInt, deprecationReason: 'Use input.expiration' },\n\t\t\t\tprefix: { type: GraphQLString, deprecationReason: 'Use input.prefix' },\n\t\t\t\tacl: { type: types.S3Acl, deprecationReason: 'Use input.acl' },\n\t\t\t},\n\t\t\tresolve: async (\n\t\t\t\tparent: any,\n\t\t\t\targs: { input?: Partial<S3GenerateSignedUploadInput>; contentType?: string; acl?: S3Acl; expiration?: number; prefix?: string },\n\t\t\t\tctx: { project: Project3Config },\n\t\t\t) => {\n\t\t\t\tif (!ctx.project.s3) {\n\t\t\t\t\tthrow new GraphQLError('S3 is not configured for this project')\n\t\t\t\t}\n\t\t\t\tconst s3Config = resolveS3Config(ctx.project.s3)\n\t\t\t\tconst s3 = this.s3Factory.create(s3Config, this.providers, authorizator)\n\t\t\t\treturn s3.getSignedUploadUrl({\n\t\t\t\t\tacl: args.input?.acl ?? args.acl ?? null,\n\t\t\t\t\tcontentDisposition: args.input?.contentDisposition ?? null,\n\t\t\t\t\tcontentType: args.input?.contentType ?? args.contentType ?? null,\n\t\t\t\t\texpiration: args.input?.expiration ?? args.expiration ?? null,\n\t\t\t\t\textension: args.input?.extension ?? null,\n\t\t\t\t\tfileName: args.input?.fileName ?? null,\n\t\t\t\t\tprefix: args.input?.prefix ?? args.prefix ?? null,\n\t\t\t\t\tsuffix: args.input?.suffix ?? null,\n\t\t\t\t\tsize: args.input?.size ?? null,\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n}\n"],"names":["types.S3GenerateSignedUploadInput","types.S3Acl"],"mappings":"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"}
|
|
@@ -14,12 +14,9 @@ class S3 {
|
|
|
14
14
|
getConfigProcessor() {
|
|
15
15
|
return new S3ConfigProcessor.S3ConfigProcessor();
|
|
16
16
|
}
|
|
17
|
-
getSchemaContributor({
|
|
18
|
-
if (!project.s3) {
|
|
19
|
-
return void 0;
|
|
20
|
-
}
|
|
17
|
+
getSchemaContributor({ providers }) {
|
|
21
18
|
const s3ServiceFactory = new S3Service.S3ServiceFactory();
|
|
22
|
-
return new S3SchemaContributor.S3SchemaContributor(
|
|
19
|
+
return new S3SchemaContributor.S3SchemaContributor(s3ServiceFactory, providers);
|
|
23
20
|
}
|
|
24
21
|
}
|
|
25
22
|
exports.S3SchemaContributor = S3SchemaContributor.S3SchemaContributor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../packages/engine-s3-plugin/src/index.ts"],"sourcesContent":["import { Plugin, SchemaContributorArgs } from '@contember/engine-plugins'\nimport { S3ConfigProcessor } from './S3ConfigProcessor'\nimport { S3SchemaContributor } from './S3SchemaContributor'\nimport { S3ServiceFactory } from './S3Service'\nimport { Project3Config } from './Config'\n\nexport * from './S3ObjectAuthorizator'\nexport * from './S3SchemaContributor'\nexport * from './S3Service'\n\nexport default class S3 implements Plugin<Project3Config> {\n\tname = 'contember/s3'\n\n\tgetConfigProcessor() {\n\t\treturn new S3ConfigProcessor()\n\t}\n\n\tgetSchemaContributor({
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../packages/engine-s3-plugin/src/index.ts"],"sourcesContent":["import { Plugin, SchemaContributorArgs } from '@contember/engine-plugins'\nimport { S3ConfigProcessor } from './S3ConfigProcessor'\nimport { S3SchemaContributor } from './S3SchemaContributor'\nimport { S3ServiceFactory } from './S3Service'\nimport { Project3Config } from './Config'\n\nexport * from './S3ObjectAuthorizator'\nexport * from './S3SchemaContributor'\nexport * from './S3Service'\n\nexport default class S3 implements Plugin<Project3Config> {\n\tname = 'contember/s3'\n\n\tgetConfigProcessor() {\n\t\treturn new S3ConfigProcessor()\n\t}\n\n\tgetSchemaContributor({ providers }: SchemaContributorArgs) {\n\t\tconst s3ServiceFactory = new S3ServiceFactory()\n\t\treturn new S3SchemaContributor(s3ServiceFactory, providers)\n\t}\n}\n"],"names":["S3ConfigProcessor","S3ServiceFactory","S3SchemaContributor"],"mappings":";;;;;;;;;AAUA,MAAqB,GAAqC;AAAA,EAA1D,cAAA;AACQ,kBAAA,MAAA,QAAA,cAAA;AAAA,EAAA;AAAA,EAEP,qBAAqB;AACpB,WAAO,IAAIA,kBAAAA,kBAAkB;AAAA,EAAA;AAAA,EAG9B,qBAAqB,EAAE,aAAoC;AACpD,UAAA,mBAAmB,IAAIC,2BAAiB;AACvC,WAAA,IAAIC,oBAAAA,oBAAoB,kBAAkB,SAAS;AAAA,EAAA;AAE5D;;;;;;"}
|
package/dist/production/index.js
CHANGED
|
@@ -13,12 +13,9 @@ class S3 {
|
|
|
13
13
|
getConfigProcessor() {
|
|
14
14
|
return new S3ConfigProcessor();
|
|
15
15
|
}
|
|
16
|
-
getSchemaContributor({
|
|
17
|
-
if (!project.s3) {
|
|
18
|
-
return void 0;
|
|
19
|
-
}
|
|
16
|
+
getSchemaContributor({ providers }) {
|
|
20
17
|
const s3ServiceFactory = new S3ServiceFactory();
|
|
21
|
-
return new S3SchemaContributor(
|
|
18
|
+
return new S3SchemaContributor(s3ServiceFactory, providers);
|
|
22
19
|
}
|
|
23
20
|
}
|
|
24
21
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../packages/engine-s3-plugin/src/index.ts"],"sourcesContent":["import { Plugin, SchemaContributorArgs } from '@contember/engine-plugins'\nimport { S3ConfigProcessor } from './S3ConfigProcessor'\nimport { S3SchemaContributor } from './S3SchemaContributor'\nimport { S3ServiceFactory } from './S3Service'\nimport { Project3Config } from './Config'\n\nexport * from './S3ObjectAuthorizator'\nexport * from './S3SchemaContributor'\nexport * from './S3Service'\n\nexport default class S3 implements Plugin<Project3Config> {\n\tname = 'contember/s3'\n\n\tgetConfigProcessor() {\n\t\treturn new S3ConfigProcessor()\n\t}\n\n\tgetSchemaContributor({
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../packages/engine-s3-plugin/src/index.ts"],"sourcesContent":["import { Plugin, SchemaContributorArgs } from '@contember/engine-plugins'\nimport { S3ConfigProcessor } from './S3ConfigProcessor'\nimport { S3SchemaContributor } from './S3SchemaContributor'\nimport { S3ServiceFactory } from './S3Service'\nimport { Project3Config } from './Config'\n\nexport * from './S3ObjectAuthorizator'\nexport * from './S3SchemaContributor'\nexport * from './S3Service'\n\nexport default class S3 implements Plugin<Project3Config> {\n\tname = 'contember/s3'\n\n\tgetConfigProcessor() {\n\t\treturn new S3ConfigProcessor()\n\t}\n\n\tgetSchemaContributor({ providers }: SchemaContributorArgs) {\n\t\tconst s3ServiceFactory = new S3ServiceFactory()\n\t\treturn new S3SchemaContributor(s3ServiceFactory, providers)\n\t}\n}\n"],"names":[],"mappings":";;;;;;;;AAUA,MAAqB,GAAqC;AAAA,EAA1D,cAAA;AACQ,kBAAA,MAAA,QAAA,cAAA;AAAA,EAAA;AAAA,EAEP,qBAAqB;AACpB,WAAO,IAAI,kBAAkB;AAAA,EAAA;AAAA,EAG9B,qBAAqB,EAAE,aAAoC;AACpD,UAAA,mBAAmB,IAAI,iBAAiB;AACvC,WAAA,IAAI,oBAAoB,kBAAkB,SAAS;AAAA,EAAA;AAE5D;"}
|
|
@@ -5,13 +5,15 @@ const Config = require("./Config.cjs");
|
|
|
5
5
|
const S3SchemaTypes = require("./S3SchemaTypes.cjs");
|
|
6
6
|
const S3ObjectAuthorizator = require("./S3ObjectAuthorizator.cjs");
|
|
7
7
|
class S3SchemaContributor {
|
|
8
|
-
constructor(
|
|
9
|
-
this.s3Config = s3Config;
|
|
8
|
+
constructor(s3Factory, providers) {
|
|
10
9
|
this.s3Factory = s3Factory;
|
|
11
10
|
this.providers = providers;
|
|
12
11
|
}
|
|
12
|
+
getCacheKey({ project }) {
|
|
13
|
+
return project.s3 ? "yes" : "no";
|
|
14
|
+
}
|
|
13
15
|
createSchema(context) {
|
|
14
|
-
if (!
|
|
16
|
+
if (!context.project.s3) {
|
|
15
17
|
return void 0;
|
|
16
18
|
}
|
|
17
19
|
const rules = context.identity.projectRoles.flatMap(
|
|
@@ -27,11 +29,9 @@ class S3SchemaContributor {
|
|
|
27
29
|
if (uploadRules.length === 0 && readRules.length == 0) {
|
|
28
30
|
return void 0;
|
|
29
31
|
}
|
|
30
|
-
const s3Config = Config.resolveS3Config(this.s3Config);
|
|
31
32
|
const authorizator = new S3ObjectAuthorizator.S3ObjectAuthorizator(uploadRules, readRules);
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const readMutation = this.createReadMutation(s3);
|
|
33
|
+
const uploadMutation = this.createUploadMutation(authorizator);
|
|
34
|
+
const readMutation = this.createReadMutation(authorizator);
|
|
35
35
|
const mutation = {
|
|
36
36
|
generateUploadUrl: uploadMutation,
|
|
37
37
|
generateReadUrl: readMutation
|
|
@@ -51,7 +51,7 @@ class S3SchemaContributor {
|
|
|
51
51
|
})
|
|
52
52
|
};
|
|
53
53
|
}
|
|
54
|
-
createReadMutation(
|
|
54
|
+
createReadMutation(authorizator) {
|
|
55
55
|
return {
|
|
56
56
|
type: new graphql.GraphQLNonNull(S3SchemaTypes.S3SignedRead),
|
|
57
57
|
args: {
|
|
@@ -62,12 +62,17 @@ class S3SchemaContributor {
|
|
|
62
62
|
type: graphql.GraphQLInt
|
|
63
63
|
}
|
|
64
64
|
},
|
|
65
|
-
resolve: async (parent, args) => {
|
|
65
|
+
resolve: async (parent, args, ctx) => {
|
|
66
|
+
if (!ctx.project.s3) {
|
|
67
|
+
throw new graphql.GraphQLError("S3 is not configured for this project");
|
|
68
|
+
}
|
|
69
|
+
const s3Config = Config.resolveS3Config(ctx.project.s3);
|
|
70
|
+
const s3 = this.s3Factory.create(s3Config, this.providers, authorizator);
|
|
66
71
|
return s3.getSignedReadUrl({ objectKey: args.objectKey, expiration: args.expiration ?? null });
|
|
67
72
|
}
|
|
68
73
|
};
|
|
69
74
|
}
|
|
70
|
-
createUploadMutation(
|
|
75
|
+
createUploadMutation(authorizator) {
|
|
71
76
|
return {
|
|
72
77
|
type: new graphql.GraphQLNonNull(S3SchemaTypes.S3SignedUpload),
|
|
73
78
|
args: {
|
|
@@ -77,7 +82,12 @@ class S3SchemaContributor {
|
|
|
77
82
|
prefix: { type: graphql.GraphQLString, deprecationReason: "Use input.prefix" },
|
|
78
83
|
acl: { type: S3SchemaTypes.S3Acl, deprecationReason: "Use input.acl" }
|
|
79
84
|
},
|
|
80
|
-
resolve: async (parent, args) => {
|
|
85
|
+
resolve: async (parent, args, ctx) => {
|
|
86
|
+
if (!ctx.project.s3) {
|
|
87
|
+
throw new graphql.GraphQLError("S3 is not configured for this project");
|
|
88
|
+
}
|
|
89
|
+
const s3Config = Config.resolveS3Config(ctx.project.s3);
|
|
90
|
+
const s3 = this.s3Factory.create(s3Config, this.providers, authorizator);
|
|
81
91
|
return s3.getSignedUploadUrl({
|
|
82
92
|
acl: args.input?.acl ?? args.acl ?? null,
|
|
83
93
|
contentDisposition: args.input?.contentDisposition ?? null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"S3SchemaContributor.cjs","sources":["../../../../packages/engine-s3-plugin/src/S3SchemaContributor.ts"],"sourcesContent":["import {\n\tGraphQLFieldConfig,\n\tGraphQLInt,\n\tGraphQLNonNull,\n\tGraphQLObjectType,\n\tGraphQLSchema,\n\tGraphQLSchemaConfig,\n\tGraphQLString,\n} from 'graphql'\nimport { S3Service, S3ServiceFactory } from './S3Service'\nimport { resolveS3Config, S3Config } from './Config'\nimport { GraphQLSchemaContributor, GraphQLSchemaContributorContext, Providers } from '@contember/engine-plugins'\nimport * as types from './S3SchemaTypes'\nimport { S3Acl, S3GenerateSignedUploadInput, S3SignedRead, S3SignedUpload } from './S3SchemaTypes'\nimport { S3ObjectAuthorizator } from './S3ObjectAuthorizator'\n\ninterface Identity {\n\tprojectRoles: string[]\n}\n\nexport type S3SchemaUploadAcl =\n\t| boolean\n\t| {\n\t\tmaxSize?: number\n\t}\n\nexport type S3SchemaAcl = Record<\n\tstring, // public/*.jpg\n\t{\n\t\tread?: boolean\n\t\tupload?: S3SchemaUploadAcl\n\t}\n>\n\n\nexport class S3SchemaContributor implements GraphQLSchemaContributor {\n\tconstructor(\n\t\tprivate readonly
|
|
1
|
+
{"version":3,"file":"S3SchemaContributor.cjs","sources":["../../../../packages/engine-s3-plugin/src/S3SchemaContributor.ts"],"sourcesContent":["import {\n\tGraphQLError,\n\tGraphQLFieldConfig,\n\tGraphQLInt,\n\tGraphQLNonNull,\n\tGraphQLObjectType,\n\tGraphQLSchema,\n\tGraphQLSchemaConfig,\n\tGraphQLString,\n} from 'graphql'\nimport { S3Service, S3ServiceFactory } from './S3Service'\nimport { Project3Config, resolveS3Config, S3Config } from './Config'\nimport { GraphQLSchemaContributor, GraphQLSchemaContributorContext, Providers } from '@contember/engine-plugins'\nimport * as types from './S3SchemaTypes'\nimport { S3Acl, S3GenerateSignedUploadInput, S3SignedRead, S3SignedUpload } from './S3SchemaTypes'\nimport { S3ObjectAuthorizator } from './S3ObjectAuthorizator'\n\ninterface Identity {\n\tprojectRoles: string[]\n}\n\nexport type S3SchemaUploadAcl =\n\t| boolean\n\t| {\n\t\tmaxSize?: number\n\t}\n\nexport type S3SchemaAcl = Record<\n\tstring, // public/*.jpg\n\t{\n\t\tread?: boolean\n\t\tupload?: S3SchemaUploadAcl\n\t}\n>\n\n\nexport class S3SchemaContributor implements GraphQLSchemaContributor {\n\tconstructor(\n\t\tprivate readonly s3Factory: S3ServiceFactory,\n\t\tprivate readonly providers: Providers,\n\t) {}\n\n\tgetCacheKey?({ project }: GraphQLSchemaContributorContext): string {\n\t\treturn project.s3 ? 'yes' : 'no'\n\t}\n\n\tcreateSchema(context: GraphQLSchemaContributorContext): GraphQLSchemaConfig | undefined {\n\t\tif (!context.project.s3) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst rules = context.identity.projectRoles.flatMap(it =>\n\t\t\tObject.entries((context.schema.acl.roles[it]?.s3 as S3SchemaAcl) || {}),\n\t\t)\n\n\n\t\tconst uploadRules = rules.filter(([, it]) => it.upload).map(([it, val]) => ({\n\t\t\tpattern: it,\n\t\t\t...(typeof val.upload !== 'boolean' ? val.upload : {}),\n\t\t}))\n\t\tconst readRules = rules.filter(([, it]) => it.read).map(([it]) => ({\n\t\t\tpattern: it,\n\t\t}))\n\n\t\tif (uploadRules.length === 0 && readRules.length == 0) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tconst authorizator = new S3ObjectAuthorizator(uploadRules, readRules)\n\t\tconst uploadMutation = this.createUploadMutation(authorizator)\n\t\tconst readMutation = this.createReadMutation(authorizator)\n\t\tconst mutation = {\n\t\t\tgenerateUploadUrl: uploadMutation as GraphQLFieldConfig<any, any, any>,\n\t\t\tgenerateReadUrl: readMutation,\n\t\t}\n\t\treturn {\n\t\t\tmutation: new GraphQLObjectType({\n\t\t\t\tname: 'Mutation',\n\t\t\t\tfields: () => mutation,\n\t\t\t}),\n\t\t\tquery: new GraphQLObjectType({\n\t\t\t\tname: 'Query',\n\t\t\t\tfields: () => ({\n\t\t\t\t\ts3DummyQuery: {\n\t\t\t\t\t\ttype: GraphQLString,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t}),\n\t\t}\n\t}\n\n\tprivate createReadMutation(authorizator: S3ObjectAuthorizator): GraphQLFieldConfig<any, { project: Project3Config }, any> {\n\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(S3SignedRead),\n\t\t\targs: {\n\t\t\t\tobjectKey: {\n\t\t\t\t\ttype: new GraphQLNonNull(GraphQLString),\n\t\t\t\t},\n\t\t\t\texpiration: {\n\t\t\t\t\ttype: GraphQLInt,\n\t\t\t\t},\n\t\t\t},\n\t\t\tresolve: async (parent: any, args: { objectKey: string; expiration?: number }, ctx: { project: Project3Config }) => {\n\t\t\t\tif (!ctx.project.s3) {\n\t\t\t\t\tthrow new GraphQLError('S3 is not configured for this project')\n\t\t\t\t}\n\t\t\t\tconst s3Config = resolveS3Config(ctx.project.s3)\n\t\t\t\tconst s3 = this.s3Factory.create(s3Config, this.providers, authorizator)\n\t\t\t\treturn s3.getSignedReadUrl({ objectKey: args.objectKey, expiration: args.expiration ?? null })\n\t\t\t},\n\t\t} as GraphQLFieldConfig<any, any, any>\n\t}\n\n\tprivate createUploadMutation(authorizator: S3ObjectAuthorizator): GraphQLFieldConfig<any, any, any> {\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(S3SignedUpload),\n\t\t\targs: {\n\t\t\t\tinput: { type: types.S3GenerateSignedUploadInput },\n\t\t\t\tcontentType: { type: GraphQLString, deprecationReason: 'Use input.contentType' },\n\t\t\t\texpiration: { type: GraphQLInt, deprecationReason: 'Use input.expiration' },\n\t\t\t\tprefix: { type: GraphQLString, deprecationReason: 'Use input.prefix' },\n\t\t\t\tacl: { type: types.S3Acl, deprecationReason: 'Use input.acl' },\n\t\t\t},\n\t\t\tresolve: async (\n\t\t\t\tparent: any,\n\t\t\t\targs: { input?: Partial<S3GenerateSignedUploadInput>; contentType?: string; acl?: S3Acl; expiration?: number; prefix?: string },\n\t\t\t\tctx: { project: Project3Config },\n\t\t\t) => {\n\t\t\t\tif (!ctx.project.s3) {\n\t\t\t\t\tthrow new GraphQLError('S3 is not configured for this project')\n\t\t\t\t}\n\t\t\t\tconst s3Config = resolveS3Config(ctx.project.s3)\n\t\t\t\tconst s3 = this.s3Factory.create(s3Config, this.providers, authorizator)\n\t\t\t\treturn s3.getSignedUploadUrl({\n\t\t\t\t\tacl: args.input?.acl ?? args.acl ?? null,\n\t\t\t\t\tcontentDisposition: args.input?.contentDisposition ?? null,\n\t\t\t\t\tcontentType: args.input?.contentType ?? args.contentType ?? null,\n\t\t\t\t\texpiration: args.input?.expiration ?? args.expiration ?? null,\n\t\t\t\t\textension: args.input?.extension ?? null,\n\t\t\t\t\tfileName: args.input?.fileName ?? null,\n\t\t\t\t\tprefix: args.input?.prefix ?? args.prefix ?? null,\n\t\t\t\t\tsuffix: args.input?.suffix ?? null,\n\t\t\t\t\tsize: args.input?.size ?? null,\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n}\n"],"names":["S3ObjectAuthorizator","GraphQLObjectType","GraphQLString","GraphQLNonNull","S3SignedRead","GraphQLInt","GraphQLError","resolveS3Config","S3SignedUpload","types.S3GenerateSignedUploadInput","types.S3Acl"],"mappings":"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"}
|
|
@@ -1,15 +1,17 @@
|
|
|
1
|
-
import { GraphQLObjectType, GraphQLString, GraphQLNonNull, GraphQLInt } from "graphql";
|
|
1
|
+
import { GraphQLObjectType, GraphQLString, GraphQLNonNull, GraphQLInt, GraphQLError } from "graphql";
|
|
2
2
|
import { resolveS3Config } from "./Config.js";
|
|
3
3
|
import { S3SignedRead, S3SignedUpload, S3GenerateSignedUploadInput, S3Acl } from "./S3SchemaTypes.js";
|
|
4
4
|
import { S3ObjectAuthorizator } from "./S3ObjectAuthorizator.js";
|
|
5
5
|
class S3SchemaContributor {
|
|
6
|
-
constructor(
|
|
7
|
-
this.s3Config = s3Config;
|
|
6
|
+
constructor(s3Factory, providers) {
|
|
8
7
|
this.s3Factory = s3Factory;
|
|
9
8
|
this.providers = providers;
|
|
10
9
|
}
|
|
10
|
+
getCacheKey({ project }) {
|
|
11
|
+
return project.s3 ? "yes" : "no";
|
|
12
|
+
}
|
|
11
13
|
createSchema(context) {
|
|
12
|
-
if (!
|
|
14
|
+
if (!context.project.s3) {
|
|
13
15
|
return void 0;
|
|
14
16
|
}
|
|
15
17
|
const rules = context.identity.projectRoles.flatMap(
|
|
@@ -25,11 +27,9 @@ class S3SchemaContributor {
|
|
|
25
27
|
if (uploadRules.length === 0 && readRules.length == 0) {
|
|
26
28
|
return void 0;
|
|
27
29
|
}
|
|
28
|
-
const s3Config = resolveS3Config(this.s3Config);
|
|
29
30
|
const authorizator = new S3ObjectAuthorizator(uploadRules, readRules);
|
|
30
|
-
const
|
|
31
|
-
const
|
|
32
|
-
const readMutation = this.createReadMutation(s3);
|
|
31
|
+
const uploadMutation = this.createUploadMutation(authorizator);
|
|
32
|
+
const readMutation = this.createReadMutation(authorizator);
|
|
33
33
|
const mutation = {
|
|
34
34
|
generateUploadUrl: uploadMutation,
|
|
35
35
|
generateReadUrl: readMutation
|
|
@@ -49,7 +49,7 @@ class S3SchemaContributor {
|
|
|
49
49
|
})
|
|
50
50
|
};
|
|
51
51
|
}
|
|
52
|
-
createReadMutation(
|
|
52
|
+
createReadMutation(authorizator) {
|
|
53
53
|
return {
|
|
54
54
|
type: new GraphQLNonNull(S3SignedRead),
|
|
55
55
|
args: {
|
|
@@ -60,12 +60,17 @@ class S3SchemaContributor {
|
|
|
60
60
|
type: GraphQLInt
|
|
61
61
|
}
|
|
62
62
|
},
|
|
63
|
-
resolve: async (parent, args) => {
|
|
63
|
+
resolve: async (parent, args, ctx) => {
|
|
64
|
+
if (!ctx.project.s3) {
|
|
65
|
+
throw new GraphQLError("S3 is not configured for this project");
|
|
66
|
+
}
|
|
67
|
+
const s3Config = resolveS3Config(ctx.project.s3);
|
|
68
|
+
const s3 = this.s3Factory.create(s3Config, this.providers, authorizator);
|
|
64
69
|
return s3.getSignedReadUrl({ objectKey: args.objectKey, expiration: args.expiration ?? null });
|
|
65
70
|
}
|
|
66
71
|
};
|
|
67
72
|
}
|
|
68
|
-
createUploadMutation(
|
|
73
|
+
createUploadMutation(authorizator) {
|
|
69
74
|
return {
|
|
70
75
|
type: new GraphQLNonNull(S3SignedUpload),
|
|
71
76
|
args: {
|
|
@@ -75,7 +80,12 @@ class S3SchemaContributor {
|
|
|
75
80
|
prefix: { type: GraphQLString, deprecationReason: "Use input.prefix" },
|
|
76
81
|
acl: { type: S3Acl, deprecationReason: "Use input.acl" }
|
|
77
82
|
},
|
|
78
|
-
resolve: async (parent, args) => {
|
|
83
|
+
resolve: async (parent, args, ctx) => {
|
|
84
|
+
if (!ctx.project.s3) {
|
|
85
|
+
throw new GraphQLError("S3 is not configured for this project");
|
|
86
|
+
}
|
|
87
|
+
const s3Config = resolveS3Config(ctx.project.s3);
|
|
88
|
+
const s3 = this.s3Factory.create(s3Config, this.providers, authorizator);
|
|
79
89
|
return s3.getSignedUploadUrl({
|
|
80
90
|
acl: args.input?.acl ?? args.acl ?? null,
|
|
81
91
|
contentDisposition: args.input?.contentDisposition ?? null,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"S3SchemaContributor.js","sources":["../../../../packages/engine-s3-plugin/src/S3SchemaContributor.ts"],"sourcesContent":["import {\n\tGraphQLFieldConfig,\n\tGraphQLInt,\n\tGraphQLNonNull,\n\tGraphQLObjectType,\n\tGraphQLSchema,\n\tGraphQLSchemaConfig,\n\tGraphQLString,\n} from 'graphql'\nimport { S3Service, S3ServiceFactory } from './S3Service'\nimport { resolveS3Config, S3Config } from './Config'\nimport { GraphQLSchemaContributor, GraphQLSchemaContributorContext, Providers } from '@contember/engine-plugins'\nimport * as types from './S3SchemaTypes'\nimport { S3Acl, S3GenerateSignedUploadInput, S3SignedRead, S3SignedUpload } from './S3SchemaTypes'\nimport { S3ObjectAuthorizator } from './S3ObjectAuthorizator'\n\ninterface Identity {\n\tprojectRoles: string[]\n}\n\nexport type S3SchemaUploadAcl =\n\t| boolean\n\t| {\n\t\tmaxSize?: number\n\t}\n\nexport type S3SchemaAcl = Record<\n\tstring, // public/*.jpg\n\t{\n\t\tread?: boolean\n\t\tupload?: S3SchemaUploadAcl\n\t}\n>\n\n\nexport class S3SchemaContributor implements GraphQLSchemaContributor {\n\tconstructor(\n\t\tprivate readonly
|
|
1
|
+
{"version":3,"file":"S3SchemaContributor.js","sources":["../../../../packages/engine-s3-plugin/src/S3SchemaContributor.ts"],"sourcesContent":["import {\n\tGraphQLError,\n\tGraphQLFieldConfig,\n\tGraphQLInt,\n\tGraphQLNonNull,\n\tGraphQLObjectType,\n\tGraphQLSchema,\n\tGraphQLSchemaConfig,\n\tGraphQLString,\n} from 'graphql'\nimport { S3Service, S3ServiceFactory } from './S3Service'\nimport { Project3Config, resolveS3Config, S3Config } from './Config'\nimport { GraphQLSchemaContributor, GraphQLSchemaContributorContext, Providers } from '@contember/engine-plugins'\nimport * as types from './S3SchemaTypes'\nimport { S3Acl, S3GenerateSignedUploadInput, S3SignedRead, S3SignedUpload } from './S3SchemaTypes'\nimport { S3ObjectAuthorizator } from './S3ObjectAuthorizator'\n\ninterface Identity {\n\tprojectRoles: string[]\n}\n\nexport type S3SchemaUploadAcl =\n\t| boolean\n\t| {\n\t\tmaxSize?: number\n\t}\n\nexport type S3SchemaAcl = Record<\n\tstring, // public/*.jpg\n\t{\n\t\tread?: boolean\n\t\tupload?: S3SchemaUploadAcl\n\t}\n>\n\n\nexport class S3SchemaContributor implements GraphQLSchemaContributor {\n\tconstructor(\n\t\tprivate readonly s3Factory: S3ServiceFactory,\n\t\tprivate readonly providers: Providers,\n\t) {}\n\n\tgetCacheKey?({ project }: GraphQLSchemaContributorContext): string {\n\t\treturn project.s3 ? 'yes' : 'no'\n\t}\n\n\tcreateSchema(context: GraphQLSchemaContributorContext): GraphQLSchemaConfig | undefined {\n\t\tif (!context.project.s3) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst rules = context.identity.projectRoles.flatMap(it =>\n\t\t\tObject.entries((context.schema.acl.roles[it]?.s3 as S3SchemaAcl) || {}),\n\t\t)\n\n\n\t\tconst uploadRules = rules.filter(([, it]) => it.upload).map(([it, val]) => ({\n\t\t\tpattern: it,\n\t\t\t...(typeof val.upload !== 'boolean' ? val.upload : {}),\n\t\t}))\n\t\tconst readRules = rules.filter(([, it]) => it.read).map(([it]) => ({\n\t\t\tpattern: it,\n\t\t}))\n\n\t\tif (uploadRules.length === 0 && readRules.length == 0) {\n\t\t\treturn undefined\n\t\t}\n\n\t\tconst authorizator = new S3ObjectAuthorizator(uploadRules, readRules)\n\t\tconst uploadMutation = this.createUploadMutation(authorizator)\n\t\tconst readMutation = this.createReadMutation(authorizator)\n\t\tconst mutation = {\n\t\t\tgenerateUploadUrl: uploadMutation as GraphQLFieldConfig<any, any, any>,\n\t\t\tgenerateReadUrl: readMutation,\n\t\t}\n\t\treturn {\n\t\t\tmutation: new GraphQLObjectType({\n\t\t\t\tname: 'Mutation',\n\t\t\t\tfields: () => mutation,\n\t\t\t}),\n\t\t\tquery: new GraphQLObjectType({\n\t\t\t\tname: 'Query',\n\t\t\t\tfields: () => ({\n\t\t\t\t\ts3DummyQuery: {\n\t\t\t\t\t\ttype: GraphQLString,\n\t\t\t\t\t},\n\t\t\t\t}),\n\t\t\t}),\n\t\t}\n\t}\n\n\tprivate createReadMutation(authorizator: S3ObjectAuthorizator): GraphQLFieldConfig<any, { project: Project3Config }, any> {\n\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(S3SignedRead),\n\t\t\targs: {\n\t\t\t\tobjectKey: {\n\t\t\t\t\ttype: new GraphQLNonNull(GraphQLString),\n\t\t\t\t},\n\t\t\t\texpiration: {\n\t\t\t\t\ttype: GraphQLInt,\n\t\t\t\t},\n\t\t\t},\n\t\t\tresolve: async (parent: any, args: { objectKey: string; expiration?: number }, ctx: { project: Project3Config }) => {\n\t\t\t\tif (!ctx.project.s3) {\n\t\t\t\t\tthrow new GraphQLError('S3 is not configured for this project')\n\t\t\t\t}\n\t\t\t\tconst s3Config = resolveS3Config(ctx.project.s3)\n\t\t\t\tconst s3 = this.s3Factory.create(s3Config, this.providers, authorizator)\n\t\t\t\treturn s3.getSignedReadUrl({ objectKey: args.objectKey, expiration: args.expiration ?? null })\n\t\t\t},\n\t\t} as GraphQLFieldConfig<any, any, any>\n\t}\n\n\tprivate createUploadMutation(authorizator: S3ObjectAuthorizator): GraphQLFieldConfig<any, any, any> {\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(S3SignedUpload),\n\t\t\targs: {\n\t\t\t\tinput: { type: types.S3GenerateSignedUploadInput },\n\t\t\t\tcontentType: { type: GraphQLString, deprecationReason: 'Use input.contentType' },\n\t\t\t\texpiration: { type: GraphQLInt, deprecationReason: 'Use input.expiration' },\n\t\t\t\tprefix: { type: GraphQLString, deprecationReason: 'Use input.prefix' },\n\t\t\t\tacl: { type: types.S3Acl, deprecationReason: 'Use input.acl' },\n\t\t\t},\n\t\t\tresolve: async (\n\t\t\t\tparent: any,\n\t\t\t\targs: { input?: Partial<S3GenerateSignedUploadInput>; contentType?: string; acl?: S3Acl; expiration?: number; prefix?: string },\n\t\t\t\tctx: { project: Project3Config },\n\t\t\t) => {\n\t\t\t\tif (!ctx.project.s3) {\n\t\t\t\t\tthrow new GraphQLError('S3 is not configured for this project')\n\t\t\t\t}\n\t\t\t\tconst s3Config = resolveS3Config(ctx.project.s3)\n\t\t\t\tconst s3 = this.s3Factory.create(s3Config, this.providers, authorizator)\n\t\t\t\treturn s3.getSignedUploadUrl({\n\t\t\t\t\tacl: args.input?.acl ?? args.acl ?? null,\n\t\t\t\t\tcontentDisposition: args.input?.contentDisposition ?? null,\n\t\t\t\t\tcontentType: args.input?.contentType ?? args.contentType ?? null,\n\t\t\t\t\texpiration: args.input?.expiration ?? args.expiration ?? null,\n\t\t\t\t\textension: args.input?.extension ?? null,\n\t\t\t\t\tfileName: args.input?.fileName ?? null,\n\t\t\t\t\tprefix: args.input?.prefix ?? args.prefix ?? null,\n\t\t\t\t\tsuffix: args.input?.suffix ?? null,\n\t\t\t\t\tsize: args.input?.size ?? null,\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n}\n"],"names":["types.S3GenerateSignedUploadInput","types.S3Acl"],"mappings":"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"}
|