morz-infoboard/docs/superpowers/specs/2026-03-27-restricted-rolle-design.md
Jesko Anschütz c5f222cad8 docs: Design-Spec für restricted-Rolle
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 21:19:50 +01:00

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 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)