diff --git a/src/docs/completed-routes.yaml b/src/docs/completed-routes.yaml index 3b748ab..d113ae7 100644 --- a/src/docs/completed-routes.yaml +++ b/src/docs/completed-routes.yaml @@ -2034,6 +2034,9 @@ paths: put: tags: [Roles] summary: Save permission matrix for role + description: > + Grants only actions that exist for each module. Sparse modules (e.g. SETTINGS view/edit, + REPORTS/AUDIT_LOGS view/export) ignore true flags for actions that have no permission row. requestBody: required: true content: diff --git a/src/modules/roles/roles.service.js b/src/modules/roles/roles.service.js index f8a1c35..72b1ee4 100644 --- a/src/modules/roles/roles.service.js +++ b/src/modules/roles/roles.service.js @@ -406,8 +406,9 @@ const savePermissionMatrix = async (id, matrix, userId, requestId) => { const perm = catalog.find( (p) => p.module_id.toString() === String(row.module_id) && p.action === action ); - if (!perm) - throw new ApiError(422, `Permission not found for module ${row.module_id}:${action}`); + // Sparse modules (e.g. SETTINGS view/edit only, REPORTS view/export) have no row for + // every action — ignore grants for actions that do not exist in the catalog. + if (!perm) continue; permissionIds.push(perm.id); } }