ADR-021: Dashboard operator restaurant context
Status: Accepted
Kontext
Das Dashboard hängt an einem eigenen Host (dashboard.bytebite.test / dashboard.staging.getbytebite.co), nicht an einem Restaurant-Hostname. Slice 2 braucht einen Operator-Kontext, damit Luigi-Menüs editierbar und von Mario isoliert bleiben. Better Auth (ADR-019) now requires a staff session for /dashboard/*; it still does not bind operators to a restaurant.
Entscheidung
Dashboard-Routen nutzen den Pfad /dashboard/restaurants/:restaurantId/... als Operator-Kontext. Unauthenticated /dashboard/* is 401. The path, not session.restaurantId, is still the tenant.
- Hostname-Tenant-Lookup gilt nicht für
/dashboard - Public Storefront bleibt ausschließlich hostname-basiert
- Jede Mutation filtert
restaurant_idaus dem Pfad; fremde UUIDs ergeben 404 - Body-
restaurantIddarf den Pfad nicht überschreiben
Ein Restaurant-Wechsler in der Dashboard-UI speichert die Auswahl lokal. Staging-HTTPS (Storefront, Dashboard, API) liegt hinter Traefik BasicAuth. Das ersetzt kein Restaurant-Login: wer das Staging-Passwort hat, kann beide Seed-Restaurants editieren.
Konsequenzen
- Slice 2 kann den DoD-Pfad Dashboard → Persistenz → Storefront ohne Auth erfüllen.
- Das ist kein Production-Auth-Modell. Ein späterer Cutover ersetzt den Pfad-Kontext durch
session.restaurantId. The session gate does not do that cutover — see Staff authentication. - Wer das Staging-BasicAuth-Passwort hat, kann beide Seed-Restaurants editieren. Tenant-Isolation bleibt eine API-/DB-Eigenschaft, keine Rollengrenze. Ein eingeloggter Staff-User darf in diesem Scaffold denselben Pfad treffen.