Skip to content

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:

  • aiActions werden automatisch versteckt für LEGAL_ADVISOR und READ_ONLY
  • createAction wird automatisch versteckt für LEGAL_ADVISOR und READ_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_ADVISOR und READ_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_ADVISOR und READ_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

  1. Zentrale Kontrolle: Permissions nur an EINER Stelle (src/lib/permissions.ts)
  2. Automatisch: Komponenten verstecken sich selbst
  3. Weniger Code: Keine manuellen Permission-Checks in Pages
  4. Weniger Fehler: Keine vergessenen Permission-Checks
  5. Einfach erweiterbar: Neue Rollen nur in permissions.ts hinzufügen

📝 Neue Rolle hinzufügen

Beispiel: Neue Rolle VIEWER soll KEINE Create-Buttons sehen

  1. Prisma Schema (prisma/schema.prisma):
prisma
enum Role {
  ADMIN
  MANAGEMENT
  STAFF
  READ_ONLY
  LEGAL_ADVISOR
  VIEWER  // ← NEU
}
  1. Permission Helper (src/lib/permissions.ts):
typescript
export function canCreate(role: Role): boolean {
  return !isReadOnly(role) && !isLegalAdvisor(role) && role !== 'VIEWER';
}
  1. FERTIG! Alle Buttons verstecken sich automatisch für VIEWER

🔍 Komponenten-Übersicht

KomponenteAuto-PermissionVerwendung
PageHeader✅ JaSeiten-Header mit AI + Create Actions
CreateButton✅ JaStandalone Create-Button
AIEditButtonV2✅ JaAI Edit Button auf Detail-Seiten
AIActionButton✅ JaAI Action Dropdown
AIActionButtonV2✅ JaAI Action Button V2

📚 Weitere Dokumentation

  • Permission Helpers: src/lib/permissions.ts
  • Rolle-Typen: src/types/index.ts
  • Prisma Schema: prisma/schema.prisma