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