Zum Hauptinhalt springen

Architektur-Übersicht

Projektstruktur

roestify/
├── roestify-app/ # Next.js Anwendung
│ ├── src/
│ │ ├── app/ # App Router (Pages + API Routes)
│ │ ├── components/ # React-Komponenten
│ │ │ └── ui/ # shadcn/ui Primitives
│ │ ├── hooks/ # Custom React Hooks
│ │ ├── lib/ # Utilities (Supabase Client, etc.)
│ │ └── types/ # TypeScript Typen
│ ├── supabase/ # DB-Migrationen
│ └── features/ # Feature-Spezifikationen
├── roestify-docs/ # Docusaurus Dokumentation
└── .claude/ # Claude Code Regeln

Multi-Tenancy

Roestify ist multi-tenant — jede Rösterei hat isolierte Daten. Die Isolation wird durch 6 Schichten sichergestellt:

  1. RLS aktiviert auf jeder Tabelle
  2. RLS-Policies nutzen get_tenant_id()
  3. tenant_id ist NOT NULL + FK → tenants
  4. Default-Wert get_tenant_id() — App muss tenant nie setzen
  5. Immutable tenant_id — UPDATE-Policy verhindert Änderung
  6. CASCADE Delete — Tenant-Löschung entfernt alle Daten (DSGVO)

API-Pattern

Alle API-Routes folgen dem Schema:

/api/v1/{resource}          # GET (Liste), POST (Erstellen)
/api/v1/{resource}/{id} # GET, PUT, DELETE
  • Zod-Validierung auf allen Inputs
  • Authentifizierung über Supabase Session
  • RLS als zweite Verteidigungslinie