export const PERMISSIONS = [ { key: 'admin.access', label: 'Admin-Bereich öffnen' }, { key: 'roles.manage', label: 'Rollen & Berechtigungen verwalten' }, { key: 'users.manage', label: 'Benutzer & Rollen verwalten' }, { key: 'site.manage', label: 'Seiten-Einstellungen verwalten' }, { key: 'comment.delete', label: 'Kommentare löschen' }, { key: 'upload.delete', label: 'Uploads löschen' }, { key: 'tag.delete', label: 'Tags löschen' }, { key: 'audit.view', label: 'Audit-Log einsehen' }, ] as const export type PermissionKey = (typeof PERMISSIONS)[number]['key'] export const PERMISSION_KEYS: string[] = PERMISSIONS.map(p => p.key) // System-Rollen: immer vorhanden, nicht löschbar export const SYSTEM_ROLES = ['admin', 'moderator'] as const interface Queryable { query: (sql: string, params?: unknown[]) => Promise } // Permission-Katalog idempotent einpflegen. Läuft sowohl im Nitro-Plugin // (Dev-Start) als auch im manuellen migrate-Script. Die bestehende // moderator-Rolle erhält dabei die bisherigen Moderationsrechte. export async function seedPermissions(db: Queryable) { for (const role of SYSTEM_ROLES) { await db.query('INSERT IGNORE INTO roles (name) VALUES (?)', [role]) } for (const p of PERMISSIONS) { await db.query( 'INSERT INTO permissions (`key`, `label`) VALUES (?, ?) ON DUPLICATE KEY UPDATE `label` = VALUES(`label`)', [p.key, p.label], ) } await db.query( `INSERT IGNORE INTO role_permissions (role_id, permission_id) SELECT r.id, p.id FROM roles r JOIN permissions p ON p.\`key\` IN ('comment.delete', 'upload.delete', 'tag.delete') WHERE r.name = 'moderator'`, ) }