mirror of
https://github.com/strapi/strapi.git
synced 2025-07-25 09:56:53 +00:00
61 lines
1.3 KiB
JavaScript
61 lines
1.3 KiB
JavaScript
'use strict';
|
|
|
|
const { propOr } = require('lodash/fp');
|
|
const { policy: policyUtils } = require('@strapi/utils');
|
|
const { PolicyError } = require('@strapi/utils').errors;
|
|
|
|
const getPoliciesConfig = propOr([], 'policies');
|
|
|
|
const createPoliciesMiddleware = (resolverConfig, { strapi }) => {
|
|
const resolverPolicies = getPoliciesConfig(resolverConfig);
|
|
const policies = policyUtils.resolve(resolverPolicies);
|
|
|
|
return async (resolve, ...rest) => {
|
|
// Create a graphql policy context
|
|
const context = createGraphQLPolicyContext(...rest);
|
|
|
|
// Run policies & throw an error if one of them fails
|
|
for (const { handler, config } of policies) {
|
|
const result = await handler(context, config, { strapi });
|
|
|
|
if (![true, undefined].includes(result)) {
|
|
throw new PolicyError();
|
|
}
|
|
}
|
|
|
|
return resolve(...rest);
|
|
};
|
|
};
|
|
|
|
const createGraphQLPolicyContext = (parent, args, context, info) => {
|
|
return policyUtils.createPolicyContext('graphql', {
|
|
get parent() {
|
|
return parent;
|
|
},
|
|
|
|
get args() {
|
|
return args;
|
|
},
|
|
|
|
get context() {
|
|
return context;
|
|
},
|
|
|
|
get info() {
|
|
return info;
|
|
},
|
|
|
|
get state() {
|
|
return this.context.state;
|
|
},
|
|
|
|
get http() {
|
|
return this.context.koaContext;
|
|
},
|
|
});
|
|
};
|
|
|
|
module.exports = {
|
|
createPoliciesMiddleware,
|
|
};
|