feat(users): allow system roles to be renamed but not have permissions changed
- update `updateRole` to allow name changes for system roles while blocking permission updates - remove edit button restriction for system roles in roles page - disable name field only was replaced by disabling permissions checkboxes for system roles in edit modal - update README to reflect new system role update policy
This commit is contained in:
@@ -214,7 +214,7 @@ await assignUserRole(userId, roleId);
|
|||||||
await revokeUserRole(userId, roleId);
|
await revokeUserRole(userId, roleId);
|
||||||
```
|
```
|
||||||
|
|
||||||
Les rôles système (`is_system = true`) ne peuvent pas être modifiés ni supprimés.
|
Les rôles système (`is_system = true`) peuvent être renommés mais leurs permissions ne peuvent pas être modifiées. Ils ne peuvent pas être supprimés.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -54,15 +54,13 @@ export async function updateRole(roleId, { name, description, color, permissionK
|
|||||||
if (role.rows.length === 0) throw new Error('Role not found');
|
if (role.rows.length === 0) throw new Error('Role not found');
|
||||||
|
|
||||||
const isSystem = role.rows[0].is_system;
|
const isSystem = role.rows[0].is_system;
|
||||||
if (isSystem) throw new Error('Cannot update a system role');
|
|
||||||
|
|
||||||
return transaction(async (client) => {
|
return transaction(async (client) => {
|
||||||
const updateFields = [];
|
const updateFields = [];
|
||||||
const values = [];
|
const values = [];
|
||||||
let idx = 1;
|
let idx = 1;
|
||||||
|
|
||||||
// System roles cannot be renamed
|
if (name !== undefined) {
|
||||||
if (!isSystem && name !== undefined) {
|
|
||||||
if (!name.trim()) throw new Error('Role name cannot be empty');
|
if (!name.trim()) throw new Error('Role name cannot be empty');
|
||||||
updateFields.push(`name = $${idx++}`);
|
updateFields.push(`name = $${idx++}`);
|
||||||
values.push(name.trim());
|
values.push(name.trim());
|
||||||
@@ -84,7 +82,7 @@ export async function updateRole(roleId, { name, description, color, permissionK
|
|||||||
values
|
values
|
||||||
);
|
);
|
||||||
|
|
||||||
if (permissionKeys !== undefined) {
|
if (!isSystem && permissionKeys !== undefined) {
|
||||||
const safeKeys = [...new Set(permissionKeys)].filter(k => VALID_PERMISSION_KEYS.has(k));
|
const safeKeys = [...new Set(permissionKeys)].filter(k => VALID_PERMISSION_KEYS.has(k));
|
||||||
await client.query(`DELETE FROM zen_auth_role_permissions WHERE role_id = $1`, [roleId]);
|
await client.query(`DELETE FROM zen_auth_role_permissions WHERE role_id = $1`, [roleId]);
|
||||||
for (const key of safeKeys) {
|
for (const key of safeKeys) {
|
||||||
|
|||||||
@@ -125,7 +125,6 @@ const RoleEditModal = ({ roleId, isOpen, onClose, onSaved }) => {
|
|||||||
label="Nom du rôle"
|
label="Nom du rôle"
|
||||||
value={name}
|
value={name}
|
||||||
onChange={setName}
|
onChange={setName}
|
||||||
disabled={isSystem}
|
|
||||||
placeholder="Éditeur, Modérateur..."
|
placeholder="Éditeur, Modérateur..."
|
||||||
required
|
required
|
||||||
/>
|
/>
|
||||||
@@ -162,6 +161,7 @@ const RoleEditModal = ({ roleId, isOpen, onClose, onSaved }) => {
|
|||||||
onChange={() => togglePerm(perm.key)}
|
onChange={() => togglePerm(perm.key)}
|
||||||
label={perm.name}
|
label={perm.name}
|
||||||
description={perm.description}
|
description={perm.description}
|
||||||
|
disabled={isSystem}
|
||||||
/>
|
/>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -81,7 +81,6 @@ const RolesPageClient = ({ canManage }) => {
|
|||||||
align: 'right',
|
align: 'right',
|
||||||
render: (role) => (
|
render: (role) => (
|
||||||
<div className="flex items-center justify-end gap-2">
|
<div className="flex items-center justify-end gap-2">
|
||||||
{!role.is_system && (
|
|
||||||
<Button
|
<Button
|
||||||
variant="secondary"
|
variant="secondary"
|
||||||
onClick={() => openEdit(role.id)}
|
onClick={() => openEdit(role.id)}
|
||||||
@@ -89,7 +88,6 @@ const RolesPageClient = ({ canManage }) => {
|
|||||||
>
|
>
|
||||||
Modifier
|
Modifier
|
||||||
</Button>
|
</Button>
|
||||||
)}
|
|
||||||
{!role.is_system && (
|
{!role.is_system && (
|
||||||
<Button
|
<Button
|
||||||
variant="danger"
|
variant="danger"
|
||||||
|
|||||||
Reference in New Issue
Block a user