Files
automatisch/packages/web/src/helpers/computePermissions.ee.js
2024-11-08 10:01:49 +00:00

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;
};