/** * Rechte-Enum aus docs/03-auth-und-rechte.md. RoleMapping.permissions ist in der * Datenbank ein String[], diese Liste ist die verbindliche Menge gültiger Werte * und die Grundlage der Kästchen im Adminbereich. */ export const PERMISSIONS = [ 'case.read', 'case.create', 'case.edit', 'case.close', 'case.reopen', 'case.delete', 'case.edit_closed', 'entry.create', 'entry.correct', 'entry.edit_own', 'entry.edit_any', 'entry.retract', 'personnel.read', 'personnel.edit', 'template.manage', 'roles.manage', 'audit.read', 'export.approve', 'admin', ] as const export type Permission = (typeof PERMISSIONS)[number] /** * Diese drei sind im Auslieferungszustand keiner Rolle zugeordnet. Der Leiter * schaltet sie bewusst frei. Der Adminbereich weist beim Zuweisen darauf hin. */ export const OPT_IN_PERMISSIONS: readonly Permission[] = [ 'entry.edit_own', 'entry.edit_any', 'entry.retract', ] export function isPermission(value: string): value is Permission { return (PERMISSIONS as readonly string[]).includes(value) } /** Aufgelöste Rechte eines Nutzers für genau einen Request. */ export type EffectivePermissions = { userId: string /** Höchste Stufe aller Rollen. */ clearanceLevel: number /** Vereinigung aller Rollen. */ permissions: Set /** Aus BOOTSTRAP_ADMIN_IDS oder Recht 'admin'. */ isAdmin: boolean } export function can(p: EffectivePermissions, permission: Permission): boolean { return p.isAdmin || p.permissions.has(permission) }