81 lines
2.0 KiB
JavaScript
81 lines
2.0 KiB
JavaScript
export function getRoleWithComputedPermissions(role) {
|
|
if (!role) return {};
|
|
const computedPermissions = role.permissions?.reduce(
|
|
(computedPermissions, permission) => ({
|
|
...computedPermissions,
|
|
[permission.subject]: {
|
|
...(computedPermissions[permission.subject] || {}),
|
|
[permission.action]: {
|
|
conditions: Object.fromEntries(
|
|
permission.conditions.map((condition) => [condition, true]),
|
|
),
|
|
value: true,
|
|
},
|
|
},
|
|
}),
|
|
{},
|
|
);
|
|
|
|
return {
|
|
...role,
|
|
computedPermissions,
|
|
};
|
|
}
|
|
export function getPermissions(computedPermissions) {
|
|
if (!computedPermissions) return [];
|
|
|
|
return Object.entries(computedPermissions).reduce(
|
|
(permissions, computedPermissionEntry) => {
|
|
const [subject, actionsWithConditions] = computedPermissionEntry;
|
|
for (const action in actionsWithConditions) {
|
|
const { value: permitted, conditions = {} } =
|
|
actionsWithConditions[action];
|
|
if (permitted) {
|
|
permissions.push({
|
|
action,
|
|
subject,
|
|
conditions: Object.entries(conditions)
|
|
.filter(([, enabled]) => enabled)
|
|
.map(([condition]) => condition),
|
|
});
|
|
}
|
|
}
|
|
return permissions;
|
|
},
|
|
[],
|
|
);
|
|
}
|
|
|
|
export const getComputedPermissionsDefaultValues = (
|
|
data,
|
|
conditionsInitialValues,
|
|
) => {
|
|
if (!data) return {};
|
|
|
|
const conditions = {};
|
|
data.conditions.forEach((condition) => {
|
|
conditions[condition.key] =
|
|
conditionsInitialValues?.[condition.key] || false;
|
|
});
|
|
|
|
const result = {};
|
|
|
|
data.subjects.forEach((subject) => {
|
|
const subjectKey = subject.key;
|
|
result[subjectKey] = {};
|
|
|
|
data.actions.forEach((action) => {
|
|
const actionKey = action.key;
|
|
|
|
if (action.subjects.includes(subjectKey)) {
|
|
result[subjectKey][actionKey] = {
|
|
value: false,
|
|
conditions: { ...conditions },
|
|
};
|
|
}
|
|
});
|
|
});
|
|
|
|
return result;
|
|
};
|