feat(auth): add loading state for user and role management (#1188)

This commit is contained in:
Rıdvan Akca
2023-08-09 22:51:07 +03:00
committed by GitHub
parent ce8c9906cb
commit 5046c4c911
10 changed files with 308 additions and 171 deletions

View File

@@ -3,24 +3,33 @@ import { IRole, IPermission } from '@automatisch/types';
type ComputeAction = {
conditions: Record<string, boolean>;
value: boolean;
}
};
type ComputedActions = Record<string, ComputeAction>;
type ComputedPermissions = Record<string, ComputedActions>;
export type RoleWithComputedPermissions = IRole & { computedPermissions: ComputedPermissions };
export type RoleWithComputedPermissions = IRole & {
computedPermissions: ComputedPermissions;
};
export function getRoleWithComputedPermissions(role: IRole): RoleWithComputedPermissions {
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,
export function getRoleWithComputedPermissions(
role?: IRole
): Partial<RoleWithComputedPermissions> {
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,
},
},
}
}), {} as ComputedPermissions);
}),
{} as ComputedPermissions
);
return {
...role,
@@ -31,29 +40,27 @@ export function getRoleWithComputedPermissions(role: IRole): RoleWithComputedPer
export function getPermissions(computedPermissions?: ComputedPermissions) {
if (!computedPermissions) return [];
return Object
.entries(computedPermissions)
.reduce((permissions, computedPermissionEntry) => {
return Object.entries(computedPermissions).reduce(
(permissions, computedPermissionEntry) => {
const [subject, actionsWithConditions] = computedPermissionEntry;
for (const action in actionsWithConditions) {
const {
value: permitted,
conditions = {},
} = actionsWithConditions[action];
const { value: permitted, conditions = {} } =
actionsWithConditions[action];
if (permitted) {
permissions.push({
action,
subject,
conditions: Object
.entries(conditions)
conditions: Object.entries(conditions)
.filter(([, enabled]) => enabled)
.map(([condition]) => condition),
})
});
}
}
return permissions;
}, [] as Partial<IPermission>[]);
},
[] as Partial<IPermission>[]
);
}