63 lines
1.8 KiB
JavaScript
63 lines
1.8 KiB
JavaScript
import Role from '../../models/role';
|
|
import Permission from '../../models/permission';
|
|
import permissionCatalog from '../../helpers/permission-catalog.ee';
|
|
|
|
const updateRole = async (_parent, params, context) => {
|
|
context.currentUser.can('update', 'Role');
|
|
|
|
const { id, name, description, permissions } = params.input;
|
|
|
|
const role = await Role.query().findById(id).throwIfNotFound();
|
|
|
|
try {
|
|
const updatedRole = await Role.transaction(async (trx) => {
|
|
await role.$relatedQuery('permissions', trx).delete();
|
|
|
|
if (permissions?.length) {
|
|
const sanitizedPermissions = permissions
|
|
.filter((permission) => {
|
|
const { action, subject, conditions } = permission;
|
|
|
|
const relevantAction = permissionCatalog.actions.find(
|
|
(actionCatalogItem) => actionCatalogItem.key === action
|
|
);
|
|
const validSubject = relevantAction.subjects.includes(subject);
|
|
const validConditions = conditions.every((condition) => {
|
|
return !!permissionCatalog.conditions.find(
|
|
(conditionCatalogItem) => conditionCatalogItem.key === condition
|
|
);
|
|
});
|
|
|
|
return validSubject && validConditions;
|
|
})
|
|
.map((permission) => ({
|
|
...permission,
|
|
roleId: role.id,
|
|
}));
|
|
|
|
await Permission.query().insert(sanitizedPermissions);
|
|
}
|
|
|
|
await role.$query(trx).patch({
|
|
name,
|
|
description,
|
|
});
|
|
|
|
return await Role.query(trx)
|
|
.leftJoinRelated({
|
|
permissions: true,
|
|
})
|
|
.withGraphFetched({
|
|
permissions: true,
|
|
})
|
|
.findById(id);
|
|
});
|
|
|
|
return updatedRole;
|
|
} catch (err) {
|
|
throw new Error('The role could not be updated!');
|
|
}
|
|
};
|
|
|
|
export default updateRole;
|