@contember/engine-content-api 2.0.0-beta.3 → 2.0.0-beta.4
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/src/acl/Authorizator.cjs +3 -0
- package/dist/development/src/acl/Authorizator.cjs.map +1 -1
- package/dist/development/src/acl/Authorizator.js +3 -0
- package/dist/development/src/acl/Authorizator.js.map +1 -1
- package/dist/development/src/acl/PermissionFactory.cjs +11 -2
- package/dist/development/src/acl/PermissionFactory.cjs.map +1 -1
- package/dist/development/src/acl/PermissionFactory.js +11 -2
- package/dist/development/src/acl/PermissionFactory.js.map +1 -1
- package/dist/development/src/schema/MutationProvider.cjs +12 -0
- package/dist/development/src/schema/MutationProvider.cjs.map +1 -1
- package/dist/development/src/schema/MutationProvider.js +12 -0
- package/dist/development/src/schema/MutationProvider.js.map +1 -1
- package/dist/development/src/schema/QueryProvider.cjs +3 -0
- package/dist/development/src/schema/QueryProvider.cjs.map +1 -1
- package/dist/development/src/schema/QueryProvider.js +3 -0
- package/dist/development/src/schema/QueryProvider.js.map +1 -1
- package/dist/production/src/acl/Authorizator.cjs +3 -0
- package/dist/production/src/acl/Authorizator.cjs.map +1 -1
- package/dist/production/src/acl/Authorizator.js +3 -0
- package/dist/production/src/acl/Authorizator.js.map +1 -1
- package/dist/production/src/acl/PermissionFactory.cjs +11 -2
- package/dist/production/src/acl/PermissionFactory.cjs.map +1 -1
- package/dist/production/src/acl/PermissionFactory.js +11 -2
- package/dist/production/src/acl/PermissionFactory.js.map +1 -1
- package/dist/production/src/schema/MutationProvider.cjs +12 -0
- package/dist/production/src/schema/MutationProvider.cjs.map +1 -1
- package/dist/production/src/schema/MutationProvider.js +12 -0
- package/dist/production/src/schema/MutationProvider.js.map +1 -1
- package/dist/production/src/schema/QueryProvider.cjs +3 -0
- package/dist/production/src/schema/QueryProvider.cjs.map +1 -1
- package/dist/production/src/schema/QueryProvider.js +3 -0
- package/dist/production/src/schema/QueryProvider.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/dist/types/acl/Authorizator.d.ts +1 -0
- package/dist/types/acl/Authorizator.d.ts.map +1 -1
- package/dist/types/acl/PermissionFactory.d.ts.map +1 -1
- package/dist/types/schema/MutationProvider.d.ts.map +1 -1
- package/dist/types/schema/QueryProvider.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +10 -10
- package/src/acl/Authorizator.ts +4 -0
- package/src/acl/PermissionFactory.ts +12 -2
- package/src/schema/MutationProvider.ts +13 -0
- package/src/schema/QueryProvider.ts +3 -0
- package/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.ts +43 -1
- package/tests/cases/integration/graphQlSchema/schema-no-root-ops.gql +308 -0
- package/tests/cases/unit/permissionMerger.test.ts +120 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Authorizator.js","sources":["../../../../../packages/engine-content-api/src/acl/Authorizator.ts"],"sourcesContent":["import { Acl } from '@contember/schema'\n\n\nexport type AuthorizationResult = 'yes' | 'no' | 'maybe'\n\nexport class Authorizator {\n\tconstructor(\n\t\tprivate readonly permissions: Acl.Permissions,\n\t\tprivate readonly defaultCustomPrimary: boolean,\n\t) {\n\t}\n\n\tgetEntityPermission(operation: Acl.Operation, entity: string): AuthorizationResult {\n\t\tif (!this.permissions[entity]) {\n\t\t\treturn 'no'\n\t\t}\n\t\tconst entityPermissions: Acl.EntityPermissions = this.permissions[entity]\n\n\t\tif (operation === Acl.Operation.delete) {\n\t\t\treturn this.predicateToResult(entityPermissions.operations.delete)\n\t\t}\n\t\tconst fieldPermissions = entityPermissions.operations[operation]\n\t\tif (!fieldPermissions) {\n\t\t\treturn 'no'\n\t\t}\n\t\treturn Object.values(fieldPermissions).filter(it => !!it).length > 0 ? 'yes' : 'no'\n\t}\n\n\tgetFieldPredicate(operation: Acl.Operation.create | Acl.Operation.read | Acl.Operation.update, entity: string, field: string): Acl.Predicate {\n\t\treturn this.permissions[entity]?.operations[operation]?.[field] ?? false\n\t}\n\n\tgetFieldPermissions(operation: Acl.Operation.create | Acl.Operation.read | Acl.Operation.update, entity: string, field: string): AuthorizationResult {\n\t\tconst fieldPermissions = this.getFieldPredicate(operation, entity, field)\n\t\tif (!fieldPermissions) {\n\t\t\treturn 'no'\n\t\t}\n\t\treturn this.predicateToResult(fieldPermissions)\n\t}\n\n\tprivate predicateToResult(predicate: Acl.Predicate | undefined): AuthorizationResult {\n\t\tif (!predicate) {\n\t\t\treturn 'no'\n\t\t}\n\t\tif (predicate === true) {\n\t\t\treturn 'yes'\n\t\t}\n\t\treturn 'maybe'\n\t}\n\n\n\tisCustomPrimaryAllowed(entity: string): boolean {\n\t\treturn this.permissions?.[entity]?.operations?.customPrimary ?? this.defaultCustomPrimary\n\t}\n}\n"],"names":[],"mappings":";AAKO,MAAM,aAAa;AAAA,EACzB,YACkB,aACA,sBAChB;AAFgB,SAAA,cAAA;AACA,SAAA,uBAAA;AAAA,EAAA;AAAA,EAIlB,oBAAoB,WAA0B,QAAqC;AAClF,QAAI,CAAC,KAAK,YAAY,MAAM,GAAG;AACvB,aAAA;AAAA,IAAA;AAEF,UAAA,oBAA2C,KAAK,YAAY,MAAM;AAEpE,QAAA,cAAc,IAAI,UAAU,QAAQ;AACvC,aAAO,KAAK,kBAAkB,kBAAkB,WAAW,MAAM;AAAA,IAAA;AAE5D,UAAA,mBAAmB,kBAAkB,WAAW,SAAS;AAC/D,QAAI,CAAC,kBAAkB;AACf,aAAA;AAAA,IAAA;AAER,WAAO,OAAO,OAAO,gBAAgB,EAAE,OAAO,CAAA,OAAM,CAAC,CAAC,EAAE,EAAE,SAAS,IAAI,QAAQ;AAAA,EAAA;AAAA,EAGhF,kBAAkB,WAA6E,QAAgB,OAA8B;AACrI,WAAA,KAAK,YAAY,MAAM,GAAG,WAAW,SAAS,IAAI,KAAK,KAAK;AAAA,EAAA;AAAA,EAGpE,oBAAoB,WAA6E,QAAgB,OAAoC;AACpJ,UAAM,mBAAmB,KAAK,kBAAkB,WAAW,QAAQ,KAAK;AACxE,QAAI,CAAC,kBAAkB;AACf,aAAA;AAAA,IAAA;AAED,WAAA,KAAK,kBAAkB,gBAAgB;AAAA,EAAA;AAAA,EAGvC,kBAAkB,WAA2D;AACpF,QAAI,CAAC,WAAW;AACR,aAAA;AAAA,IAAA;AAER,QAAI,cAAc,MAAM;AAChB,aAAA;AAAA,IAAA;AAED,WAAA;AAAA,EAAA;AAAA,EAIR,uBAAuB,QAAyB;AAC/C,WAAO,KAAK,cAAc,MAAM,GAAG,YAAY,iBAAiB,KAAK;AAAA,EAAA;
|
|
1
|
+
{"version":3,"file":"Authorizator.js","sources":["../../../../../packages/engine-content-api/src/acl/Authorizator.ts"],"sourcesContent":["import { Acl } from '@contember/schema'\n\n\nexport type AuthorizationResult = 'yes' | 'no' | 'maybe'\n\nexport class Authorizator {\n\tconstructor(\n\t\tprivate readonly permissions: Acl.Permissions,\n\t\tprivate readonly defaultCustomPrimary: boolean,\n\t) {\n\t}\n\n\tgetEntityPermission(operation: Acl.Operation, entity: string): AuthorizationResult {\n\t\tif (!this.permissions[entity]) {\n\t\t\treturn 'no'\n\t\t}\n\t\tconst entityPermissions: Acl.EntityPermissions = this.permissions[entity]\n\n\t\tif (operation === Acl.Operation.delete) {\n\t\t\treturn this.predicateToResult(entityPermissions.operations.delete)\n\t\t}\n\t\tconst fieldPermissions = entityPermissions.operations[operation]\n\t\tif (!fieldPermissions) {\n\t\t\treturn 'no'\n\t\t}\n\t\treturn Object.values(fieldPermissions).filter(it => !!it).length > 0 ? 'yes' : 'no'\n\t}\n\n\tgetFieldPredicate(operation: Acl.Operation.create | Acl.Operation.read | Acl.Operation.update, entity: string, field: string): Acl.Predicate {\n\t\treturn this.permissions[entity]?.operations[operation]?.[field] ?? false\n\t}\n\n\tgetFieldPermissions(operation: Acl.Operation.create | Acl.Operation.read | Acl.Operation.update, entity: string, field: string): AuthorizationResult {\n\t\tconst fieldPermissions = this.getFieldPredicate(operation, entity, field)\n\t\tif (!fieldPermissions) {\n\t\t\treturn 'no'\n\t\t}\n\t\treturn this.predicateToResult(fieldPermissions)\n\t}\n\n\tprivate predicateToResult(predicate: Acl.Predicate | undefined): AuthorizationResult {\n\t\tif (!predicate) {\n\t\t\treturn 'no'\n\t\t}\n\t\tif (predicate === true) {\n\t\t\treturn 'yes'\n\t\t}\n\t\treturn 'maybe'\n\t}\n\n\n\tisCustomPrimaryAllowed(entity: string): boolean {\n\t\treturn this.permissions?.[entity]?.operations?.customPrimary ?? this.defaultCustomPrimary\n\t}\n\n\tisRootOperationDisallowed(entity: string, operation: Acl.Operation): boolean {\n\t\treturn this.permissions?.[entity]?.operations?.noRoot?.includes(operation) ?? false\n\t}\n}\n"],"names":[],"mappings":";AAKO,MAAM,aAAa;AAAA,EACzB,YACkB,aACA,sBAChB;AAFgB,SAAA,cAAA;AACA,SAAA,uBAAA;AAAA,EAAA;AAAA,EAIlB,oBAAoB,WAA0B,QAAqC;AAClF,QAAI,CAAC,KAAK,YAAY,MAAM,GAAG;AACvB,aAAA;AAAA,IAAA;AAEF,UAAA,oBAA2C,KAAK,YAAY,MAAM;AAEpE,QAAA,cAAc,IAAI,UAAU,QAAQ;AACvC,aAAO,KAAK,kBAAkB,kBAAkB,WAAW,MAAM;AAAA,IAAA;AAE5D,UAAA,mBAAmB,kBAAkB,WAAW,SAAS;AAC/D,QAAI,CAAC,kBAAkB;AACf,aAAA;AAAA,IAAA;AAER,WAAO,OAAO,OAAO,gBAAgB,EAAE,OAAO,CAAA,OAAM,CAAC,CAAC,EAAE,EAAE,SAAS,IAAI,QAAQ;AAAA,EAAA;AAAA,EAGhF,kBAAkB,WAA6E,QAAgB,OAA8B;AACrI,WAAA,KAAK,YAAY,MAAM,GAAG,WAAW,SAAS,IAAI,KAAK,KAAK;AAAA,EAAA;AAAA,EAGpE,oBAAoB,WAA6E,QAAgB,OAAoC;AACpJ,UAAM,mBAAmB,KAAK,kBAAkB,WAAW,QAAQ,KAAK;AACxE,QAAI,CAAC,kBAAkB;AACf,aAAA;AAAA,IAAA;AAED,WAAA,KAAK,kBAAkB,gBAAgB;AAAA,EAAA;AAAA,EAGvC,kBAAkB,WAA2D;AACpF,QAAI,CAAC,WAAW;AACR,aAAA;AAAA,IAAA;AAER,QAAI,cAAc,MAAM;AAChB,aAAA;AAAA,IAAA;AAED,WAAA;AAAA,EAAA;AAAA,EAIR,uBAAuB,QAAyB;AAC/C,WAAO,KAAK,cAAc,MAAM,GAAG,YAAY,iBAAiB,KAAK;AAAA,EAAA;AAAA,EAGtE,0BAA0B,QAAgB,WAAmC;AACrE,WAAA,KAAK,cAAc,MAAM,GAAG,YAAY,QAAQ,SAAS,SAAS,KAAK;AAAA,EAAA;AAEhF;"}
|
|
@@ -99,14 +99,20 @@ class PermissionFactory {
|
|
|
99
99
|
if (left.operations.customPrimary || right.operations.customPrimary) {
|
|
100
100
|
operations.customPrimary = true;
|
|
101
101
|
}
|
|
102
|
+
const noRoot = [];
|
|
102
103
|
const operationNames = [
|
|
103
104
|
"create",
|
|
104
105
|
"read",
|
|
105
106
|
"update"
|
|
106
107
|
];
|
|
107
108
|
for (let operation of operationNames) {
|
|
108
|
-
const
|
|
109
|
-
const
|
|
109
|
+
const leftNoRoot = left.operations.noRoot?.includes(operation) || false;
|
|
110
|
+
const rightNoRoot = right.operations.noRoot?.includes(operation) || false;
|
|
111
|
+
if (leftNoRoot && rightNoRoot) {
|
|
112
|
+
noRoot.push(operation);
|
|
113
|
+
}
|
|
114
|
+
const leftFieldPermissions = leftNoRoot && !rightNoRoot ? {} : left.operations[operation] || {};
|
|
115
|
+
const rightFieldPermissions = rightNoRoot && !leftNoRoot ? {} : right.operations[operation] || {};
|
|
110
116
|
const [operationPredicates, fieldPermissions] = this.mergeFieldPermissions(
|
|
111
117
|
left.predicates,
|
|
112
118
|
leftFieldPermissions,
|
|
@@ -130,6 +136,9 @@ class PermissionFactory {
|
|
|
130
136
|
predicates[predicate] = predicateDefinition;
|
|
131
137
|
operations.delete = predicate;
|
|
132
138
|
}
|
|
139
|
+
if (noRoot.length > 0) {
|
|
140
|
+
operations.noRoot = noRoot;
|
|
141
|
+
}
|
|
133
142
|
return {
|
|
134
143
|
predicates,
|
|
135
144
|
operations
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionFactory.cjs","sources":["../../../../../packages/engine-content-api/src/acl/PermissionFactory.ts"],"sourcesContent":["import { Acl, Model, Schema, Writable } from '@contember/schema'\nimport { getEntity, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { mapObject } from '../utils'\nimport { prefixVariable } from './VariableUtils'\n\nexport interface Identity {\n\tprojectRoles: readonly string[]\n}\n\nexport class PermissionFactory {\n\tpublic create(schema: Schema, roles: readonly string[], prefix?: string): Acl.Permissions {\n\t\tlet result: Acl.Permissions = {}\n\t\tfor (let role of roles) {\n\t\t\tconst roleDefinition = schema.acl.roles[role] || { entities: {} }\n\t\t\tlet rolePermissions: Acl.Permissions = this.prefixPredicatesWithRole(schema.model, roleDefinition.entities, prefix || role)\n\t\t\tif (roleDefinition.inherits) {\n\t\t\t\tconst inheritedPermissions = this.create(schema, roleDefinition.inherits, prefix || role)\n\t\t\t\trolePermissions = this.mergePermissions(inheritedPermissions, rolePermissions)\n\t\t\t}\n\t\t\tresult = this.mergePermissions(result, rolePermissions)\n\t\t}\n\t\tresult = this.makePrimaryPredicatesUnionOfAllFields(schema.model, result)\n\n\t\treturn result\n\t}\n\n\tprivate prefixPredicatesWithRole(model: Model.Schema, permissions: Acl.Permissions, role: string): Acl.Permissions {\n\t\treturn mapObject(permissions, ({ operations, predicates }, entityName) => ({\n\t\t\toperations,\n\t\t\tpredicates: mapObject(predicates, predicate => {\n\t\t\t\tconst predicateDefinitionProcessor = new PredicateDefinitionProcessor(model)\n\t\t\t\treturn predicateDefinitionProcessor.process(getEntity(model, entityName), predicate, {\n\t\t\t\t\thandleColumn: ({ value }) => {\n\t\t\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\t\t\treturn prefixVariable(role, value)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn value\n\t\t\t\t\t},\n\t\t\t\t\thandleRelation: ({ value }) => {\n\t\t\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\t\t\treturn prefixVariable(role, value)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn value\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}),\n\t\t}))\n\t}\n\n\tprivate makePrimaryPredicatesUnionOfAllFields(model: Model.Schema, permissions: Acl.Permissions): Acl.Permissions {\n\t\treturn mapObject(permissions, (permission, entityName): Acl.EntityPermissions => {\n\t\t\tconst entity = getEntity(model, entityName)\n\t\t\tconst entityPredicates: Writable<Acl.PredicateMap> = { ...permission.predicates }\n\t\t\tconst entityOperations: Writable<Acl.EntityOperations> = { ...permission.operations }\n\n\t\t\tconst operationNames = ['read', 'create', 'update'] as const\n\t\t\tfor (let operation of operationNames) {\n\t\t\t\tif (!entityOperations[operation]) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst fieldPermissions: Writable<Acl.FieldPermissions> = { ...entityOperations[operation] }\n\t\t\t\tentityOperations[operation] = fieldPermissions\n\n\t\t\t\tif (Object.values(fieldPermissions).some(it => it === true)) {\n\t\t\t\t\tfieldPermissions[entity.primary] = true\n\t\t\t\t}\n\t\t\t\tif (fieldPermissions[entity.primary] === true) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst predicateReferences: string[] = Object.entries(fieldPermissions)\n\t\t\t\t\t.filter(([key]) => key !== entity.primary)\n\t\t\t\t\t.map(([key, value]) => value)\n\t\t\t\t\t.filter(value => value !== false)\n\t\t\t\t\t.filter((value, index, array): value is string => array.indexOf(value) === index)\n\n\t\t\t\tlet idPermissions: Acl.Predicate = fieldPermissions[entity.primary] || false\n\n\t\t\t\tfor (let predicateReference of predicateReferences) {\n\t\t\t\t\tconst [predicateDefinition, predicate] = this.mergePredicates(\n\t\t\t\t\t\tentityPredicates,\n\t\t\t\t\t\tidPermissions,\n\t\t\t\t\t\tentityPredicates,\n\t\t\t\t\t\tpredicateReference,\n\t\t\t\t\t)\n\t\t\t\t\tif (typeof predicate !== 'string' || predicateDefinition === undefined) {\n\t\t\t\t\t\tthrow new Error('should not happen')\n\t\t\t\t\t}\n\t\t\t\t\tidPermissions = predicate\n\t\t\t\t\tentityPredicates[predicate] = predicateDefinition\n\t\t\t\t}\n\t\t\t\tfieldPermissions[entity.primary] = idPermissions\n\t\t\t\tentityPredicates[idPermissions as Acl.PredicateReference] = entityPredicates[idPermissions as Acl.PredicateReference]\n\t\t\t}\n\t\t\treturn {\n\t\t\t\toperations: entityOperations,\n\t\t\t\tpredicates: entityPredicates,\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate mergePermissions(left: Acl.Permissions, right: Acl.Permissions): Acl.Permissions {\n\t\tconst result = { ...left }\n\t\tfor (let entityName in right) {\n\t\t\tif (result[entityName] !== undefined) {\n\t\t\t\tresult[entityName] = this.mergeEntityPermissions(result[entityName], right[entityName])\n\t\t\t} else {\n\t\t\t\tresult[entityName] = right[entityName]\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}\n\n\tprivate mergeEntityPermissions(left: Acl.EntityPermissions, right: Acl.EntityPermissions): Acl.EntityPermissions {\n\t\tlet predicates: Writable<Acl.PredicateMap> = {}\n\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\tif (left.operations.customPrimary || right.operations.customPrimary) {\n\t\t\toperations.customPrimary = true\n\t\t}\n\n\t\tconst operationNames: (keyof Pick<Acl.EntityOperations, 'create' | 'read' | 'update'>)[] = [\n\t\t\t'create',\n\t\t\t'read',\n\t\t\t'update',\n\t\t]\n\n\t\tfor (let operation of operationNames) {\n\t\t\tconst leftFieldPermissions: Acl.FieldPermissions = left.operations[operation] || {}\n\t\t\tconst rightFieldPermissions: Acl.FieldPermissions = right.operations[operation] || {}\n\t\t\tconst [operationPredicates, fieldPermissions] = this.mergeFieldPermissions(\n\t\t\t\tleft.predicates,\n\t\t\t\tleftFieldPermissions,\n\t\t\t\tright.predicates,\n\t\t\t\trightFieldPermissions,\n\t\t\t)\n\t\t\tpredicates = { ...predicates, ...operationPredicates }\n\t\t\tif (Object.keys(fieldPermissions).length > 0) {\n\t\t\t\toperations[operation] = fieldPermissions\n\t\t\t}\n\t\t}\n\n\t\tconst [predicateDefinition, predicate] = this.mergePredicates(\n\t\t\tleft.predicates,\n\t\t\tleft.operations.delete || false,\n\t\t\tright.predicates,\n\t\t\tright.operations.delete || false,\n\t\t)\n\t\tif (predicate === true) {\n\t\t\toperations.delete = true\n\t\t} else if (predicateDefinition !== undefined && typeof predicate === 'string') {\n\t\t\tpredicates[predicate] = predicateDefinition\n\t\t\toperations.delete = predicate\n\t\t}\n\n\t\treturn {\n\t\t\tpredicates: predicates,\n\t\t\toperations: operations,\n\t\t}\n\t}\n\n\tprivate mergeFieldPermissions(\n\t\tleftPredicates: Acl.PredicateMap,\n\t\tleftFieldPermissions: Acl.FieldPermissions,\n\t\trightPredicates: Acl.PredicateMap,\n\t\trightFieldPermissions: Acl.FieldPermissions,\n\t): [Acl.PredicateMap, Acl.FieldPermissions] {\n\t\tconst fields: Writable<Acl.FieldPermissions> = {}\n\t\tconst predicates: Writable<Acl.PredicateMap> = {}\n\n\t\tfor (let field in { ...leftFieldPermissions, ...rightFieldPermissions }) {\n\t\t\tconst [predicateDefinition, predicate] = this.mergePredicates(\n\t\t\t\tleftPredicates,\n\t\t\t\tleftFieldPermissions[field] || false,\n\t\t\t\trightPredicates,\n\t\t\t\trightFieldPermissions[field] || false,\n\t\t\t)\n\t\t\tif (predicate === true) {\n\t\t\t\tfields[field] = true\n\t\t\t} else if (predicateDefinition !== undefined && typeof predicate === 'string') {\n\t\t\t\tfields[field] = predicate\n\t\t\t\tpredicates[predicate] = predicateDefinition\n\t\t\t}\n\t\t}\n\n\t\treturn [predicates, fields]\n\t}\n\n\tprivate mergePredicates(\n\t\tleftPredicates: Acl.PredicateMap,\n\t\tleftReference: Acl.Predicate,\n\t\trightPredicates: Acl.PredicateMap,\n\t\trightReference: Acl.Predicate,\n\t): [Acl.PredicateDefinition, Acl.PredicateReference] | [undefined, boolean] {\n\t\tif (leftReference === true || rightReference === true) {\n\t\t\treturn [undefined, true]\n\t\t}\n\n\t\tif (leftReference !== false && rightReference !== false) {\n\t\t\tconst leftPredicate: Acl.PredicateDefinition = leftPredicates[leftReference]\n\t\t\tconst rightPredicate: Acl.PredicateDefinition = rightPredicates[rightReference]\n\t\t\tif (leftPredicate === rightPredicate) {\n\t\t\t\treturn [leftPredicate, leftReference]\n\t\t\t}\n\n\t\t\tlet predicateName = '__merge__' + leftReference + '__' + rightReference\n\t\t\twhile (leftPredicates[predicateName]) {\n\t\t\t\tpredicateName += '_'\n\t\t\t}\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tor: [leftPredicate, rightPredicate],\n\t\t\t\t} as Acl.PredicateDefinition,\n\t\t\t\tpredicateName,\n\t\t\t]\n\t\t} else if (leftReference !== false) {\n\t\t\treturn [leftPredicates[leftReference], leftReference]\n\t\t} else if (rightReference !== false) {\n\t\t\tlet predicateName = rightReference\n\t\t\tif (rightPredicates !== leftPredicates) {\n\t\t\t\twhile (leftPredicates[predicateName]) {\n\t\t\t\t\tpredicateName += '_'\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [rightPredicates[rightReference], predicateName]\n\t\t} else {\n\t\t\treturn [undefined, false]\n\t\t}\n\t}\n}\n"],"names":["mapObject","PredicateDefinitionProcessor","getEntity","prefixVariable"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PermissionFactory.cjs","sources":["../../../../../packages/engine-content-api/src/acl/PermissionFactory.ts"],"sourcesContent":["import { Acl, Model, Schema, Writable } from '@contember/schema'\nimport { getEntity, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { mapObject } from '../utils'\nimport { prefixVariable } from './VariableUtils'\n\nexport interface Identity {\n\tprojectRoles: readonly string[]\n}\n\nexport class PermissionFactory {\n\tpublic create(schema: Schema, roles: readonly string[], prefix?: string): Acl.Permissions {\n\t\tlet result: Acl.Permissions = {}\n\t\tfor (let role of roles) {\n\t\t\tconst roleDefinition = schema.acl.roles[role] || { entities: {} }\n\t\t\tlet rolePermissions: Acl.Permissions = this.prefixPredicatesWithRole(schema.model, roleDefinition.entities, prefix || role)\n\t\t\tif (roleDefinition.inherits) {\n\t\t\t\tconst inheritedPermissions = this.create(schema, roleDefinition.inherits, prefix || role)\n\t\t\t\trolePermissions = this.mergePermissions(inheritedPermissions, rolePermissions)\n\t\t\t}\n\t\t\tresult = this.mergePermissions(result, rolePermissions)\n\t\t}\n\t\tresult = this.makePrimaryPredicatesUnionOfAllFields(schema.model, result)\n\n\t\treturn result\n\t}\n\n\tprivate prefixPredicatesWithRole(model: Model.Schema, permissions: Acl.Permissions, role: string): Acl.Permissions {\n\t\treturn mapObject(permissions, ({ operations, predicates }, entityName) => ({\n\t\t\toperations,\n\t\t\tpredicates: mapObject(predicates, predicate => {\n\t\t\t\tconst predicateDefinitionProcessor = new PredicateDefinitionProcessor(model)\n\t\t\t\treturn predicateDefinitionProcessor.process(getEntity(model, entityName), predicate, {\n\t\t\t\t\thandleColumn: ({ value }) => {\n\t\t\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\t\t\treturn prefixVariable(role, value)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn value\n\t\t\t\t\t},\n\t\t\t\t\thandleRelation: ({ value }) => {\n\t\t\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\t\t\treturn prefixVariable(role, value)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn value\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}),\n\t\t}))\n\t}\n\n\tprivate makePrimaryPredicatesUnionOfAllFields(model: Model.Schema, permissions: Acl.Permissions): Acl.Permissions {\n\t\treturn mapObject(permissions, (permission, entityName): Acl.EntityPermissions => {\n\t\t\tconst entity = getEntity(model, entityName)\n\t\t\tconst entityPredicates: Writable<Acl.PredicateMap> = { ...permission.predicates }\n\t\t\tconst entityOperations: Writable<Acl.EntityOperations> = { ...permission.operations }\n\n\t\t\tconst operationNames = ['read', 'create', 'update'] as const\n\t\t\tfor (let operation of operationNames) {\n\t\t\t\tif (!entityOperations[operation]) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst fieldPermissions: Writable<Acl.FieldPermissions> = { ...entityOperations[operation] }\n\t\t\t\tentityOperations[operation] = fieldPermissions\n\n\t\t\t\tif (Object.values(fieldPermissions).some(it => it === true)) {\n\t\t\t\t\tfieldPermissions[entity.primary] = true\n\t\t\t\t}\n\t\t\t\tif (fieldPermissions[entity.primary] === true) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst predicateReferences: string[] = Object.entries(fieldPermissions)\n\t\t\t\t\t.filter(([key]) => key !== entity.primary)\n\t\t\t\t\t.map(([key, value]) => value)\n\t\t\t\t\t.filter(value => value !== false)\n\t\t\t\t\t.filter((value, index, array): value is string => array.indexOf(value) === index)\n\n\t\t\t\tlet idPermissions: Acl.Predicate = fieldPermissions[entity.primary] || false\n\n\t\t\t\tfor (let predicateReference of predicateReferences) {\n\t\t\t\t\tconst [predicateDefinition, predicate] = this.mergePredicates(\n\t\t\t\t\t\tentityPredicates,\n\t\t\t\t\t\tidPermissions,\n\t\t\t\t\t\tentityPredicates,\n\t\t\t\t\t\tpredicateReference,\n\t\t\t\t\t)\n\t\t\t\t\tif (typeof predicate !== 'string' || predicateDefinition === undefined) {\n\t\t\t\t\t\tthrow new Error('should not happen')\n\t\t\t\t\t}\n\t\t\t\t\tidPermissions = predicate\n\t\t\t\t\tentityPredicates[predicate] = predicateDefinition\n\t\t\t\t}\n\t\t\t\tfieldPermissions[entity.primary] = idPermissions\n\t\t\t\tentityPredicates[idPermissions as Acl.PredicateReference] = entityPredicates[idPermissions as Acl.PredicateReference]\n\t\t\t}\n\t\t\treturn {\n\t\t\t\toperations: entityOperations,\n\t\t\t\tpredicates: entityPredicates,\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate mergePermissions(left: Acl.Permissions, right: Acl.Permissions): Acl.Permissions {\n\t\tconst result = { ...left }\n\t\tfor (let entityName in right) {\n\t\t\tif (result[entityName] !== undefined) {\n\t\t\t\tresult[entityName] = this.mergeEntityPermissions(result[entityName], right[entityName])\n\t\t\t} else {\n\t\t\t\tresult[entityName] = right[entityName]\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}\n\n\tprivate mergeEntityPermissions(left: Acl.EntityPermissions, right: Acl.EntityPermissions): Acl.EntityPermissions {\n\t\tlet predicates: Writable<Acl.PredicateMap> = {}\n\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\tif (left.operations.customPrimary || right.operations.customPrimary) {\n\t\t\toperations.customPrimary = true\n\t\t}\n\t\tconst noRoot: `${Acl.Operation}`[] = []\n\n\t\tconst operationNames: (keyof Pick<Acl.EntityOperations, 'create' | 'read' | 'update'>)[] = [\n\t\t\t'create',\n\t\t\t'read',\n\t\t\t'update',\n\t\t]\n\n\t\tfor (let operation of operationNames) {\n\t\t\tconst leftNoRoot = left.operations.noRoot?.includes(operation) || false\n\t\t\tconst rightNoRoot = right.operations.noRoot?.includes(operation) || false\n\t\t\tif (leftNoRoot && rightNoRoot) {\n\t\t\t\tnoRoot.push(operation)\n\t\t\t}\n\n\t\t\tconst leftFieldPermissions: Acl.FieldPermissions = leftNoRoot && !rightNoRoot ? {} : (left.operations[operation] || {})\n\t\t\tconst rightFieldPermissions: Acl.FieldPermissions = rightNoRoot && !leftNoRoot ? {} : (right.operations[operation] || {})\n\t\t\tconst [operationPredicates, fieldPermissions] = this.mergeFieldPermissions(\n\t\t\t\tleft.predicates,\n\t\t\t\tleftFieldPermissions,\n\t\t\t\tright.predicates,\n\t\t\t\trightFieldPermissions,\n\t\t\t)\n\t\t\tpredicates = { ...predicates, ...operationPredicates }\n\t\t\tif (Object.keys(fieldPermissions).length > 0) {\n\t\t\t\toperations[operation] = fieldPermissions\n\t\t\t}\n\t\t}\n\n\t\tconst [predicateDefinition, predicate] = this.mergePredicates(\n\t\t\tleft.predicates,\n\t\t\tleft.operations.delete || false,\n\t\t\tright.predicates,\n\t\t\tright.operations.delete || false,\n\t\t)\n\t\tif (predicate === true) {\n\t\t\toperations.delete = true\n\t\t} else if (predicateDefinition !== undefined && typeof predicate === 'string') {\n\t\t\tpredicates[predicate] = predicateDefinition\n\t\t\toperations.delete = predicate\n\t\t}\n\t\tif (noRoot.length > 0) {\n\t\t\toperations.noRoot = noRoot\n\t\t}\n\n\t\treturn {\n\t\t\tpredicates: predicates,\n\t\t\toperations: operations,\n\t\t}\n\t}\n\n\tprivate mergeFieldPermissions(\n\t\tleftPredicates: Acl.PredicateMap,\n\t\tleftFieldPermissions: Acl.FieldPermissions,\n\t\trightPredicates: Acl.PredicateMap,\n\t\trightFieldPermissions: Acl.FieldPermissions,\n\t): [Acl.PredicateMap, Acl.FieldPermissions] {\n\t\tconst fields: Writable<Acl.FieldPermissions> = {}\n\t\tconst predicates: Writable<Acl.PredicateMap> = {}\n\n\t\tfor (let field in { ...leftFieldPermissions, ...rightFieldPermissions }) {\n\t\t\tconst [predicateDefinition, predicate] = this.mergePredicates(\n\t\t\t\tleftPredicates,\n\t\t\t\tleftFieldPermissions[field] || false,\n\t\t\t\trightPredicates,\n\t\t\t\trightFieldPermissions[field] || false,\n\t\t\t)\n\t\t\tif (predicate === true) {\n\t\t\t\tfields[field] = true\n\t\t\t} else if (predicateDefinition !== undefined && typeof predicate === 'string') {\n\t\t\t\tfields[field] = predicate\n\t\t\t\tpredicates[predicate] = predicateDefinition\n\t\t\t}\n\t\t}\n\n\t\treturn [predicates, fields]\n\t}\n\n\tprivate mergePredicates(\n\t\tleftPredicates: Acl.PredicateMap,\n\t\tleftReference: Acl.Predicate,\n\t\trightPredicates: Acl.PredicateMap,\n\t\trightReference: Acl.Predicate,\n\t): [Acl.PredicateDefinition, Acl.PredicateReference] | [undefined, boolean] {\n\t\tif (leftReference === true || rightReference === true) {\n\t\t\treturn [undefined, true]\n\t\t}\n\n\t\tif (leftReference !== false && rightReference !== false) {\n\t\t\tconst leftPredicate: Acl.PredicateDefinition = leftPredicates[leftReference]\n\t\t\tconst rightPredicate: Acl.PredicateDefinition = rightPredicates[rightReference]\n\t\t\tif (leftPredicate === rightPredicate) {\n\t\t\t\treturn [leftPredicate, leftReference]\n\t\t\t}\n\n\t\t\tlet predicateName = '__merge__' + leftReference + '__' + rightReference\n\t\t\twhile (leftPredicates[predicateName]) {\n\t\t\t\tpredicateName += '_'\n\t\t\t}\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tor: [leftPredicate, rightPredicate],\n\t\t\t\t} as Acl.PredicateDefinition,\n\t\t\t\tpredicateName,\n\t\t\t]\n\t\t} else if (leftReference !== false) {\n\t\t\treturn [leftPredicates[leftReference], leftReference]\n\t\t} else if (rightReference !== false) {\n\t\t\tlet predicateName = rightReference\n\t\t\tif (rightPredicates !== leftPredicates) {\n\t\t\t\twhile (leftPredicates[predicateName]) {\n\t\t\t\t\tpredicateName += '_'\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [rightPredicates[rightReference], predicateName]\n\t\t} else {\n\t\t\treturn [undefined, false]\n\t\t}\n\t}\n}\n"],"names":["mapObject","PredicateDefinitionProcessor","getEntity","prefixVariable"],"mappings":"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"}
|
|
@@ -97,14 +97,20 @@ class PermissionFactory {
|
|
|
97
97
|
if (left.operations.customPrimary || right.operations.customPrimary) {
|
|
98
98
|
operations.customPrimary = true;
|
|
99
99
|
}
|
|
100
|
+
const noRoot = [];
|
|
100
101
|
const operationNames = [
|
|
101
102
|
"create",
|
|
102
103
|
"read",
|
|
103
104
|
"update"
|
|
104
105
|
];
|
|
105
106
|
for (let operation of operationNames) {
|
|
106
|
-
const
|
|
107
|
-
const
|
|
107
|
+
const leftNoRoot = left.operations.noRoot?.includes(operation) || false;
|
|
108
|
+
const rightNoRoot = right.operations.noRoot?.includes(operation) || false;
|
|
109
|
+
if (leftNoRoot && rightNoRoot) {
|
|
110
|
+
noRoot.push(operation);
|
|
111
|
+
}
|
|
112
|
+
const leftFieldPermissions = leftNoRoot && !rightNoRoot ? {} : left.operations[operation] || {};
|
|
113
|
+
const rightFieldPermissions = rightNoRoot && !leftNoRoot ? {} : right.operations[operation] || {};
|
|
108
114
|
const [operationPredicates, fieldPermissions] = this.mergeFieldPermissions(
|
|
109
115
|
left.predicates,
|
|
110
116
|
leftFieldPermissions,
|
|
@@ -128,6 +134,9 @@ class PermissionFactory {
|
|
|
128
134
|
predicates[predicate] = predicateDefinition;
|
|
129
135
|
operations.delete = predicate;
|
|
130
136
|
}
|
|
137
|
+
if (noRoot.length > 0) {
|
|
138
|
+
operations.noRoot = noRoot;
|
|
139
|
+
}
|
|
131
140
|
return {
|
|
132
141
|
predicates,
|
|
133
142
|
operations
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionFactory.js","sources":["../../../../../packages/engine-content-api/src/acl/PermissionFactory.ts"],"sourcesContent":["import { Acl, Model, Schema, Writable } from '@contember/schema'\nimport { getEntity, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { mapObject } from '../utils'\nimport { prefixVariable } from './VariableUtils'\n\nexport interface Identity {\n\tprojectRoles: readonly string[]\n}\n\nexport class PermissionFactory {\n\tpublic create(schema: Schema, roles: readonly string[], prefix?: string): Acl.Permissions {\n\t\tlet result: Acl.Permissions = {}\n\t\tfor (let role of roles) {\n\t\t\tconst roleDefinition = schema.acl.roles[role] || { entities: {} }\n\t\t\tlet rolePermissions: Acl.Permissions = this.prefixPredicatesWithRole(schema.model, roleDefinition.entities, prefix || role)\n\t\t\tif (roleDefinition.inherits) {\n\t\t\t\tconst inheritedPermissions = this.create(schema, roleDefinition.inherits, prefix || role)\n\t\t\t\trolePermissions = this.mergePermissions(inheritedPermissions, rolePermissions)\n\t\t\t}\n\t\t\tresult = this.mergePermissions(result, rolePermissions)\n\t\t}\n\t\tresult = this.makePrimaryPredicatesUnionOfAllFields(schema.model, result)\n\n\t\treturn result\n\t}\n\n\tprivate prefixPredicatesWithRole(model: Model.Schema, permissions: Acl.Permissions, role: string): Acl.Permissions {\n\t\treturn mapObject(permissions, ({ operations, predicates }, entityName) => ({\n\t\t\toperations,\n\t\t\tpredicates: mapObject(predicates, predicate => {\n\t\t\t\tconst predicateDefinitionProcessor = new PredicateDefinitionProcessor(model)\n\t\t\t\treturn predicateDefinitionProcessor.process(getEntity(model, entityName), predicate, {\n\t\t\t\t\thandleColumn: ({ value }) => {\n\t\t\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\t\t\treturn prefixVariable(role, value)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn value\n\t\t\t\t\t},\n\t\t\t\t\thandleRelation: ({ value }) => {\n\t\t\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\t\t\treturn prefixVariable(role, value)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn value\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}),\n\t\t}))\n\t}\n\n\tprivate makePrimaryPredicatesUnionOfAllFields(model: Model.Schema, permissions: Acl.Permissions): Acl.Permissions {\n\t\treturn mapObject(permissions, (permission, entityName): Acl.EntityPermissions => {\n\t\t\tconst entity = getEntity(model, entityName)\n\t\t\tconst entityPredicates: Writable<Acl.PredicateMap> = { ...permission.predicates }\n\t\t\tconst entityOperations: Writable<Acl.EntityOperations> = { ...permission.operations }\n\n\t\t\tconst operationNames = ['read', 'create', 'update'] as const\n\t\t\tfor (let operation of operationNames) {\n\t\t\t\tif (!entityOperations[operation]) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst fieldPermissions: Writable<Acl.FieldPermissions> = { ...entityOperations[operation] }\n\t\t\t\tentityOperations[operation] = fieldPermissions\n\n\t\t\t\tif (Object.values(fieldPermissions).some(it => it === true)) {\n\t\t\t\t\tfieldPermissions[entity.primary] = true\n\t\t\t\t}\n\t\t\t\tif (fieldPermissions[entity.primary] === true) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst predicateReferences: string[] = Object.entries(fieldPermissions)\n\t\t\t\t\t.filter(([key]) => key !== entity.primary)\n\t\t\t\t\t.map(([key, value]) => value)\n\t\t\t\t\t.filter(value => value !== false)\n\t\t\t\t\t.filter((value, index, array): value is string => array.indexOf(value) === index)\n\n\t\t\t\tlet idPermissions: Acl.Predicate = fieldPermissions[entity.primary] || false\n\n\t\t\t\tfor (let predicateReference of predicateReferences) {\n\t\t\t\t\tconst [predicateDefinition, predicate] = this.mergePredicates(\n\t\t\t\t\t\tentityPredicates,\n\t\t\t\t\t\tidPermissions,\n\t\t\t\t\t\tentityPredicates,\n\t\t\t\t\t\tpredicateReference,\n\t\t\t\t\t)\n\t\t\t\t\tif (typeof predicate !== 'string' || predicateDefinition === undefined) {\n\t\t\t\t\t\tthrow new Error('should not happen')\n\t\t\t\t\t}\n\t\t\t\t\tidPermissions = predicate\n\t\t\t\t\tentityPredicates[predicate] = predicateDefinition\n\t\t\t\t}\n\t\t\t\tfieldPermissions[entity.primary] = idPermissions\n\t\t\t\tentityPredicates[idPermissions as Acl.PredicateReference] = entityPredicates[idPermissions as Acl.PredicateReference]\n\t\t\t}\n\t\t\treturn {\n\t\t\t\toperations: entityOperations,\n\t\t\t\tpredicates: entityPredicates,\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate mergePermissions(left: Acl.Permissions, right: Acl.Permissions): Acl.Permissions {\n\t\tconst result = { ...left }\n\t\tfor (let entityName in right) {\n\t\t\tif (result[entityName] !== undefined) {\n\t\t\t\tresult[entityName] = this.mergeEntityPermissions(result[entityName], right[entityName])\n\t\t\t} else {\n\t\t\t\tresult[entityName] = right[entityName]\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}\n\n\tprivate mergeEntityPermissions(left: Acl.EntityPermissions, right: Acl.EntityPermissions): Acl.EntityPermissions {\n\t\tlet predicates: Writable<Acl.PredicateMap> = {}\n\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\tif (left.operations.customPrimary || right.operations.customPrimary) {\n\t\t\toperations.customPrimary = true\n\t\t}\n\n\t\tconst operationNames: (keyof Pick<Acl.EntityOperations, 'create' | 'read' | 'update'>)[] = [\n\t\t\t'create',\n\t\t\t'read',\n\t\t\t'update',\n\t\t]\n\n\t\tfor (let operation of operationNames) {\n\t\t\tconst leftFieldPermissions: Acl.FieldPermissions = left.operations[operation] || {}\n\t\t\tconst rightFieldPermissions: Acl.FieldPermissions = right.operations[operation] || {}\n\t\t\tconst [operationPredicates, fieldPermissions] = this.mergeFieldPermissions(\n\t\t\t\tleft.predicates,\n\t\t\t\tleftFieldPermissions,\n\t\t\t\tright.predicates,\n\t\t\t\trightFieldPermissions,\n\t\t\t)\n\t\t\tpredicates = { ...predicates, ...operationPredicates }\n\t\t\tif (Object.keys(fieldPermissions).length > 0) {\n\t\t\t\toperations[operation] = fieldPermissions\n\t\t\t}\n\t\t}\n\n\t\tconst [predicateDefinition, predicate] = this.mergePredicates(\n\t\t\tleft.predicates,\n\t\t\tleft.operations.delete || false,\n\t\t\tright.predicates,\n\t\t\tright.operations.delete || false,\n\t\t)\n\t\tif (predicate === true) {\n\t\t\toperations.delete = true\n\t\t} else if (predicateDefinition !== undefined && typeof predicate === 'string') {\n\t\t\tpredicates[predicate] = predicateDefinition\n\t\t\toperations.delete = predicate\n\t\t}\n\n\t\treturn {\n\t\t\tpredicates: predicates,\n\t\t\toperations: operations,\n\t\t}\n\t}\n\n\tprivate mergeFieldPermissions(\n\t\tleftPredicates: Acl.PredicateMap,\n\t\tleftFieldPermissions: Acl.FieldPermissions,\n\t\trightPredicates: Acl.PredicateMap,\n\t\trightFieldPermissions: Acl.FieldPermissions,\n\t): [Acl.PredicateMap, Acl.FieldPermissions] {\n\t\tconst fields: Writable<Acl.FieldPermissions> = {}\n\t\tconst predicates: Writable<Acl.PredicateMap> = {}\n\n\t\tfor (let field in { ...leftFieldPermissions, ...rightFieldPermissions }) {\n\t\t\tconst [predicateDefinition, predicate] = this.mergePredicates(\n\t\t\t\tleftPredicates,\n\t\t\t\tleftFieldPermissions[field] || false,\n\t\t\t\trightPredicates,\n\t\t\t\trightFieldPermissions[field] || false,\n\t\t\t)\n\t\t\tif (predicate === true) {\n\t\t\t\tfields[field] = true\n\t\t\t} else if (predicateDefinition !== undefined && typeof predicate === 'string') {\n\t\t\t\tfields[field] = predicate\n\t\t\t\tpredicates[predicate] = predicateDefinition\n\t\t\t}\n\t\t}\n\n\t\treturn [predicates, fields]\n\t}\n\n\tprivate mergePredicates(\n\t\tleftPredicates: Acl.PredicateMap,\n\t\tleftReference: Acl.Predicate,\n\t\trightPredicates: Acl.PredicateMap,\n\t\trightReference: Acl.Predicate,\n\t): [Acl.PredicateDefinition, Acl.PredicateReference] | [undefined, boolean] {\n\t\tif (leftReference === true || rightReference === true) {\n\t\t\treturn [undefined, true]\n\t\t}\n\n\t\tif (leftReference !== false && rightReference !== false) {\n\t\t\tconst leftPredicate: Acl.PredicateDefinition = leftPredicates[leftReference]\n\t\t\tconst rightPredicate: Acl.PredicateDefinition = rightPredicates[rightReference]\n\t\t\tif (leftPredicate === rightPredicate) {\n\t\t\t\treturn [leftPredicate, leftReference]\n\t\t\t}\n\n\t\t\tlet predicateName = '__merge__' + leftReference + '__' + rightReference\n\t\t\twhile (leftPredicates[predicateName]) {\n\t\t\t\tpredicateName += '_'\n\t\t\t}\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tor: [leftPredicate, rightPredicate],\n\t\t\t\t} as Acl.PredicateDefinition,\n\t\t\t\tpredicateName,\n\t\t\t]\n\t\t} else if (leftReference !== false) {\n\t\t\treturn [leftPredicates[leftReference], leftReference]\n\t\t} else if (rightReference !== false) {\n\t\t\tlet predicateName = rightReference\n\t\t\tif (rightPredicates !== leftPredicates) {\n\t\t\t\twhile (leftPredicates[predicateName]) {\n\t\t\t\t\tpredicateName += '_'\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [rightPredicates[rightReference], predicateName]\n\t\t} else {\n\t\t\treturn [undefined, false]\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PermissionFactory.js","sources":["../../../../../packages/engine-content-api/src/acl/PermissionFactory.ts"],"sourcesContent":["import { Acl, Model, Schema, Writable } from '@contember/schema'\nimport { getEntity, PredicateDefinitionProcessor } from '@contember/schema-utils'\nimport { mapObject } from '../utils'\nimport { prefixVariable } from './VariableUtils'\n\nexport interface Identity {\n\tprojectRoles: readonly string[]\n}\n\nexport class PermissionFactory {\n\tpublic create(schema: Schema, roles: readonly string[], prefix?: string): Acl.Permissions {\n\t\tlet result: Acl.Permissions = {}\n\t\tfor (let role of roles) {\n\t\t\tconst roleDefinition = schema.acl.roles[role] || { entities: {} }\n\t\t\tlet rolePermissions: Acl.Permissions = this.prefixPredicatesWithRole(schema.model, roleDefinition.entities, prefix || role)\n\t\t\tif (roleDefinition.inherits) {\n\t\t\t\tconst inheritedPermissions = this.create(schema, roleDefinition.inherits, prefix || role)\n\t\t\t\trolePermissions = this.mergePermissions(inheritedPermissions, rolePermissions)\n\t\t\t}\n\t\t\tresult = this.mergePermissions(result, rolePermissions)\n\t\t}\n\t\tresult = this.makePrimaryPredicatesUnionOfAllFields(schema.model, result)\n\n\t\treturn result\n\t}\n\n\tprivate prefixPredicatesWithRole(model: Model.Schema, permissions: Acl.Permissions, role: string): Acl.Permissions {\n\t\treturn mapObject(permissions, ({ operations, predicates }, entityName) => ({\n\t\t\toperations,\n\t\t\tpredicates: mapObject(predicates, predicate => {\n\t\t\t\tconst predicateDefinitionProcessor = new PredicateDefinitionProcessor(model)\n\t\t\t\treturn predicateDefinitionProcessor.process(getEntity(model, entityName), predicate, {\n\t\t\t\t\thandleColumn: ({ value }) => {\n\t\t\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\t\t\treturn prefixVariable(role, value)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn value\n\t\t\t\t\t},\n\t\t\t\t\thandleRelation: ({ value }) => {\n\t\t\t\t\t\tif (typeof value === 'string') {\n\t\t\t\t\t\t\treturn prefixVariable(role, value)\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn value\n\t\t\t\t\t},\n\t\t\t\t})\n\t\t\t}),\n\t\t}))\n\t}\n\n\tprivate makePrimaryPredicatesUnionOfAllFields(model: Model.Schema, permissions: Acl.Permissions): Acl.Permissions {\n\t\treturn mapObject(permissions, (permission, entityName): Acl.EntityPermissions => {\n\t\t\tconst entity = getEntity(model, entityName)\n\t\t\tconst entityPredicates: Writable<Acl.PredicateMap> = { ...permission.predicates }\n\t\t\tconst entityOperations: Writable<Acl.EntityOperations> = { ...permission.operations }\n\n\t\t\tconst operationNames = ['read', 'create', 'update'] as const\n\t\t\tfor (let operation of operationNames) {\n\t\t\t\tif (!entityOperations[operation]) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst fieldPermissions: Writable<Acl.FieldPermissions> = { ...entityOperations[operation] }\n\t\t\t\tentityOperations[operation] = fieldPermissions\n\n\t\t\t\tif (Object.values(fieldPermissions).some(it => it === true)) {\n\t\t\t\t\tfieldPermissions[entity.primary] = true\n\t\t\t\t}\n\t\t\t\tif (fieldPermissions[entity.primary] === true) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tconst predicateReferences: string[] = Object.entries(fieldPermissions)\n\t\t\t\t\t.filter(([key]) => key !== entity.primary)\n\t\t\t\t\t.map(([key, value]) => value)\n\t\t\t\t\t.filter(value => value !== false)\n\t\t\t\t\t.filter((value, index, array): value is string => array.indexOf(value) === index)\n\n\t\t\t\tlet idPermissions: Acl.Predicate = fieldPermissions[entity.primary] || false\n\n\t\t\t\tfor (let predicateReference of predicateReferences) {\n\t\t\t\t\tconst [predicateDefinition, predicate] = this.mergePredicates(\n\t\t\t\t\t\tentityPredicates,\n\t\t\t\t\t\tidPermissions,\n\t\t\t\t\t\tentityPredicates,\n\t\t\t\t\t\tpredicateReference,\n\t\t\t\t\t)\n\t\t\t\t\tif (typeof predicate !== 'string' || predicateDefinition === undefined) {\n\t\t\t\t\t\tthrow new Error('should not happen')\n\t\t\t\t\t}\n\t\t\t\t\tidPermissions = predicate\n\t\t\t\t\tentityPredicates[predicate] = predicateDefinition\n\t\t\t\t}\n\t\t\t\tfieldPermissions[entity.primary] = idPermissions\n\t\t\t\tentityPredicates[idPermissions as Acl.PredicateReference] = entityPredicates[idPermissions as Acl.PredicateReference]\n\t\t\t}\n\t\t\treturn {\n\t\t\t\toperations: entityOperations,\n\t\t\t\tpredicates: entityPredicates,\n\t\t\t}\n\t\t})\n\t}\n\n\tprivate mergePermissions(left: Acl.Permissions, right: Acl.Permissions): Acl.Permissions {\n\t\tconst result = { ...left }\n\t\tfor (let entityName in right) {\n\t\t\tif (result[entityName] !== undefined) {\n\t\t\t\tresult[entityName] = this.mergeEntityPermissions(result[entityName], right[entityName])\n\t\t\t} else {\n\t\t\t\tresult[entityName] = right[entityName]\n\t\t\t}\n\t\t}\n\t\treturn result\n\t}\n\n\tprivate mergeEntityPermissions(left: Acl.EntityPermissions, right: Acl.EntityPermissions): Acl.EntityPermissions {\n\t\tlet predicates: Writable<Acl.PredicateMap> = {}\n\t\tconst operations: Writable<Acl.EntityOperations> = {}\n\t\tif (left.operations.customPrimary || right.operations.customPrimary) {\n\t\t\toperations.customPrimary = true\n\t\t}\n\t\tconst noRoot: `${Acl.Operation}`[] = []\n\n\t\tconst operationNames: (keyof Pick<Acl.EntityOperations, 'create' | 'read' | 'update'>)[] = [\n\t\t\t'create',\n\t\t\t'read',\n\t\t\t'update',\n\t\t]\n\n\t\tfor (let operation of operationNames) {\n\t\t\tconst leftNoRoot = left.operations.noRoot?.includes(operation) || false\n\t\t\tconst rightNoRoot = right.operations.noRoot?.includes(operation) || false\n\t\t\tif (leftNoRoot && rightNoRoot) {\n\t\t\t\tnoRoot.push(operation)\n\t\t\t}\n\n\t\t\tconst leftFieldPermissions: Acl.FieldPermissions = leftNoRoot && !rightNoRoot ? {} : (left.operations[operation] || {})\n\t\t\tconst rightFieldPermissions: Acl.FieldPermissions = rightNoRoot && !leftNoRoot ? {} : (right.operations[operation] || {})\n\t\t\tconst [operationPredicates, fieldPermissions] = this.mergeFieldPermissions(\n\t\t\t\tleft.predicates,\n\t\t\t\tleftFieldPermissions,\n\t\t\t\tright.predicates,\n\t\t\t\trightFieldPermissions,\n\t\t\t)\n\t\t\tpredicates = { ...predicates, ...operationPredicates }\n\t\t\tif (Object.keys(fieldPermissions).length > 0) {\n\t\t\t\toperations[operation] = fieldPermissions\n\t\t\t}\n\t\t}\n\n\t\tconst [predicateDefinition, predicate] = this.mergePredicates(\n\t\t\tleft.predicates,\n\t\t\tleft.operations.delete || false,\n\t\t\tright.predicates,\n\t\t\tright.operations.delete || false,\n\t\t)\n\t\tif (predicate === true) {\n\t\t\toperations.delete = true\n\t\t} else if (predicateDefinition !== undefined && typeof predicate === 'string') {\n\t\t\tpredicates[predicate] = predicateDefinition\n\t\t\toperations.delete = predicate\n\t\t}\n\t\tif (noRoot.length > 0) {\n\t\t\toperations.noRoot = noRoot\n\t\t}\n\n\t\treturn {\n\t\t\tpredicates: predicates,\n\t\t\toperations: operations,\n\t\t}\n\t}\n\n\tprivate mergeFieldPermissions(\n\t\tleftPredicates: Acl.PredicateMap,\n\t\tleftFieldPermissions: Acl.FieldPermissions,\n\t\trightPredicates: Acl.PredicateMap,\n\t\trightFieldPermissions: Acl.FieldPermissions,\n\t): [Acl.PredicateMap, Acl.FieldPermissions] {\n\t\tconst fields: Writable<Acl.FieldPermissions> = {}\n\t\tconst predicates: Writable<Acl.PredicateMap> = {}\n\n\t\tfor (let field in { ...leftFieldPermissions, ...rightFieldPermissions }) {\n\t\t\tconst [predicateDefinition, predicate] = this.mergePredicates(\n\t\t\t\tleftPredicates,\n\t\t\t\tleftFieldPermissions[field] || false,\n\t\t\t\trightPredicates,\n\t\t\t\trightFieldPermissions[field] || false,\n\t\t\t)\n\t\t\tif (predicate === true) {\n\t\t\t\tfields[field] = true\n\t\t\t} else if (predicateDefinition !== undefined && typeof predicate === 'string') {\n\t\t\t\tfields[field] = predicate\n\t\t\t\tpredicates[predicate] = predicateDefinition\n\t\t\t}\n\t\t}\n\n\t\treturn [predicates, fields]\n\t}\n\n\tprivate mergePredicates(\n\t\tleftPredicates: Acl.PredicateMap,\n\t\tleftReference: Acl.Predicate,\n\t\trightPredicates: Acl.PredicateMap,\n\t\trightReference: Acl.Predicate,\n\t): [Acl.PredicateDefinition, Acl.PredicateReference] | [undefined, boolean] {\n\t\tif (leftReference === true || rightReference === true) {\n\t\t\treturn [undefined, true]\n\t\t}\n\n\t\tif (leftReference !== false && rightReference !== false) {\n\t\t\tconst leftPredicate: Acl.PredicateDefinition = leftPredicates[leftReference]\n\t\t\tconst rightPredicate: Acl.PredicateDefinition = rightPredicates[rightReference]\n\t\t\tif (leftPredicate === rightPredicate) {\n\t\t\t\treturn [leftPredicate, leftReference]\n\t\t\t}\n\n\t\t\tlet predicateName = '__merge__' + leftReference + '__' + rightReference\n\t\t\twhile (leftPredicates[predicateName]) {\n\t\t\t\tpredicateName += '_'\n\t\t\t}\n\t\t\treturn [\n\t\t\t\t{\n\t\t\t\t\tor: [leftPredicate, rightPredicate],\n\t\t\t\t} as Acl.PredicateDefinition,\n\t\t\t\tpredicateName,\n\t\t\t]\n\t\t} else if (leftReference !== false) {\n\t\t\treturn [leftPredicates[leftReference], leftReference]\n\t\t} else if (rightReference !== false) {\n\t\t\tlet predicateName = rightReference\n\t\t\tif (rightPredicates !== leftPredicates) {\n\t\t\t\twhile (leftPredicates[predicateName]) {\n\t\t\t\t\tpredicateName += '_'\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn [rightPredicates[rightReference], predicateName]\n\t\t} else {\n\t\t\treturn [undefined, false]\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,9 @@ class MutationProvider {
|
|
|
25
25
|
return object.filterObject(mutations, (key, value) => value !== void 0);
|
|
26
26
|
}
|
|
27
27
|
getCreateMutation(entity) {
|
|
28
|
+
if (this.authorizator.isRootOperationDisallowed(entity.name, schema.Acl.Operation.create)) {
|
|
29
|
+
return void 0;
|
|
30
|
+
}
|
|
28
31
|
const entityName = entity.name;
|
|
29
32
|
const dataType = this.createEntityInputProvider.getInput(entityName);
|
|
30
33
|
if (dataType === void 0) {
|
|
@@ -49,6 +52,9 @@ class MutationProvider {
|
|
|
49
52
|
}
|
|
50
53
|
getDeleteMutation(entity) {
|
|
51
54
|
const entityName = entity.name;
|
|
55
|
+
if (this.authorizator.isRootOperationDisallowed(entityName, schema.Acl.Operation.delete)) {
|
|
56
|
+
return void 0;
|
|
57
|
+
}
|
|
52
58
|
if (entity.view) {
|
|
53
59
|
return void 0;
|
|
54
60
|
}
|
|
@@ -81,6 +87,9 @@ class MutationProvider {
|
|
|
81
87
|
};
|
|
82
88
|
}
|
|
83
89
|
getUpdateMutation(entity) {
|
|
90
|
+
if (this.authorizator.isRootOperationDisallowed(entity.name, schema.Acl.Operation.update)) {
|
|
91
|
+
return void 0;
|
|
92
|
+
}
|
|
84
93
|
const entityName = entity.name;
|
|
85
94
|
const dataType = this.updateEntityInputProvider.getInput(entityName);
|
|
86
95
|
if (dataType === void 0) {
|
|
@@ -114,6 +123,9 @@ class MutationProvider {
|
|
|
114
123
|
};
|
|
115
124
|
}
|
|
116
125
|
getUpsertMutation(entity) {
|
|
126
|
+
if (this.authorizator.isRootOperationDisallowed(entity.name, schema.Acl.Operation.update) || this.authorizator.isRootOperationDisallowed(entity.name, schema.Acl.Operation.create)) {
|
|
127
|
+
return void 0;
|
|
128
|
+
}
|
|
117
129
|
const entityName = entity.name;
|
|
118
130
|
const createInput = this.createEntityInputProvider.getInput(entityName);
|
|
119
131
|
if (createInput === void 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MutationProvider.cjs","sources":["../../../../../packages/engine-content-api/src/schema/MutationProvider.ts"],"sourcesContent":["import {\n\tGraphQLBoolean,\n\tGraphQLFieldConfig,\n\tGraphQLNonNull,\n\tGraphQLObjectType,\n\tGraphQLObjectTypeConfig,\n\tGraphQLString,\n} from 'graphql'\nimport { Acl, Input, Model } from '@contember/schema'\nimport { Context } from '../types'\nimport { EntityTypeProvider } from './EntityTypeProvider'\nimport { WhereTypeProvider } from './WhereTypeProvider'\nimport { Authorizator } from '../acl'\nimport { EntityInputProvider, EntityInputType } from './mutations'\nimport { filterObject } from '../utils'\nimport { aliasAwareResolver, GqlTypeName } from './utils'\nimport { ResultSchemaTypeProvider } from './ResultSchemaTypeProvider'\nimport { ExtensionKey, Operation, OperationMeta } from './OperationExtension'\n\ntype FieldConfig<TArgs> = GraphQLFieldConfig<any, Context, TArgs>\n\nexport class MutationProvider {\n\tconstructor(\n\t\tprivate readonly authorizator: Authorizator,\n\t\tprivate readonly whereTypeProvider: WhereTypeProvider,\n\t\tprivate readonly entityTypeProvider: EntityTypeProvider,\n\t\tprivate readonly createEntityInputProvider: EntityInputProvider<EntityInputType.create>,\n\t\tprivate readonly updateEntityInputProvider: EntityInputProvider<EntityInputType.update>,\n\t\tprivate readonly resultSchemaTypeProvider: ResultSchemaTypeProvider,\n\t) {}\n\n\tpublic getMutations(entity: Model.Entity): { [fieldName: string]: FieldConfig<any> } {\n\t\tconst entityName = entity.name\n\t\tconst mutations: { [fieldName: string]: FieldConfig<any> | undefined } = {}\n\t\tmutations[`create${entityName}`] = this.getCreateMutation(entity)\n\t\tmutations[`delete${entityName}`] = this.getDeleteMutation(entity)\n\t\tmutations[`update${entityName}`] = this.getUpdateMutation(entity)\n\t\tmutations[`upsert${entityName}`] = this.getUpsertMutation(entity)\n\n\t\treturn filterObject(mutations, (key, value): value is FieldConfig<any> => value !== undefined)\n\t}\n\n\tprotected getCreateMutation(entity: Model.Entity): FieldConfig<Input.CreateInput> | undefined {\n\t\tconst entityName = entity.name\n\t\tconst dataType = this.createEntityInputProvider.getInput(entityName)\n\t\tif (dataType === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst resultType = this.createResultType(entityName, 'create')\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(resultType),\n\t\t\targs: {\n\t\t\t\tdata: { type: new GraphQLNonNull(dataType) },\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.create, entity) },\n\t\t\tresolve: (parent, args, context: Context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.mutation.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.mutationResolver.resolveCreate(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprotected getDeleteMutation(entity: Model.Entity): FieldConfig<Input.DeleteInput> | undefined {\n\t\tconst entityName = entity.name\n\t\tif (entity.view) {\n\t\t\treturn undefined\n\t\t}\n\t\tif (this.authorizator.getEntityPermission(Acl.Operation.delete, entityName) === 'no') {\n\t\t\treturn undefined\n\t\t}\n\t\tconst uniqueWhere = this.whereTypeProvider.getEntityUniqueWhereType(entityName)\n\t\tif (!uniqueWhere) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(this.createResultType(entityName, 'delete')),\n\t\t\targs: {\n\t\t\t\tby: {\n\t\t\t\t\ttype: new GraphQLNonNull(uniqueWhere),\n\t\t\t\t},\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.delete, entity) },\n\t\t\tresolve: (parent, args, context: Context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.mutation.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.mutationResolver.resolveDelete(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprotected getUpdateMutation(entity: Model.Entity): FieldConfig<Input.UpdateInput> | undefined {\n\t\tconst entityName = entity.name\n\t\tconst dataType = this.updateEntityInputProvider.getInput(entityName)\n\t\tif (dataType === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst resultType = this.createResultType(entityName, 'update')\n\t\tconst uniqueWhere = this.whereTypeProvider.getEntityUniqueWhereType(entityName)\n\t\tif (!uniqueWhere) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(resultType),\n\t\t\targs: {\n\t\t\t\tby: {\n\t\t\t\t\ttype: new GraphQLNonNull(uniqueWhere),\n\t\t\t\t},\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t\tdata: { type: new GraphQLNonNull(dataType) },\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.update, entity) },\n\t\t\tresolve: (parent, args, context: Context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.mutationResolver.resolveUpdate(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate getUpsertMutation(entity: Model.Entity): FieldConfig<Input.UpsertInput> | undefined {\n\t\tconst entityName = entity.name\n\t\tconst createInput = this.createEntityInputProvider.getInput(entityName)\n\t\tif (createInput === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst updateInput = this.updateEntityInputProvider.getInput(entityName)\n\t\tif (updateInput === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst resultType = this.createResultType(entityName, 'upsert')\n\t\tconst uniqueWhere = this.whereTypeProvider.getEntityUniqueWhereType(entityName)\n\t\tif (!uniqueWhere) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(resultType),\n\t\t\targs: {\n\t\t\t\tby: {\n\t\t\t\t\ttype: new GraphQLNonNull(uniqueWhere),\n\t\t\t\t},\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t\tupdate: { type: new GraphQLNonNull(updateInput) },\n\t\t\t\tcreate: { type: new GraphQLNonNull(createInput) },\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.upsert, entity) },\n\t\t\tresolve: (parent, args, context: Context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.mutationResolver.resolveUpsert(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate createResultType(\n\t\tentityName: string,\n\t\toperation: 'create' | 'update' | 'delete' | 'upsert',\n\t): GraphQLObjectType {\n\t\tconst fields: GraphQLObjectTypeConfig<any, any>['fields'] = {\n\t\t\tok: { type: new GraphQLNonNull(GraphQLBoolean) },\n\t\t\terrorMessage: { type: GraphQLString },\n\t\t\terrors: { type: this.resultSchemaTypeProvider.errorListResultType },\n\t\t}\n\t\tif (this.authorizator.getEntityPermission(Acl.Operation.read, entityName) !== 'no') {\n\t\t\tconst nodeType = this.entityTypeProvider.getEntity(entityName)\n\t\t\tfields.node = { type: nodeType, resolve: aliasAwareResolver }\n\t\t}\n\t\tif (operation !== 'delete') {\n\t\t\tfields.validation = {\n\t\t\t\ttype: new GraphQLNonNull(this.resultSchemaTypeProvider.validationResultType),\n\t\t\t}\n\t\t}\n\t\treturn new GraphQLObjectType({\n\t\t\tname: GqlTypeName`${entityName}${operation}Result`,\n\t\t\tfields: fields,\n\t\t\tinterfaces: [this.resultSchemaTypeProvider.mutationResultType],\n\t\t})\n\t}\n}\n"],"names":["filterObject","GraphQLNonNull","ExtensionKey","OperationMeta","Operation","Acl","GraphQLBoolean","GraphQLString","aliasAwareResolver","GraphQLObjectType","GqlTypeName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MutationProvider.cjs","sources":["../../../../../packages/engine-content-api/src/schema/MutationProvider.ts"],"sourcesContent":["import {\n\tGraphQLBoolean,\n\tGraphQLFieldConfig,\n\tGraphQLNonNull,\n\tGraphQLObjectType,\n\tGraphQLObjectTypeConfig,\n\tGraphQLString,\n} from 'graphql'\nimport { Acl, Input, Model } from '@contember/schema'\nimport { Context } from '../types'\nimport { EntityTypeProvider } from './EntityTypeProvider'\nimport { WhereTypeProvider } from './WhereTypeProvider'\nimport { Authorizator } from '../acl'\nimport { EntityInputProvider, EntityInputType } from './mutations'\nimport { filterObject } from '../utils'\nimport { aliasAwareResolver, GqlTypeName } from './utils'\nimport { ResultSchemaTypeProvider } from './ResultSchemaTypeProvider'\nimport { ExtensionKey, Operation, OperationMeta } from './OperationExtension'\n\ntype FieldConfig<TArgs> = GraphQLFieldConfig<any, Context, TArgs>\n\nexport class MutationProvider {\n\tconstructor(\n\t\tprivate readonly authorizator: Authorizator,\n\t\tprivate readonly whereTypeProvider: WhereTypeProvider,\n\t\tprivate readonly entityTypeProvider: EntityTypeProvider,\n\t\tprivate readonly createEntityInputProvider: EntityInputProvider<EntityInputType.create>,\n\t\tprivate readonly updateEntityInputProvider: EntityInputProvider<EntityInputType.update>,\n\t\tprivate readonly resultSchemaTypeProvider: ResultSchemaTypeProvider,\n\t) {}\n\n\tpublic getMutations(entity: Model.Entity): { [fieldName: string]: FieldConfig<any> } {\n\t\tconst entityName = entity.name\n\t\tconst mutations: { [fieldName: string]: FieldConfig<any> | undefined } = {}\n\t\tmutations[`create${entityName}`] = this.getCreateMutation(entity)\n\t\tmutations[`delete${entityName}`] = this.getDeleteMutation(entity)\n\t\tmutations[`update${entityName}`] = this.getUpdateMutation(entity)\n\t\tmutations[`upsert${entityName}`] = this.getUpsertMutation(entity)\n\n\t\treturn filterObject(mutations, (key, value): value is FieldConfig<any> => value !== undefined)\n\t}\n\n\tprotected getCreateMutation(entity: Model.Entity): FieldConfig<Input.CreateInput> | undefined {\n\t\tif (this.authorizator.isRootOperationDisallowed(entity.name, Acl.Operation.create)) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst entityName = entity.name\n\t\tconst dataType = this.createEntityInputProvider.getInput(entityName)\n\t\tif (dataType === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst resultType = this.createResultType(entityName, 'create')\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(resultType),\n\t\t\targs: {\n\t\t\t\tdata: { type: new GraphQLNonNull(dataType) },\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.create, entity) },\n\t\t\tresolve: (parent, args, context: Context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.mutation.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.mutationResolver.resolveCreate(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprotected getDeleteMutation(entity: Model.Entity): FieldConfig<Input.DeleteInput> | undefined {\n\t\tconst entityName = entity.name\n\t\tif (this.authorizator.isRootOperationDisallowed(entityName, Acl.Operation.delete)) {\n\t\t\treturn undefined\n\t\t}\n\t\tif (entity.view) {\n\t\t\treturn undefined\n\t\t}\n\t\tif (this.authorizator.getEntityPermission(Acl.Operation.delete, entityName) === 'no') {\n\t\t\treturn undefined\n\t\t}\n\t\tconst uniqueWhere = this.whereTypeProvider.getEntityUniqueWhereType(entityName)\n\t\tif (!uniqueWhere) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(this.createResultType(entityName, 'delete')),\n\t\t\targs: {\n\t\t\t\tby: {\n\t\t\t\t\ttype: new GraphQLNonNull(uniqueWhere),\n\t\t\t\t},\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.delete, entity) },\n\t\t\tresolve: (parent, args, context: Context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.mutation.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.mutationResolver.resolveDelete(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprotected getUpdateMutation(entity: Model.Entity): FieldConfig<Input.UpdateInput> | undefined {\n\t\tif (this.authorizator.isRootOperationDisallowed(entity.name, Acl.Operation.update)) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst entityName = entity.name\n\t\tconst dataType = this.updateEntityInputProvider.getInput(entityName)\n\t\tif (dataType === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst resultType = this.createResultType(entityName, 'update')\n\t\tconst uniqueWhere = this.whereTypeProvider.getEntityUniqueWhereType(entityName)\n\t\tif (!uniqueWhere) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(resultType),\n\t\t\targs: {\n\t\t\t\tby: {\n\t\t\t\t\ttype: new GraphQLNonNull(uniqueWhere),\n\t\t\t\t},\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t\tdata: { type: new GraphQLNonNull(dataType) },\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.update, entity) },\n\t\t\tresolve: (parent, args, context: Context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.mutationResolver.resolveUpdate(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate getUpsertMutation(entity: Model.Entity): FieldConfig<Input.UpsertInput> | undefined {\n\t\tif (this.authorizator.isRootOperationDisallowed(entity.name, Acl.Operation.update)\n\t\t\t|| this.authorizator.isRootOperationDisallowed(entity.name, Acl.Operation.create)) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst entityName = entity.name\n\t\tconst createInput = this.createEntityInputProvider.getInput(entityName)\n\t\tif (createInput === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst updateInput = this.updateEntityInputProvider.getInput(entityName)\n\t\tif (updateInput === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst resultType = this.createResultType(entityName, 'upsert')\n\t\tconst uniqueWhere = this.whereTypeProvider.getEntityUniqueWhereType(entityName)\n\t\tif (!uniqueWhere) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(resultType),\n\t\t\targs: {\n\t\t\t\tby: {\n\t\t\t\t\ttype: new GraphQLNonNull(uniqueWhere),\n\t\t\t\t},\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t\tupdate: { type: new GraphQLNonNull(updateInput) },\n\t\t\t\tcreate: { type: new GraphQLNonNull(createInput) },\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.upsert, entity) },\n\t\t\tresolve: (parent, args, context: Context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.mutationResolver.resolveUpsert(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate createResultType(\n\t\tentityName: string,\n\t\toperation: 'create' | 'update' | 'delete' | 'upsert',\n\t): GraphQLObjectType {\n\t\tconst fields: GraphQLObjectTypeConfig<any, any>['fields'] = {\n\t\t\tok: { type: new GraphQLNonNull(GraphQLBoolean) },\n\t\t\terrorMessage: { type: GraphQLString },\n\t\t\terrors: { type: this.resultSchemaTypeProvider.errorListResultType },\n\t\t}\n\t\tif (this.authorizator.getEntityPermission(Acl.Operation.read, entityName) !== 'no') {\n\t\t\tconst nodeType = this.entityTypeProvider.getEntity(entityName)\n\t\t\tfields.node = { type: nodeType, resolve: aliasAwareResolver }\n\t\t}\n\t\tif (operation !== 'delete') {\n\t\t\tfields.validation = {\n\t\t\t\ttype: new GraphQLNonNull(this.resultSchemaTypeProvider.validationResultType),\n\t\t\t}\n\t\t}\n\t\treturn new GraphQLObjectType({\n\t\t\tname: GqlTypeName`${entityName}${operation}Result`,\n\t\t\tfields: fields,\n\t\t\tinterfaces: [this.resultSchemaTypeProvider.mutationResultType],\n\t\t})\n\t}\n}\n"],"names":["filterObject","Acl","GraphQLNonNull","ExtensionKey","OperationMeta","Operation","GraphQLBoolean","GraphQLString","aliasAwareResolver","GraphQLObjectType","GqlTypeName"],"mappings":";;;;;;;;AAqBO,MAAM,iBAAiB;AAAA,EAC7B,YACkB,cACA,mBACA,oBACA,2BACA,2BACA,0BAChB;AANgB,SAAA,eAAA;AACA,SAAA,oBAAA;AACA,SAAA,qBAAA;AACA,SAAA,4BAAA;AACA,SAAA,4BAAA;AACA,SAAA,2BAAA;AAAA,EAAA;AAAA,EAGX,aAAa,QAAiE;AACpF,UAAM,aAAa,OAAO;AAC1B,UAAM,YAAmE,CAAC;AAC1E,cAAU,SAAS,UAAU,EAAE,IAAI,KAAK,kBAAkB,MAAM;AAChE,cAAU,SAAS,UAAU,EAAE,IAAI,KAAK,kBAAkB,MAAM;AAChE,cAAU,SAAS,UAAU,EAAE,IAAI,KAAK,kBAAkB,MAAM;AAChE,cAAU,SAAS,UAAU,EAAE,IAAI,KAAK,kBAAkB,MAAM;AAEhE,WAAOA,OAAAA,aAAa,WAAW,CAAC,KAAK,UAAqC,UAAU,MAAS;AAAA,EAAA;AAAA,EAGpF,kBAAkB,QAAkE;AACzF,QAAA,KAAK,aAAa,0BAA0B,OAAO,MAAMC,OAAI,IAAA,UAAU,MAAM,GAAG;AAC5E,aAAA;AAAA,IAAA;AAER,UAAM,aAAa,OAAO;AAC1B,UAAM,WAAW,KAAK,0BAA0B,SAAS,UAAU;AACnE,QAAI,aAAa,QAAW;AACpB,aAAA;AAAA,IAAA;AAER,UAAM,aAAa,KAAK,iBAAiB,YAAY,QAAQ;AACtD,WAAA;AAAA,MACN,MAAM,IAAIC,QAAA,eAAe,UAAU;AAAA,MACnC,MAAM;AAAA,QACL,MAAM,EAAE,MAAM,IAAIA,QAAAA,eAAe,QAAQ,EAAE;AAAA,MAC5C;AAAA,MACA,YAAY,EAAE,CAACC,+BAAY,GAAG,IAAIC,mBAAc,cAAAC,6BAAU,QAAQ,MAAM,EAAE;AAAA,MAC1E,SAAS,CAAC,QAAQ,MAAM,SAAkB,SAAS;AAClD,eAAO,QAAQ,MAAM,oBAAoB,KAAK,SAAS,IAAI,MAAM;AAC5D,cAAA,UAAU,KAAK,MAAM;AACjB,mBAAA,OAAO,KAAK,KAAK,GAAG;AAAA,UAAA;AAE5B,iBAAO,QAAQ,mBAAmB,iBAAiB,cAAc,QAAQ,IAAI;AAAA,QAAA,CAC7E;AAAA,MAAA;AAAA,IAEH;AAAA,EAAA;AAAA,EAGS,kBAAkB,QAAkE;AAC7F,UAAM,aAAa,OAAO;AAC1B,QAAI,KAAK,aAAa,0BAA0B,YAAYJ,WAAI,UAAU,MAAM,GAAG;AAC3E,aAAA;AAAA,IAAA;AAER,QAAI,OAAO,MAAM;AACT,aAAA;AAAA,IAAA;AAEJ,QAAA,KAAK,aAAa,oBAAoBA,OAAAA,IAAI,UAAU,QAAQ,UAAU,MAAM,MAAM;AAC9E,aAAA;AAAA,IAAA;AAER,UAAM,cAAc,KAAK,kBAAkB,yBAAyB,UAAU;AAC9E,QAAI,CAAC,aAAa;AACV,aAAA;AAAA,IAAA;AAED,WAAA;AAAA,MACN,MAAM,IAAIC,QAAAA,eAAe,KAAK,iBAAiB,YAAY,QAAQ,CAAC;AAAA,MACpE,MAAM;AAAA,QACL,IAAI;AAAA,UACH,MAAM,IAAIA,QAAAA,eAAe,WAAW;AAAA,QACrC;AAAA,QACA,QAAQ;AAAA,UACP,MAAM,KAAK,kBAAkB,mBAAmB,UAAU;AAAA,QAAA;AAAA,MAE5D;AAAA,MACA,YAAY,EAAE,CAACC,+BAAY,GAAG,IAAIC,mBAAc,cAAAC,6BAAU,QAAQ,MAAM,EAAE;AAAA,MAC1E,SAAS,CAAC,QAAQ,MAAM,SAAkB,SAAS;AAClD,eAAO,QAAQ,MAAM,oBAAoB,KAAK,SAAS,IAAI,MAAM;AAC5D,cAAA,UAAU,KAAK,MAAM;AACjB,mBAAA,OAAO,KAAK,KAAK,GAAG;AAAA,UAAA;AAE5B,iBAAO,QAAQ,mBAAmB,iBAAiB,cAAc,QAAQ,IAAI;AAAA,QAAA,CAC7E;AAAA,MAAA;AAAA,IAEH;AAAA,EAAA;AAAA,EAGS,kBAAkB,QAAkE;AACzF,QAAA,KAAK,aAAa,0BAA0B,OAAO,MAAMJ,OAAI,IAAA,UAAU,MAAM,GAAG;AAC5E,aAAA;AAAA,IAAA;AAER,UAAM,aAAa,OAAO;AAC1B,UAAM,WAAW,KAAK,0BAA0B,SAAS,UAAU;AACnE,QAAI,aAAa,QAAW;AACpB,aAAA;AAAA,IAAA;AAER,UAAM,aAAa,KAAK,iBAAiB,YAAY,QAAQ;AAC7D,UAAM,cAAc,KAAK,kBAAkB,yBAAyB,UAAU;AAC9E,QAAI,CAAC,aAAa;AACV,aAAA;AAAA,IAAA;AAED,WAAA;AAAA,MACN,MAAM,IAAIC,QAAA,eAAe,UAAU;AAAA,MACnC,MAAM;AAAA,QACL,IAAI;AAAA,UACH,MAAM,IAAIA,QAAAA,eAAe,WAAW;AAAA,QACrC;AAAA,QACA,QAAQ;AAAA,UACP,MAAM,KAAK,kBAAkB,mBAAmB,UAAU;AAAA,QAC3D;AAAA,QACA,MAAM,EAAE,MAAM,IAAIA,QAAAA,eAAe,QAAQ,EAAE;AAAA,MAC5C;AAAA,MACA,YAAY,EAAE,CAACC,+BAAY,GAAG,IAAIC,mBAAc,cAAAC,6BAAU,QAAQ,MAAM,EAAE;AAAA,MAC1E,SAAS,CAAC,QAAQ,MAAM,SAAkB,SAAS;AAClD,eAAO,QAAQ,MAAM,WAAW,KAAK,SAAS,IAAI,MAAM;AACnD,cAAA,UAAU,KAAK,MAAM;AACjB,mBAAA,OAAO,KAAK,KAAK,GAAG;AAAA,UAAA;AAE5B,iBAAO,QAAQ,mBAAmB,iBAAiB,cAAc,QAAQ,IAAI;AAAA,QAAA,CAC7E;AAAA,MAAA;AAAA,IAEH;AAAA,EAAA;AAAA,EAGO,kBAAkB,QAAkE;AAC3F,QAAI,KAAK,aAAa,0BAA0B,OAAO,MAAMJ,OAAAA,IAAI,UAAU,MAAM,KAC7E,KAAK,aAAa,0BAA0B,OAAO,MAAMA,WAAI,UAAU,MAAM,GAAG;AAC5E,aAAA;AAAA,IAAA;AAER,UAAM,aAAa,OAAO;AAC1B,UAAM,cAAc,KAAK,0BAA0B,SAAS,UAAU;AACtE,QAAI,gBAAgB,QAAW;AACvB,aAAA;AAAA,IAAA;AAER,UAAM,cAAc,KAAK,0BAA0B,SAAS,UAAU;AACtE,QAAI,gBAAgB,QAAW;AACvB,aAAA;AAAA,IAAA;AAER,UAAM,aAAa,KAAK,iBAAiB,YAAY,QAAQ;AAC7D,UAAM,cAAc,KAAK,kBAAkB,yBAAyB,UAAU;AAC9E,QAAI,CAAC,aAAa;AACV,aAAA;AAAA,IAAA;AAED,WAAA;AAAA,MACN,MAAM,IAAIC,QAAA,eAAe,UAAU;AAAA,MACnC,MAAM;AAAA,QACL,IAAI;AAAA,UACH,MAAM,IAAIA,QAAAA,eAAe,WAAW;AAAA,QACrC;AAAA,QACA,QAAQ;AAAA,UACP,MAAM,KAAK,kBAAkB,mBAAmB,UAAU;AAAA,QAC3D;AAAA,QACA,QAAQ,EAAE,MAAM,IAAIA,QAAA,eAAe,WAAW,EAAE;AAAA,QAChD,QAAQ,EAAE,MAAM,IAAIA,QAAAA,eAAe,WAAW,EAAE;AAAA,MACjD;AAAA,MACA,YAAY,EAAE,CAACC,+BAAY,GAAG,IAAIC,mBAAc,cAAAC,6BAAU,QAAQ,MAAM,EAAE;AAAA,MAC1E,SAAS,CAAC,QAAQ,MAAM,SAAkB,SAAS;AAClD,eAAO,QAAQ,MAAM,WAAW,KAAK,SAAS,IAAI,MAAM;AACnD,cAAA,UAAU,KAAK,MAAM;AACjB,mBAAA,OAAO,KAAK,KAAK,GAAG;AAAA,UAAA;AAE5B,iBAAO,QAAQ,mBAAmB,iBAAiB,cAAc,QAAQ,IAAI;AAAA,QAAA,CAC7E;AAAA,MAAA;AAAA,IAEH;AAAA,EAAA;AAAA,EAGO,iBACP,YACA,WACoB;AACpB,UAAM,SAAsD;AAAA,MAC3D,IAAI,EAAE,MAAM,IAAIH,QAAA,eAAeI,QAAc,cAAA,EAAE;AAAA,MAC/C,cAAc,EAAE,MAAMC,sBAAc;AAAA,MACpC,QAAQ,EAAE,MAAM,KAAK,yBAAyB,oBAAoB;AAAA,IACnE;AACI,QAAA,KAAK,aAAa,oBAAoBN,OAAAA,IAAI,UAAU,MAAM,UAAU,MAAM,MAAM;AACnF,YAAM,WAAW,KAAK,mBAAmB,UAAU,UAAU;AAC7D,aAAO,OAAO,EAAE,MAAM,UAAU,SAASO,MAAAA,mBAAmB;AAAA,IAAA;AAE7D,QAAI,cAAc,UAAU;AAC3B,aAAO,aAAa;AAAA,QACnB,MAAM,IAAIN,QAAAA,eAAe,KAAK,yBAAyB,oBAAoB;AAAA,MAC5E;AAAA,IAAA;AAED,WAAO,IAAIO,QAAAA,kBAAkB;AAAA,MAC5B,MAAMC,MAAAA,cAAc,UAAU,GAAG,SAAS;AAAA,MAC1C;AAAA,MACA,YAAY,CAAC,KAAK,yBAAyB,kBAAkB;AAAA,IAAA,CAC7D;AAAA,EAAA;AAEH;;"}
|
|
@@ -23,6 +23,9 @@ class MutationProvider {
|
|
|
23
23
|
return filterObject(mutations, (key, value) => value !== void 0);
|
|
24
24
|
}
|
|
25
25
|
getCreateMutation(entity) {
|
|
26
|
+
if (this.authorizator.isRootOperationDisallowed(entity.name, Acl.Operation.create)) {
|
|
27
|
+
return void 0;
|
|
28
|
+
}
|
|
26
29
|
const entityName = entity.name;
|
|
27
30
|
const dataType = this.createEntityInputProvider.getInput(entityName);
|
|
28
31
|
if (dataType === void 0) {
|
|
@@ -47,6 +50,9 @@ class MutationProvider {
|
|
|
47
50
|
}
|
|
48
51
|
getDeleteMutation(entity) {
|
|
49
52
|
const entityName = entity.name;
|
|
53
|
+
if (this.authorizator.isRootOperationDisallowed(entityName, Acl.Operation.delete)) {
|
|
54
|
+
return void 0;
|
|
55
|
+
}
|
|
50
56
|
if (entity.view) {
|
|
51
57
|
return void 0;
|
|
52
58
|
}
|
|
@@ -79,6 +85,9 @@ class MutationProvider {
|
|
|
79
85
|
};
|
|
80
86
|
}
|
|
81
87
|
getUpdateMutation(entity) {
|
|
88
|
+
if (this.authorizator.isRootOperationDisallowed(entity.name, Acl.Operation.update)) {
|
|
89
|
+
return void 0;
|
|
90
|
+
}
|
|
82
91
|
const entityName = entity.name;
|
|
83
92
|
const dataType = this.updateEntityInputProvider.getInput(entityName);
|
|
84
93
|
if (dataType === void 0) {
|
|
@@ -112,6 +121,9 @@ class MutationProvider {
|
|
|
112
121
|
};
|
|
113
122
|
}
|
|
114
123
|
getUpsertMutation(entity) {
|
|
124
|
+
if (this.authorizator.isRootOperationDisallowed(entity.name, Acl.Operation.update) || this.authorizator.isRootOperationDisallowed(entity.name, Acl.Operation.create)) {
|
|
125
|
+
return void 0;
|
|
126
|
+
}
|
|
115
127
|
const entityName = entity.name;
|
|
116
128
|
const createInput = this.createEntityInputProvider.getInput(entityName);
|
|
117
129
|
if (createInput === void 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MutationProvider.js","sources":["../../../../../packages/engine-content-api/src/schema/MutationProvider.ts"],"sourcesContent":["import {\n\tGraphQLBoolean,\n\tGraphQLFieldConfig,\n\tGraphQLNonNull,\n\tGraphQLObjectType,\n\tGraphQLObjectTypeConfig,\n\tGraphQLString,\n} from 'graphql'\nimport { Acl, Input, Model } from '@contember/schema'\nimport { Context } from '../types'\nimport { EntityTypeProvider } from './EntityTypeProvider'\nimport { WhereTypeProvider } from './WhereTypeProvider'\nimport { Authorizator } from '../acl'\nimport { EntityInputProvider, EntityInputType } from './mutations'\nimport { filterObject } from '../utils'\nimport { aliasAwareResolver, GqlTypeName } from './utils'\nimport { ResultSchemaTypeProvider } from './ResultSchemaTypeProvider'\nimport { ExtensionKey, Operation, OperationMeta } from './OperationExtension'\n\ntype FieldConfig<TArgs> = GraphQLFieldConfig<any, Context, TArgs>\n\nexport class MutationProvider {\n\tconstructor(\n\t\tprivate readonly authorizator: Authorizator,\n\t\tprivate readonly whereTypeProvider: WhereTypeProvider,\n\t\tprivate readonly entityTypeProvider: EntityTypeProvider,\n\t\tprivate readonly createEntityInputProvider: EntityInputProvider<EntityInputType.create>,\n\t\tprivate readonly updateEntityInputProvider: EntityInputProvider<EntityInputType.update>,\n\t\tprivate readonly resultSchemaTypeProvider: ResultSchemaTypeProvider,\n\t) {}\n\n\tpublic getMutations(entity: Model.Entity): { [fieldName: string]: FieldConfig<any> } {\n\t\tconst entityName = entity.name\n\t\tconst mutations: { [fieldName: string]: FieldConfig<any> | undefined } = {}\n\t\tmutations[`create${entityName}`] = this.getCreateMutation(entity)\n\t\tmutations[`delete${entityName}`] = this.getDeleteMutation(entity)\n\t\tmutations[`update${entityName}`] = this.getUpdateMutation(entity)\n\t\tmutations[`upsert${entityName}`] = this.getUpsertMutation(entity)\n\n\t\treturn filterObject(mutations, (key, value): value is FieldConfig<any> => value !== undefined)\n\t}\n\n\tprotected getCreateMutation(entity: Model.Entity): FieldConfig<Input.CreateInput> | undefined {\n\t\tconst entityName = entity.name\n\t\tconst dataType = this.createEntityInputProvider.getInput(entityName)\n\t\tif (dataType === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst resultType = this.createResultType(entityName, 'create')\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(resultType),\n\t\t\targs: {\n\t\t\t\tdata: { type: new GraphQLNonNull(dataType) },\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.create, entity) },\n\t\t\tresolve: (parent, args, context: Context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.mutation.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.mutationResolver.resolveCreate(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprotected getDeleteMutation(entity: Model.Entity): FieldConfig<Input.DeleteInput> | undefined {\n\t\tconst entityName = entity.name\n\t\tif (entity.view) {\n\t\t\treturn undefined\n\t\t}\n\t\tif (this.authorizator.getEntityPermission(Acl.Operation.delete, entityName) === 'no') {\n\t\t\treturn undefined\n\t\t}\n\t\tconst uniqueWhere = this.whereTypeProvider.getEntityUniqueWhereType(entityName)\n\t\tif (!uniqueWhere) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(this.createResultType(entityName, 'delete')),\n\t\t\targs: {\n\t\t\t\tby: {\n\t\t\t\t\ttype: new GraphQLNonNull(uniqueWhere),\n\t\t\t\t},\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.delete, entity) },\n\t\t\tresolve: (parent, args, context: Context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.mutation.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.mutationResolver.resolveDelete(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprotected getUpdateMutation(entity: Model.Entity): FieldConfig<Input.UpdateInput> | undefined {\n\t\tconst entityName = entity.name\n\t\tconst dataType = this.updateEntityInputProvider.getInput(entityName)\n\t\tif (dataType === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst resultType = this.createResultType(entityName, 'update')\n\t\tconst uniqueWhere = this.whereTypeProvider.getEntityUniqueWhereType(entityName)\n\t\tif (!uniqueWhere) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(resultType),\n\t\t\targs: {\n\t\t\t\tby: {\n\t\t\t\t\ttype: new GraphQLNonNull(uniqueWhere),\n\t\t\t\t},\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t\tdata: { type: new GraphQLNonNull(dataType) },\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.update, entity) },\n\t\t\tresolve: (parent, args, context: Context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.mutationResolver.resolveUpdate(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate getUpsertMutation(entity: Model.Entity): FieldConfig<Input.UpsertInput> | undefined {\n\t\tconst entityName = entity.name\n\t\tconst createInput = this.createEntityInputProvider.getInput(entityName)\n\t\tif (createInput === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst updateInput = this.updateEntityInputProvider.getInput(entityName)\n\t\tif (updateInput === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst resultType = this.createResultType(entityName, 'upsert')\n\t\tconst uniqueWhere = this.whereTypeProvider.getEntityUniqueWhereType(entityName)\n\t\tif (!uniqueWhere) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(resultType),\n\t\t\targs: {\n\t\t\t\tby: {\n\t\t\t\t\ttype: new GraphQLNonNull(uniqueWhere),\n\t\t\t\t},\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t\tupdate: { type: new GraphQLNonNull(updateInput) },\n\t\t\t\tcreate: { type: new GraphQLNonNull(createInput) },\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.upsert, entity) },\n\t\t\tresolve: (parent, args, context: Context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.mutationResolver.resolveUpsert(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate createResultType(\n\t\tentityName: string,\n\t\toperation: 'create' | 'update' | 'delete' | 'upsert',\n\t): GraphQLObjectType {\n\t\tconst fields: GraphQLObjectTypeConfig<any, any>['fields'] = {\n\t\t\tok: { type: new GraphQLNonNull(GraphQLBoolean) },\n\t\t\terrorMessage: { type: GraphQLString },\n\t\t\terrors: { type: this.resultSchemaTypeProvider.errorListResultType },\n\t\t}\n\t\tif (this.authorizator.getEntityPermission(Acl.Operation.read, entityName) !== 'no') {\n\t\t\tconst nodeType = this.entityTypeProvider.getEntity(entityName)\n\t\t\tfields.node = { type: nodeType, resolve: aliasAwareResolver }\n\t\t}\n\t\tif (operation !== 'delete') {\n\t\t\tfields.validation = {\n\t\t\t\ttype: new GraphQLNonNull(this.resultSchemaTypeProvider.validationResultType),\n\t\t\t}\n\t\t}\n\t\treturn new GraphQLObjectType({\n\t\t\tname: GqlTypeName`${entityName}${operation}Result`,\n\t\t\tfields: fields,\n\t\t\tinterfaces: [this.resultSchemaTypeProvider.mutationResultType],\n\t\t})\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"MutationProvider.js","sources":["../../../../../packages/engine-content-api/src/schema/MutationProvider.ts"],"sourcesContent":["import {\n\tGraphQLBoolean,\n\tGraphQLFieldConfig,\n\tGraphQLNonNull,\n\tGraphQLObjectType,\n\tGraphQLObjectTypeConfig,\n\tGraphQLString,\n} from 'graphql'\nimport { Acl, Input, Model } from '@contember/schema'\nimport { Context } from '../types'\nimport { EntityTypeProvider } from './EntityTypeProvider'\nimport { WhereTypeProvider } from './WhereTypeProvider'\nimport { Authorizator } from '../acl'\nimport { EntityInputProvider, EntityInputType } from './mutations'\nimport { filterObject } from '../utils'\nimport { aliasAwareResolver, GqlTypeName } from './utils'\nimport { ResultSchemaTypeProvider } from './ResultSchemaTypeProvider'\nimport { ExtensionKey, Operation, OperationMeta } from './OperationExtension'\n\ntype FieldConfig<TArgs> = GraphQLFieldConfig<any, Context, TArgs>\n\nexport class MutationProvider {\n\tconstructor(\n\t\tprivate readonly authorizator: Authorizator,\n\t\tprivate readonly whereTypeProvider: WhereTypeProvider,\n\t\tprivate readonly entityTypeProvider: EntityTypeProvider,\n\t\tprivate readonly createEntityInputProvider: EntityInputProvider<EntityInputType.create>,\n\t\tprivate readonly updateEntityInputProvider: EntityInputProvider<EntityInputType.update>,\n\t\tprivate readonly resultSchemaTypeProvider: ResultSchemaTypeProvider,\n\t) {}\n\n\tpublic getMutations(entity: Model.Entity): { [fieldName: string]: FieldConfig<any> } {\n\t\tconst entityName = entity.name\n\t\tconst mutations: { [fieldName: string]: FieldConfig<any> | undefined } = {}\n\t\tmutations[`create${entityName}`] = this.getCreateMutation(entity)\n\t\tmutations[`delete${entityName}`] = this.getDeleteMutation(entity)\n\t\tmutations[`update${entityName}`] = this.getUpdateMutation(entity)\n\t\tmutations[`upsert${entityName}`] = this.getUpsertMutation(entity)\n\n\t\treturn filterObject(mutations, (key, value): value is FieldConfig<any> => value !== undefined)\n\t}\n\n\tprotected getCreateMutation(entity: Model.Entity): FieldConfig<Input.CreateInput> | undefined {\n\t\tif (this.authorizator.isRootOperationDisallowed(entity.name, Acl.Operation.create)) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst entityName = entity.name\n\t\tconst dataType = this.createEntityInputProvider.getInput(entityName)\n\t\tif (dataType === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst resultType = this.createResultType(entityName, 'create')\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(resultType),\n\t\t\targs: {\n\t\t\t\tdata: { type: new GraphQLNonNull(dataType) },\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.create, entity) },\n\t\t\tresolve: (parent, args, context: Context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.mutation.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.mutationResolver.resolveCreate(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprotected getDeleteMutation(entity: Model.Entity): FieldConfig<Input.DeleteInput> | undefined {\n\t\tconst entityName = entity.name\n\t\tif (this.authorizator.isRootOperationDisallowed(entityName, Acl.Operation.delete)) {\n\t\t\treturn undefined\n\t\t}\n\t\tif (entity.view) {\n\t\t\treturn undefined\n\t\t}\n\t\tif (this.authorizator.getEntityPermission(Acl.Operation.delete, entityName) === 'no') {\n\t\t\treturn undefined\n\t\t}\n\t\tconst uniqueWhere = this.whereTypeProvider.getEntityUniqueWhereType(entityName)\n\t\tif (!uniqueWhere) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(this.createResultType(entityName, 'delete')),\n\t\t\targs: {\n\t\t\t\tby: {\n\t\t\t\t\ttype: new GraphQLNonNull(uniqueWhere),\n\t\t\t\t},\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.delete, entity) },\n\t\t\tresolve: (parent, args, context: Context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.mutation.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.mutationResolver.resolveDelete(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprotected getUpdateMutation(entity: Model.Entity): FieldConfig<Input.UpdateInput> | undefined {\n\t\tif (this.authorizator.isRootOperationDisallowed(entity.name, Acl.Operation.update)) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst entityName = entity.name\n\t\tconst dataType = this.updateEntityInputProvider.getInput(entityName)\n\t\tif (dataType === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst resultType = this.createResultType(entityName, 'update')\n\t\tconst uniqueWhere = this.whereTypeProvider.getEntityUniqueWhereType(entityName)\n\t\tif (!uniqueWhere) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(resultType),\n\t\t\targs: {\n\t\t\t\tby: {\n\t\t\t\t\ttype: new GraphQLNonNull(uniqueWhere),\n\t\t\t\t},\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t\tdata: { type: new GraphQLNonNull(dataType) },\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.update, entity) },\n\t\t\tresolve: (parent, args, context: Context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.mutationResolver.resolveUpdate(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate getUpsertMutation(entity: Model.Entity): FieldConfig<Input.UpsertInput> | undefined {\n\t\tif (this.authorizator.isRootOperationDisallowed(entity.name, Acl.Operation.update)\n\t\t\t|| this.authorizator.isRootOperationDisallowed(entity.name, Acl.Operation.create)) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst entityName = entity.name\n\t\tconst createInput = this.createEntityInputProvider.getInput(entityName)\n\t\tif (createInput === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst updateInput = this.updateEntityInputProvider.getInput(entityName)\n\t\tif (updateInput === undefined) {\n\t\t\treturn undefined\n\t\t}\n\t\tconst resultType = this.createResultType(entityName, 'upsert')\n\t\tconst uniqueWhere = this.whereTypeProvider.getEntityUniqueWhereType(entityName)\n\t\tif (!uniqueWhere) {\n\t\t\treturn undefined\n\t\t}\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(resultType),\n\t\t\targs: {\n\t\t\t\tby: {\n\t\t\t\t\ttype: new GraphQLNonNull(uniqueWhere),\n\t\t\t\t},\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t\tupdate: { type: new GraphQLNonNull(updateInput) },\n\t\t\t\tcreate: { type: new GraphQLNonNull(createInput) },\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.upsert, entity) },\n\t\t\tresolve: (parent, args, context: Context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.mutationResolver.resolveUpsert(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate createResultType(\n\t\tentityName: string,\n\t\toperation: 'create' | 'update' | 'delete' | 'upsert',\n\t): GraphQLObjectType {\n\t\tconst fields: GraphQLObjectTypeConfig<any, any>['fields'] = {\n\t\t\tok: { type: new GraphQLNonNull(GraphQLBoolean) },\n\t\t\terrorMessage: { type: GraphQLString },\n\t\t\terrors: { type: this.resultSchemaTypeProvider.errorListResultType },\n\t\t}\n\t\tif (this.authorizator.getEntityPermission(Acl.Operation.read, entityName) !== 'no') {\n\t\t\tconst nodeType = this.entityTypeProvider.getEntity(entityName)\n\t\t\tfields.node = { type: nodeType, resolve: aliasAwareResolver }\n\t\t}\n\t\tif (operation !== 'delete') {\n\t\t\tfields.validation = {\n\t\t\t\ttype: new GraphQLNonNull(this.resultSchemaTypeProvider.validationResultType),\n\t\t\t}\n\t\t}\n\t\treturn new GraphQLObjectType({\n\t\t\tname: GqlTypeName`${entityName}${operation}Result`,\n\t\t\tfields: fields,\n\t\t\tinterfaces: [this.resultSchemaTypeProvider.mutationResultType],\n\t\t})\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,9 @@ class QueryProvider {
|
|
|
16
16
|
if (this.authorizator.getEntityPermission(schema.Acl.Operation.read, entity.name) === "no") {
|
|
17
17
|
return {};
|
|
18
18
|
}
|
|
19
|
+
if (this.authorizator.isRootOperationDisallowed(entity.name, schema.Acl.Operation.read)) {
|
|
20
|
+
return {};
|
|
21
|
+
}
|
|
19
22
|
return {
|
|
20
23
|
["get" + entity.name]: this.getByUniqueQuery(entity),
|
|
21
24
|
["list" + entity.name]: this.getListQuery(entity),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryProvider.cjs","sources":["../../../../../packages/engine-content-api/src/schema/QueryProvider.ts"],"sourcesContent":["import { GraphQLFieldConfig, GraphQLInt, GraphQLList, GraphQLNonNull } from 'graphql'\nimport { Acl, Input, Model } from '@contember/schema'\nimport { Context } from '../types'\nimport { EntityTypeProvider } from './EntityTypeProvider'\nimport { WhereTypeProvider } from './WhereTypeProvider'\nimport { Authorizator } from '../acl'\nimport { OrderByTypeProvider } from './OrderByTypeProvider'\nimport { ExtensionKey, Operation, OperationMeta } from './OperationExtension'\nimport { ImplementationException } from '../exception'\nimport { PaginatedFieldConfigFactory } from './PaginatedFieldConfigFactory'\n\nexport class QueryProvider {\n\tconstructor(\n\t\tprivate readonly authorizator: Authorizator,\n\t\tprivate readonly whereTypeProvider: WhereTypeProvider,\n\t\tprivate readonly orderByTypeProvider: OrderByTypeProvider,\n\t\tprivate readonly entityTypeProvider: EntityTypeProvider,\n\t\tprivate readonly paginatedFieldConfigFactory: PaginatedFieldConfigFactory,\n\t) {}\n\n\tpublic getQueries(entity: Model.Entity): { [fieldName: string]: GraphQLFieldConfig<any, Context, any> } {\n\t\tif (this.authorizator.getEntityPermission(Acl.Operation.read, entity.name) === 'no') {\n\t\t\treturn {}\n\t\t}\n\t\treturn {\n\t\t\t['get' + entity.name]: this.getByUniqueQuery(entity),\n\t\t\t['list' + entity.name]: this.getListQuery(entity),\n\t\t\t['paginate' + entity.name]: this.getPaginationQuery(entity),\n\t\t}\n\t}\n\n\tprivate getByUniqueQuery(entity: Model.Entity): GraphQLFieldConfig<any, Context, Input.UniqueQueryInput> {\n\t\tconst entityName = entity.name\n\t\tconst entityType = this.entityTypeProvider.getEntity(entityName)\n\t\tconst uniqueWhere = this.whereTypeProvider.getEntityUniqueWhereType(entityName)\n\t\tif (!uniqueWhere) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn {\n\t\t\ttype: entityType,\n\t\t\targs: {\n\t\t\t\tby: {\n\t\t\t\t\ttype: new GraphQLNonNull(uniqueWhere),\n\t\t\t\t},\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.get, entity) },\n\t\t\tresolve: (parent, args, context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.query.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.readResolver.resolveGetQuery(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate getListQuery(entity: Model.Entity): GraphQLFieldConfig<any, Context, Input.ListQueryInput> {\n\t\tconst entityName = entity.name\n\n\t\tconst entityType = this.entityTypeProvider.getEntity(entityName)\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(entityType))),\n\t\t\targs: {\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t\torderBy: {\n\t\t\t\t\ttype: new GraphQLList(new GraphQLNonNull(this.orderByTypeProvider.getEntityOrderByType(entityName))),\n\t\t\t\t},\n\t\t\t\toffset: {\n\t\t\t\t\ttype: GraphQLInt,\n\t\t\t\t},\n\t\t\t\tlimit: {\n\t\t\t\t\ttype: GraphQLInt,\n\t\t\t\t},\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.list, entity) },\n\t\t\tresolve: (parent, args, context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.query.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.readResolver.resolveListQuery(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate getPaginationQuery(entity: Model.Entity): GraphQLFieldConfig<any, Context, Input.ListQueryInput> {\n\t\treturn {\n\t\t\t...this.paginatedFieldConfigFactory.createFieldConfig(entity),\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.paginate, entity) },\n\t\t\tresolve: (parent, args, context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.query.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.readResolver.resolvePaginationQuery(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n}\n"],"names":["Acl","ImplementationException","GraphQLNonNull","ExtensionKey","OperationMeta","Operation","GraphQLList","GraphQLInt"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"QueryProvider.cjs","sources":["../../../../../packages/engine-content-api/src/schema/QueryProvider.ts"],"sourcesContent":["import { GraphQLFieldConfig, GraphQLInt, GraphQLList, GraphQLNonNull } from 'graphql'\nimport { Acl, Input, Model } from '@contember/schema'\nimport { Context } from '../types'\nimport { EntityTypeProvider } from './EntityTypeProvider'\nimport { WhereTypeProvider } from './WhereTypeProvider'\nimport { Authorizator } from '../acl'\nimport { OrderByTypeProvider } from './OrderByTypeProvider'\nimport { ExtensionKey, Operation, OperationMeta } from './OperationExtension'\nimport { ImplementationException } from '../exception'\nimport { PaginatedFieldConfigFactory } from './PaginatedFieldConfigFactory'\n\nexport class QueryProvider {\n\tconstructor(\n\t\tprivate readonly authorizator: Authorizator,\n\t\tprivate readonly whereTypeProvider: WhereTypeProvider,\n\t\tprivate readonly orderByTypeProvider: OrderByTypeProvider,\n\t\tprivate readonly entityTypeProvider: EntityTypeProvider,\n\t\tprivate readonly paginatedFieldConfigFactory: PaginatedFieldConfigFactory,\n\t) {}\n\n\tpublic getQueries(entity: Model.Entity): { [fieldName: string]: GraphQLFieldConfig<any, Context, any> } {\n\t\tif (this.authorizator.getEntityPermission(Acl.Operation.read, entity.name) === 'no') {\n\t\t\treturn {}\n\t\t}\n\t\tif (this.authorizator.isRootOperationDisallowed(entity.name, Acl.Operation.read)) {\n\t\t\treturn {}\n\t\t}\n\t\treturn {\n\t\t\t['get' + entity.name]: this.getByUniqueQuery(entity),\n\t\t\t['list' + entity.name]: this.getListQuery(entity),\n\t\t\t['paginate' + entity.name]: this.getPaginationQuery(entity),\n\t\t}\n\t}\n\n\tprivate getByUniqueQuery(entity: Model.Entity): GraphQLFieldConfig<any, Context, Input.UniqueQueryInput> {\n\t\tconst entityName = entity.name\n\t\tconst entityType = this.entityTypeProvider.getEntity(entityName)\n\t\tconst uniqueWhere = this.whereTypeProvider.getEntityUniqueWhereType(entityName)\n\t\tif (!uniqueWhere) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn {\n\t\t\ttype: entityType,\n\t\t\targs: {\n\t\t\t\tby: {\n\t\t\t\t\ttype: new GraphQLNonNull(uniqueWhere),\n\t\t\t\t},\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.get, entity) },\n\t\t\tresolve: (parent, args, context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.query.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.readResolver.resolveGetQuery(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate getListQuery(entity: Model.Entity): GraphQLFieldConfig<any, Context, Input.ListQueryInput> {\n\t\tconst entityName = entity.name\n\n\t\tconst entityType = this.entityTypeProvider.getEntity(entityName)\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(entityType))),\n\t\t\targs: {\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t\torderBy: {\n\t\t\t\t\ttype: new GraphQLList(new GraphQLNonNull(this.orderByTypeProvider.getEntityOrderByType(entityName))),\n\t\t\t\t},\n\t\t\t\toffset: {\n\t\t\t\t\ttype: GraphQLInt,\n\t\t\t\t},\n\t\t\t\tlimit: {\n\t\t\t\t\ttype: GraphQLInt,\n\t\t\t\t},\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.list, entity) },\n\t\t\tresolve: (parent, args, context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.query.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.readResolver.resolveListQuery(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate getPaginationQuery(entity: Model.Entity): GraphQLFieldConfig<any, Context, Input.ListQueryInput> {\n\t\treturn {\n\t\t\t...this.paginatedFieldConfigFactory.createFieldConfig(entity),\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.paginate, entity) },\n\t\t\tresolve: (parent, args, context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.query.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.readResolver.resolvePaginationQuery(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n}\n"],"names":["Acl","ImplementationException","GraphQLNonNull","ExtensionKey","OperationMeta","Operation","GraphQLList","GraphQLInt"],"mappings":"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"}
|
|
@@ -14,6 +14,9 @@ class QueryProvider {
|
|
|
14
14
|
if (this.authorizator.getEntityPermission(Acl.Operation.read, entity.name) === "no") {
|
|
15
15
|
return {};
|
|
16
16
|
}
|
|
17
|
+
if (this.authorizator.isRootOperationDisallowed(entity.name, Acl.Operation.read)) {
|
|
18
|
+
return {};
|
|
19
|
+
}
|
|
17
20
|
return {
|
|
18
21
|
["get" + entity.name]: this.getByUniqueQuery(entity),
|
|
19
22
|
["list" + entity.name]: this.getListQuery(entity),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryProvider.js","sources":["../../../../../packages/engine-content-api/src/schema/QueryProvider.ts"],"sourcesContent":["import { GraphQLFieldConfig, GraphQLInt, GraphQLList, GraphQLNonNull } from 'graphql'\nimport { Acl, Input, Model } from '@contember/schema'\nimport { Context } from '../types'\nimport { EntityTypeProvider } from './EntityTypeProvider'\nimport { WhereTypeProvider } from './WhereTypeProvider'\nimport { Authorizator } from '../acl'\nimport { OrderByTypeProvider } from './OrderByTypeProvider'\nimport { ExtensionKey, Operation, OperationMeta } from './OperationExtension'\nimport { ImplementationException } from '../exception'\nimport { PaginatedFieldConfigFactory } from './PaginatedFieldConfigFactory'\n\nexport class QueryProvider {\n\tconstructor(\n\t\tprivate readonly authorizator: Authorizator,\n\t\tprivate readonly whereTypeProvider: WhereTypeProvider,\n\t\tprivate readonly orderByTypeProvider: OrderByTypeProvider,\n\t\tprivate readonly entityTypeProvider: EntityTypeProvider,\n\t\tprivate readonly paginatedFieldConfigFactory: PaginatedFieldConfigFactory,\n\t) {}\n\n\tpublic getQueries(entity: Model.Entity): { [fieldName: string]: GraphQLFieldConfig<any, Context, any> } {\n\t\tif (this.authorizator.getEntityPermission(Acl.Operation.read, entity.name) === 'no') {\n\t\t\treturn {}\n\t\t}\n\t\treturn {\n\t\t\t['get' + entity.name]: this.getByUniqueQuery(entity),\n\t\t\t['list' + entity.name]: this.getListQuery(entity),\n\t\t\t['paginate' + entity.name]: this.getPaginationQuery(entity),\n\t\t}\n\t}\n\n\tprivate getByUniqueQuery(entity: Model.Entity): GraphQLFieldConfig<any, Context, Input.UniqueQueryInput> {\n\t\tconst entityName = entity.name\n\t\tconst entityType = this.entityTypeProvider.getEntity(entityName)\n\t\tconst uniqueWhere = this.whereTypeProvider.getEntityUniqueWhereType(entityName)\n\t\tif (!uniqueWhere) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn {\n\t\t\ttype: entityType,\n\t\t\targs: {\n\t\t\t\tby: {\n\t\t\t\t\ttype: new GraphQLNonNull(uniqueWhere),\n\t\t\t\t},\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.get, entity) },\n\t\t\tresolve: (parent, args, context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.query.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.readResolver.resolveGetQuery(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate getListQuery(entity: Model.Entity): GraphQLFieldConfig<any, Context, Input.ListQueryInput> {\n\t\tconst entityName = entity.name\n\n\t\tconst entityType = this.entityTypeProvider.getEntity(entityName)\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(entityType))),\n\t\t\targs: {\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t\torderBy: {\n\t\t\t\t\ttype: new GraphQLList(new GraphQLNonNull(this.orderByTypeProvider.getEntityOrderByType(entityName))),\n\t\t\t\t},\n\t\t\t\toffset: {\n\t\t\t\t\ttype: GraphQLInt,\n\t\t\t\t},\n\t\t\t\tlimit: {\n\t\t\t\t\ttype: GraphQLInt,\n\t\t\t\t},\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.list, entity) },\n\t\t\tresolve: (parent, args, context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.query.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.readResolver.resolveListQuery(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate getPaginationQuery(entity: Model.Entity): GraphQLFieldConfig<any, Context, Input.ListQueryInput> {\n\t\treturn {\n\t\t\t...this.paginatedFieldConfigFactory.createFieldConfig(entity),\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.paginate, entity) },\n\t\t\tresolve: (parent, args, context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.query.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.readResolver.resolvePaginationQuery(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"QueryProvider.js","sources":["../../../../../packages/engine-content-api/src/schema/QueryProvider.ts"],"sourcesContent":["import { GraphQLFieldConfig, GraphQLInt, GraphQLList, GraphQLNonNull } from 'graphql'\nimport { Acl, Input, Model } from '@contember/schema'\nimport { Context } from '../types'\nimport { EntityTypeProvider } from './EntityTypeProvider'\nimport { WhereTypeProvider } from './WhereTypeProvider'\nimport { Authorizator } from '../acl'\nimport { OrderByTypeProvider } from './OrderByTypeProvider'\nimport { ExtensionKey, Operation, OperationMeta } from './OperationExtension'\nimport { ImplementationException } from '../exception'\nimport { PaginatedFieldConfigFactory } from './PaginatedFieldConfigFactory'\n\nexport class QueryProvider {\n\tconstructor(\n\t\tprivate readonly authorizator: Authorizator,\n\t\tprivate readonly whereTypeProvider: WhereTypeProvider,\n\t\tprivate readonly orderByTypeProvider: OrderByTypeProvider,\n\t\tprivate readonly entityTypeProvider: EntityTypeProvider,\n\t\tprivate readonly paginatedFieldConfigFactory: PaginatedFieldConfigFactory,\n\t) {}\n\n\tpublic getQueries(entity: Model.Entity): { [fieldName: string]: GraphQLFieldConfig<any, Context, any> } {\n\t\tif (this.authorizator.getEntityPermission(Acl.Operation.read, entity.name) === 'no') {\n\t\t\treturn {}\n\t\t}\n\t\tif (this.authorizator.isRootOperationDisallowed(entity.name, Acl.Operation.read)) {\n\t\t\treturn {}\n\t\t}\n\t\treturn {\n\t\t\t['get' + entity.name]: this.getByUniqueQuery(entity),\n\t\t\t['list' + entity.name]: this.getListQuery(entity),\n\t\t\t['paginate' + entity.name]: this.getPaginationQuery(entity),\n\t\t}\n\t}\n\n\tprivate getByUniqueQuery(entity: Model.Entity): GraphQLFieldConfig<any, Context, Input.UniqueQueryInput> {\n\t\tconst entityName = entity.name\n\t\tconst entityType = this.entityTypeProvider.getEntity(entityName)\n\t\tconst uniqueWhere = this.whereTypeProvider.getEntityUniqueWhereType(entityName)\n\t\tif (!uniqueWhere) {\n\t\t\tthrow new ImplementationException()\n\t\t}\n\t\treturn {\n\t\t\ttype: entityType,\n\t\t\targs: {\n\t\t\t\tby: {\n\t\t\t\t\ttype: new GraphQLNonNull(uniqueWhere),\n\t\t\t\t},\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.get, entity) },\n\t\t\tresolve: (parent, args, context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.query.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.readResolver.resolveGetQuery(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate getListQuery(entity: Model.Entity): GraphQLFieldConfig<any, Context, Input.ListQueryInput> {\n\t\tconst entityName = entity.name\n\n\t\tconst entityType = this.entityTypeProvider.getEntity(entityName)\n\t\treturn {\n\t\t\ttype: new GraphQLNonNull(new GraphQLList(new GraphQLNonNull(entityType))),\n\t\t\targs: {\n\t\t\t\tfilter: {\n\t\t\t\t\ttype: this.whereTypeProvider.getEntityWhereType(entityName),\n\t\t\t\t},\n\t\t\t\torderBy: {\n\t\t\t\t\ttype: new GraphQLList(new GraphQLNonNull(this.orderByTypeProvider.getEntityOrderByType(entityName))),\n\t\t\t\t},\n\t\t\t\toffset: {\n\t\t\t\t\ttype: GraphQLInt,\n\t\t\t\t},\n\t\t\t\tlimit: {\n\t\t\t\t\ttype: GraphQLInt,\n\t\t\t\t},\n\t\t\t},\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.list, entity) },\n\t\t\tresolve: (parent, args, context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.query.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.readResolver.resolveListQuery(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n\n\tprivate getPaginationQuery(entity: Model.Entity): GraphQLFieldConfig<any, Context, Input.ListQueryInput> {\n\t\treturn {\n\t\t\t...this.paginatedFieldConfigFactory.createFieldConfig(entity),\n\t\t\textensions: { [ExtensionKey]: new OperationMeta(Operation.paginate, entity) },\n\t\t\tresolve: (parent, args, context, info) => {\n\t\t\t\treturn context.timer(`GraphQL.query.${info.fieldName}`, () => {\n\t\t\t\t\tif (parent && info.path) {\n\t\t\t\t\t\treturn parent[info.path.key]\n\t\t\t\t\t}\n\t\t\t\t\treturn context.executionContainer.readResolver.resolvePaginationQuery(entity, info)\n\t\t\t\t})\n\t\t\t},\n\t\t}\n\t}\n}\n"],"names":[],"mappings":"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"}
|