docs: Design-Spec für restricted-Rolle
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
4996ff6def
commit
c5f222cad8
1 changed files with 80 additions and 0 deletions
80
docs/superpowers/specs/2026-03-27-restricted-rolle-design.md
Normal file
80
docs/superpowers/specs/2026-03-27-restricted-rolle-design.md
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
# Design: Restricted-Rolle für Screen-User
|
||||
|
||||
**Datum:** 2026-03-27
|
||||
**Status:** Approved
|
||||
|
||||
## Zusammenfassung
|
||||
|
||||
Firmen, die einzelne Monitore mieten, erhalten einen User mit der Rolle `"restricted"`. Diese Nutzer dürfen Medien hochladen und die Playlist bearbeiten, aber keine Anzeige-Steuerung (An/Aus, Zeitplan, Override) vornehmen.
|
||||
|
||||
---
|
||||
|
||||
## Datenmodell
|
||||
|
||||
Kein Schema-Change erforderlich. `users.role` ist bereits ein freier String. `"restricted"` wird als dritter gültiger Rollenwert eingeführt (neben `"admin"` und `"screen_user"`).
|
||||
|
||||
`CreateScreenUser()` erhält einen `role`-Parameter (aktuell immer `"screen_user"`), sodass der Admin-Handler beim Anlegen eines Users wahlweise `"screen_user"` oder `"restricted"` übergeben kann.
|
||||
|
||||
Bestehende User behalten ihren bisherigen Wert — kein Migrationsbedarf.
|
||||
|
||||
---
|
||||
|
||||
## Backend-Absicherung
|
||||
|
||||
Neue Middleware `RequireNotRestricted` prüft `user.Role != "restricted"` und gibt andernfalls 403 zurück.
|
||||
|
||||
Sie wird auf folgende Endpunkte in `router.go` gelegt (zusätzlich zur bestehenden `authScreen`-Middleware):
|
||||
|
||||
| Methode | Pfad | Beschreibung |
|
||||
|---------|------|--------------|
|
||||
| `POST` | `/api/v1/screens/{screenSlug}/display` | An/Aus |
|
||||
| `POST` | `/api/v1/screens/{screenSlug}/schedule` | Zeitplan |
|
||||
| `POST` | `/api/v1/screens/{screenSlug}/override` | Per-Screen Override |
|
||||
| `POST` | `/api/v1/global-override` | Globaler Override setzen |
|
||||
| `DELETE` | `/api/v1/global-override` | Globaler Override löschen |
|
||||
|
||||
**Erlaubt bleiben für `restricted`:**
|
||||
- `POST /manage/{screenSlug}/upload` — Medien hochladen
|
||||
- `POST /manage/{screenSlug}/items` — Playlist-Eintrag hinzufügen
|
||||
- `POST /manage/{screenSlug}/reorder` — Playlist sortieren
|
||||
- `DELETE /manage/{screenSlug}/items/{id}` — Playlist-Eintrag entfernen
|
||||
- Alle lesenden Endpunkte
|
||||
|
||||
---
|
||||
|
||||
## UI
|
||||
|
||||
Der Handler übergibt die Rolle des eingeloggten Users als `UserRole string` im Template-Daten-Struct (`screenOverviewData` und `manageData`).
|
||||
|
||||
Das Template blendet per `{{if ne .UserRole "restricted"}}` aus:
|
||||
|
||||
**Übersicht (`/manage`):**
|
||||
- Globaler Override-Banner (komplett)
|
||||
- Bulk-Steuerleiste ("Alle an/aus")
|
||||
- Pro Monitorkarte: An/Aus-Buttons, per-Screen-Override-Widget
|
||||
|
||||
**Detailseite (`/manage/{slug}`):**
|
||||
- Zeitplan-Box
|
||||
- Override-Box ("Einschalten bis")
|
||||
|
||||
Medien-Upload und Playlist bleiben unverändert sichtbar und bedienbar.
|
||||
|
||||
---
|
||||
|
||||
## Admin-UI
|
||||
|
||||
Beim Anlegen eines Screen-Users (`POST /admin/screens/{slug}/users`) gibt es ein neues `<select>`-Feld mit den Optionen:
|
||||
- `screen_user` → "Vollzugriff" (default, bisheriges Verhalten)
|
||||
- `restricted` → "Eingeschränkt (nur Medien/Playlist)"
|
||||
|
||||
Der gewählte Wert wird als `role`-Parameter an `CreateScreenUser()` übergeben.
|
||||
|
||||
Nachträgliches Ändern der Rolle ist nicht vorgesehen — wer die Rolle ändern möchte, legt den User neu an.
|
||||
|
||||
---
|
||||
|
||||
## Nicht im Scope
|
||||
|
||||
- Per-Screen-Rollenmischung (User X hat auf Screen A Vollzugriff, auf Screen B restricted) — nicht benötigt
|
||||
- Nachträgliches Bearbeiten der Rolle eines bestehenden Users
|
||||
- Anzeige der Rolle in der User-Liste (YAGNI)
|
||||
Loading…
Add table
Reference in a new issue