3 KiB
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 hochladenPOST /manage/{screenSlug}/items— Playlist-Eintrag hinzufügenPOST /manage/{screenSlug}/reorder— Playlist sortierenDELETE /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)