Admin users continue to redirect to /manage/ as before. Tenant users
now land on their own dashboard at /tenant/{slug}/dashboard instead of
the incorrect /manage/{slug} path. The fix applies to both the
already-logged-in check in HandleLoginUI and the post-login switch in
HandleLoginPost.
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
|
||
|---|---|---|
| .. | ||
| cmd/api | ||
| internal | ||
| Dockerfile | ||
| go.mod | ||
| go.sum | ||
| README.md | ||
Backend
Dieses Verzeichnis enthaelt das zentrale Go-Backend fuer das Info-Board-System.
Aufgaben
- HTTP-API und serverseitige HTML-UI (Bulma)
- PostgreSQL-Anbindung mit automatischen Migrationen
- Session-basierte Authentifizierung und rollenbasierte Zugriffskontrolle
- Medienverwaltung und Playlist-Management
- Player-Status-Ingest und Diagnose
- MQTT-Notifizierungen bei Playlist-Aenderungen
Unterstruktur
cmd/api/— Startpunkt des Backendsinternal/app/— App-Initialisierung und Lifecycleinternal/config/— Konfiguration via Umgebungsvariableninternal/db/— PostgreSQL-Anbindung und Migrations-Runnerinternal/store/— Datenbankzugriff (TenantStore, ScreenStore, MediaStore, PlaylistStore, AuthStore)internal/fileutil/— Upload-Hilfsfunktionen (SaveUploadedFile mit Tenant-Isolation)internal/httpapi/— HTTP-Routing, Middleware und Handlerinternal/httpapi/csrf.go— Double-Submit-Cookie CSRF-Schutzinternal/httpapi/ratelimit.go— Rate-Limiting fuer /login (Brute-Force-Schutz)internal/httpapi/uploads.go— Upload-Handler konsolidiertinternal/httpapi/manage/— Admin-UI und Playlist-Management-UIinternal/httpapi/manage/csrf_helpers.go— CSRF-Token Helpers fuer Templatesinternal/httpapi/tenant/— Tenant-Self-Service-Dashboardinternal/mqttnotifier/— MQTT-Notifizierungeninternal/reqcontext/— Context-Keys fuer authentifizierten User
Aktuelle Endpunkte
Oeffentlich (keine Auth)
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /healthz |
Health-Check |
| GET | /api/v1 |
API-Entrypoint |
| GET | /api/v1/meta |
Metainformationen |
| POST | /api/v1/player/status |
Status-Ingest vom Player-Agent |
| GET | /api/v1/screens/status |
Uebersicht aller Screen-Status |
| GET | /api/v1/screens/{screenId}/status |
Einzelner Screen-Status |
| DELETE | /api/v1/screens/{screenId}/status |
Screen-Status loeschen |
| GET | /api/v1/screens/{screenId}/playlist |
Playlist fuer Player (kein Auth) |
| POST | /api/v1/screens/register |
Agent-Selbstregistrierung |
| POST | /api/v1/tools/message-wall/resolve |
Message-Wall-Aufloesungsendpunkt |
| GET | /status |
HTML-Diagnoseseite |
| GET | /status/{screenId} |
HTML-Detailseite Einzelscreen |
| GET | /uploads/{filename} |
Hochgeladene Dateien abrufen |
| GET | /static/bulma.min.css |
Statisches CSS |
| GET | /static/Sortable.min.js |
Statisches JS |
| GET | /login |
Login-Formular |
| POST | /login |
Login verarbeiten |
| POST | /logout |
Session beenden |
Nur eingeloggte Benutzer (RequireAuth)
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /manage/{screenSlug} |
Playlist-Management-UI |
| POST | /manage/{screenSlug}/upload |
Medium fuer Screen hochladen |
| POST | /manage/{screenSlug}/items |
Item zur Playlist hinzufuegen |
| POST | /manage/{screenSlug}/items/{itemId} |
Item aktualisieren |
| POST | /manage/{screenSlug}/items/{itemId}/delete |
Item loeschen |
| POST | /manage/{screenSlug}/reorder |
Items reordnen |
| POST | /manage/{screenSlug}/media/{mediaId}/delete |
Medium loeschen |
| GET | /api/v1/playlists/{screenId} |
Playlist mit Metadaten abrufen |
| POST | /api/v1/playlists/{playlistId}/items |
Item zur Playlist hinzufuegen (API) |
| PATCH | /api/v1/items/{itemId} |
Item aktualisieren (API) |
| DELETE | /api/v1/items/{itemId} |
Item loeschen (API) |
| PUT | /api/v1/playlists/{playlistId}/order |
Items reordnen (API) |
| PATCH | /api/v1/playlists/{playlistId}/duration |
Standard-Dauer setzen (API) |
| DELETE | /api/v1/media/{id} |
Medium loeschen (API) |
Nur Admins (RequireAuth + RequireAdmin)
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /admin |
Admin-Uebersicht |
| POST | /admin/screens/provision |
Provisionierungs-Job starten |
| POST | /admin/screens |
Neuen Screen anlegen |
| POST | /admin/screens/{screenId}/delete |
Screen loeschen |
Tenant-scoped (RequireAuth + RequireTenantAccess)
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /tenant/{tenantSlug}/dashboard |
Tenant-Self-Service-Dashboard |
| POST | /tenant/{tenantSlug}/upload |
Medium hochladen |
| POST | /tenant/{tenantSlug}/media/{mediaId}/delete |
Medium loeschen |
| GET | /api/v1/tenants/{tenantSlug}/screens |
Screens eines Tenants auflisten |
| POST | /api/v1/tenants/{tenantSlug}/screens |
Screen anlegen |
| GET | /api/v1/tenants/{tenantSlug}/media |
Medien eines Tenants auflisten |
| POST | /api/v1/tenants/{tenantSlug}/media |
Medium hochladen (API) |
Konfiguration
Alle Werte per Umgebungsvariable:
| Variable | Bedeutung | Standard |
|---|---|---|
MORZ_INFOBOARD_HTTP_ADDR |
HTTP-Listen-Adresse | :8080 |
DATABASE_URL |
PostgreSQL-Connection-String | — |
MORZ_INFOBOARD_UPLOAD_DIR |
Verzeichnis fuer hochgeladene Medien | /tmp/morz-uploads |
MORZ_INFOBOARD_STATUS_STORE_PATH |
Pfad zur JSON-Persistenz-Datei fuer Status-Store | leer (in-memory) |
MORZ_INFOBOARD_ADMIN_PASSWORD |
Passwort des initialen Admin-Users (leer = kein Anlegen) | leer |
MORZ_INFOBOARD_DEFAULT_TENANT |
Slug des Tenants, dem der Admin zugeordnet wird | morz |
MORZ_INFOBOARD_DEV_MODE |
true = Session-Cookie ohne Secure-Flag (nur lokal) |
false |
MORZ_INFOBOARD_REGISTER_SECRET |
Pre-Shared-Secret fuer POST /api/v1/screens/register | leer |
MORZ_INFOBOARD_MQTT_BROKER |
MQTT-Broker-URL (leer = kein MQTT) | leer |
MORZ_INFOBOARD_MQTT_USERNAME |
MQTT-Benutzername | leer |
MORZ_INFOBOARD_MQTT_PASSWORD |
MQTT-Passwort | leer |
Detailliertere Beschreibung und lokale Startbeispiele: DEVELOPMENT.md.