Files
pole-book/server/node_modules/@strapi/permissions/dist/engine/hooks.mjs

77 lines
2.7 KiB
JavaScript

import { cloneDeep, isArray, has } from 'lodash/fp';
import { hooks } from '@strapi/utils';
import { addCondition } from '../domain/permission/index.mjs';
/**
* Create a hook map used by the permission Engine
*/ const createEngineHooks = ()=>({
'before-format::validate.permission': hooks.createAsyncBailHook(),
'format.permission': hooks.createAsyncSeriesWaterfallHook(),
'after-format::validate.permission': hooks.createAsyncBailHook(),
'before-evaluate.permission': hooks.createAsyncSeriesHook(),
'before-register.permission': hooks.createAsyncSeriesHook()
});
/**
* Create a context from a domain {@link Permission} used by the validate hooks
*/ const createValidateContext = (permission)=>({
get permission () {
return cloneDeep(permission);
}
});
/**
* Create a context from a domain {@link Permission} used by the before valuate hook
*/ const createBeforeEvaluateContext = (permission)=>({
get permission () {
return cloneDeep(permission);
},
addCondition (condition) {
Object.assign(permission, addCondition(condition, permission));
return this;
}
});
/**
* Create a context from a casl Permission & some options
* @param caslPermission
*/ const createWillRegisterContext = ({ permission, options })=>({
...options,
get permission () {
return cloneDeep(permission);
},
condition: {
and (rawConditionObject) {
if (!permission.condition) {
permission.condition = {
$and: []
};
}
if (isArray(permission.condition.$and)) {
permission.condition.$and.push(rawConditionObject);
}
return this;
},
or (rawConditionObject) {
if (!permission.condition) {
permission.condition = {
$and: []
};
}
if (isArray(permission.condition.$and)) {
const orClause = permission.condition.$and.find(has('$or'));
if (orClause) {
orClause.$or.push(rawConditionObject);
} else {
permission.condition.$and.push({
$or: [
rawConditionObject
]
});
}
}
return this;
}
}
});
export { createBeforeEvaluateContext, createEngineHooks, createValidateContext, createWillRegisterContext };
//# sourceMappingURL=hooks.mjs.map