40 lines
818 B
JavaScript
40 lines
818 B
JavaScript
|
import rules from "../../rules";
|
||
|
|
||
|
const check = (role, action, data) => {
|
||
|
const permissions = rules[role];
|
||
|
if (!permissions) {
|
||
|
// role is not present in the rules
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
const staticPermissions = permissions.static;
|
||
|
|
||
|
if (staticPermissions && staticPermissions.includes(action)) {
|
||
|
// static rule not provided for action
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
const dynamicPermissions = permissions.dynamic;
|
||
|
|
||
|
if (dynamicPermissions) {
|
||
|
const permissionCondition = dynamicPermissions[action];
|
||
|
if (!permissionCondition) {
|
||
|
// dynamic rule not provided for action
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return permissionCondition(data);
|
||
|
}
|
||
|
return false;
|
||
|
};
|
||
|
|
||
|
const Can = ({ role, perform, data, yes, no }) =>
|
||
|
check(role, perform, data) ? yes() : no();
|
||
|
|
||
|
Can.defaultProps = {
|
||
|
yes: () => null,
|
||
|
no: () => null,
|
||
|
};
|
||
|
|
||
|
export { Can };
|