Permission System - Systematische Button-Kontrolle
Executive Overview — all summaries for decision-makers.
🎯 Ziel
Buttons (Create, AI Edit, AI Generate) sollen automatisch für bestimmte Rollen versteckt werden, OHNE dass jede Page manuell angepasst werden muss.
✅ Systematische Lösung
1. Permission Helper (src/lib/permissions.ts)
typescript
/**
* Prüft ob ein User "Create" Buttons sehen darf
* LEGAL_ADVISOR und READ_ONLY dürfen KEINE Create-Buttons sehen
*/
export function canCreate(role: Role): boolean {
return !isReadOnly(role) && !isLegalAdvisor(role);
}Verwendung:
- Zentrale Logik für alle Create/Edit-Permissions
- Einfach erweiterbar für neue Rollen
2. PageHeader Component (src/components/layout/page-header.tsx)
AUTOMATISCHE PERMISSION-PRÜFUNG:
aiActionswerden automatisch versteckt fürLEGAL_ADVISORundREAD_ONLYcreateActionwird automatisch versteckt fürLEGAL_ADVISORundREAD_ONLY
Verwendung:
tsx
<PageHeader
title="Policies"
description="Verwaltung aller Richtlinien"
aiActions={aiActions} // ← Automatisch versteckt für LEGAL_ADVISOR
createAction={{ // ← Automatisch versteckt für LEGAL_ADVISOR
label: "New Policy",
onClick: () => setShowForm(true)
}}
/>KEIN manueller Permission-Check nötig!
3. CreateButton Component (src/components/ui/create-button.tsx)
AUTOMATISCHE PERMISSION-PRÜFUNG:
- Versteckt sich automatisch für
LEGAL_ADVISORundREAD_ONLY
Verwendung:
tsx
import { CreateButton } from '@/components/ui/create-button';
<CreateButton
onClick={() => setShowForm(true)}
label="New Entity"
/>KEIN manueller Permission-Check nötig!
4. AIEditButtonV2 Component (src/components/ai/ai-edit-button-v2.tsx)
AUTOMATISCHE PERMISSION-PRÜFUNG:
- Versteckt sich automatisch für
LEGAL_ADVISORundREAD_ONLY
Verwendung:
tsx
import { AIEditButtonV2 } from '@/components/ai';
<AIEditButtonV2
entityType="Chapter"
entityId={chapter.id}
entityCode={chapter.slug}
/>KEIN manueller Permission-Check nötig!
📋 Migration Guide
ALT (Manuell):
tsx
// ❌ NICHT MEHR SO MACHEN:
const { user } = useAuth();
{user && canCreate(user.role) && (
<Button onClick={() => setShowForm(true)}>
<Plus className="h-4 w-4 mr-2" />
New Entity
</Button>
)}NEU (Automatisch):
tsx
// ✅ SO MACHEN:
import { CreateButton } from '@/components/ui/create-button';
<CreateButton onClick={() => setShowForm(true)} label="New Entity" />🚀 Vorteile
- Zentrale Kontrolle: Permissions nur an EINER Stelle (
src/lib/permissions.ts) - Automatisch: Komponenten verstecken sich selbst
- Weniger Code: Keine manuellen Permission-Checks in Pages
- Weniger Fehler: Keine vergessenen Permission-Checks
- Einfach erweiterbar: Neue Rollen nur in
permissions.tshinzufügen
📝 Neue Rolle hinzufügen
Beispiel: Neue Rolle VIEWER soll KEINE Create-Buttons sehen
- Prisma Schema (
prisma/schema.prisma):
prisma
enum Role {
ADMIN
MANAGEMENT
STAFF
READ_ONLY
LEGAL_ADVISOR
VIEWER // ← NEU
}- Permission Helper (
src/lib/permissions.ts):
typescript
export function canCreate(role: Role): boolean {
return !isReadOnly(role) && !isLegalAdvisor(role) && role !== 'VIEWER';
}- FERTIG! Alle Buttons verstecken sich automatisch für
VIEWER
🔍 Komponenten-Übersicht
| Komponente | Auto-Permission | Verwendung |
|---|---|---|
PageHeader | ✅ Ja | Seiten-Header mit AI + Create Actions |
CreateButton | ✅ Ja | Standalone Create-Button |
AIEditButtonV2 | ✅ Ja | AI Edit Button auf Detail-Seiten |
AIActionButton | ✅ Ja | AI Action Dropdown |
AIActionButtonV2 | ✅ Ja | AI Action Button V2 |
📚 Weitere Dokumentation
- Permission Helpers:
src/lib/permissions.ts - Rolle-Typen:
src/types/index.ts - Prisma Schema:
prisma/schema.prisma