From d5331a87b2fc7a108bcafa5edb28bd7f28a4a5fe Mon Sep 17 00:00:00 2001 From: James Date: Sat, 9 May 2020 12:54:41 -0400 Subject: [PATCH] enables policy route and policy graphql query --- src/graphql/index.js | 2 ++ src/graphql/schema/buildPoliciesType.js | 48 +++++++++++++++++++++++++ src/users/graphql/init.js | 7 +++- src/users/graphql/resolvers/index.js | 2 ++ src/users/graphql/resolvers/policies.js | 4 +-- src/users/operations/policies.js | 17 ++++++--- 6 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 src/graphql/schema/buildPoliciesType.js diff --git a/src/graphql/index.js b/src/graphql/index.js index d75e8f3056..553c479d70 100644 --- a/src/graphql/index.js +++ b/src/graphql/index.js @@ -4,6 +4,7 @@ const graphQLHTTP = require('express-graphql'); const buildObjectType = require('./schema/buildObjectType'); const buildMutationInputType = require('./schema/buildMutationInputType'); const buildBlockType = require('./schema/buildBlockType'); +const buildPoliciesType = require('./schema/buildPoliciesType'); const buildLocaleInputType = require('./schema/buildLocaleInputType'); const buildFallbackLocaleInputType = require('./schema/buildFallbackLocaleInputType'); const registerCollections = require('../collections/graphql/register'); @@ -30,6 +31,7 @@ class GraphQL { this.buildMutationInputType = buildMutationInputType.bind(this); this.buildWhereInputType = buildWhereInputType; this.buildObjectType = buildObjectType.bind(this); + this.buildPoliciesType = buildPoliciesType.bind(this); this.registerCollections = registerCollections.bind(this); this.initUser = initUser.bind(this); this.registerGlobals = registerGlobals.bind(this); diff --git a/src/graphql/schema/buildPoliciesType.js b/src/graphql/schema/buildPoliciesType.js new file mode 100644 index 0000000000..35a3988916 --- /dev/null +++ b/src/graphql/schema/buildPoliciesType.js @@ -0,0 +1,48 @@ +const { GraphQLJSONObject } = require('graphql-type-json'); +const { GraphQLBoolean, GraphQLNonNull, GraphQLObjectType } = require('graphql'); +const formatName = require('../utilities/formatName'); + +const buildCollectionFields = (collection) => { + const fields = {}; + const operations = ['create', 'read', 'update', 'delete']; + + operations.forEach((operation) => { + const capitalizedOperation = operation.charAt(0).toUpperCase() + operation.slice(1); + + fields[operation] = { + type: new GraphQLObjectType({ + name: formatName(`${collection.labels.singular}${capitalizedOperation}Policy`), + fields: { + permission: { type: new GraphQLNonNull(GraphQLBoolean) }, + where: { type: GraphQLJSONObject }, + }, + }), + }; + }); + + return fields; +}; + +function buildPoliciesType() { + const fields = { + canAccessAdmin: { + type: new GraphQLNonNull(GraphQLBoolean), + }, + }; + + Object.values(this.config.collections).forEach((collection) => { + fields[collection.slug] = { + type: new GraphQLObjectType({ + name: formatName(`${collection.labels.singular}Policy`), + fields: buildCollectionFields(collection), + }), + }; + }); + + return new GraphQLObjectType({ + name: 'Policies', + fields, + }); +} + +module.exports = buildPoliciesType; diff --git a/src/users/graphql/init.js b/src/users/graphql/init.js index b0a30a07e7..0d52cb154d 100644 --- a/src/users/graphql/init.js +++ b/src/users/graphql/init.js @@ -13,7 +13,7 @@ const { } = require('../../collections/graphql/resolvers'); const { - login, me, init, refresh, register, update, forgotPassword, resetPassword, + login, me, init, refresh, register, update, forgotPassword, resetPassword, policies, } = require('./resolvers'); function registerUser() { @@ -96,6 +96,11 @@ function registerUser() { ]), ); + this.Query.fields.Policies = { + type: this.buildPoliciesType(), + resolve: policies(this.config), + }; + this.Query.fields[singularLabel] = { type: this.User.graphQL.type, args: { diff --git a/src/users/graphql/resolvers/index.js b/src/users/graphql/resolvers/index.js index 23ddd0b719..a814270fa0 100644 --- a/src/users/graphql/resolvers/index.js +++ b/src/users/graphql/resolvers/index.js @@ -6,6 +6,7 @@ const init = require('./init'); const forgotPassword = require('./forgotPassword'); const resetPassword = require('./resetPassword'); const update = require('./update'); +const policies = require('./policies'); module.exports = { login, @@ -16,4 +17,5 @@ module.exports = { forgotPassword, resetPassword, update, + policies, }; diff --git a/src/users/graphql/resolvers/policies.js b/src/users/graphql/resolvers/policies.js index 05459559c6..6ef96a0c13 100644 --- a/src/users/graphql/resolvers/policies.js +++ b/src/users/graphql/resolvers/policies.js @@ -1,6 +1,6 @@ const { policies } = require('../../operations'); -const loginResolver = config => async (_, __, context) => { +const policyResolver = config => async (_, __, context) => { const options = { config, req: context, @@ -10,4 +10,4 @@ const loginResolver = config => async (_, __, context) => { return policyResults; }; -module.exports = loginResolver; +module.exports = policyResolver; diff --git a/src/users/operations/policies.js b/src/users/operations/policies.js index 292e22d339..cf9d0513a6 100644 --- a/src/users/operations/policies.js +++ b/src/users/operations/policies.js @@ -15,13 +15,22 @@ const policies = async (args) => { config.collections.forEach((collection) => { policyResults[collection.slug] = {}; - const baseOperations = ['create', 'read', 'update', 'delete']; + const operations = ['create', 'read', 'update', 'delete']; + + operations.forEach(async (operation) => { + policyResults[collection.slug][operation] = {}; - baseOperations.forEach(async (operation) => { if (typeof collection.policies[operation] === 'function') { - policyResults[collection.slug][operation] = await collection.policies[operation]({ req }); + const result = await collection.policies[operation]({ req }); + + if (typeof result === 'object') { + policyResults[collection.slug][operation].permission = true; + policyResults[collection.slug][operation].where = result; + } else { + policyResults[collection.slug][operation].permission = !!(result); + } } else { - policyResults[collection.slug][operation] = isLoggedIn; + policyResults[collection.slug][operation].permission = isLoggedIn; } }); });