diff --git a/docs/API-ENDPOINTS.md b/docs/API-ENDPOINTS.md index 7a2b244..ac66752 100644 --- a/docs/API-ENDPOINTS.md +++ b/docs/API-ENDPOINTS.md @@ -587,6 +587,93 @@ Der Scheduler prüft jede Minute, ob die aktuelle Uhrzeit mit `power_on_time` od --- +### Globaler Override + +| Methode | Pfad | Auth | Beschreibung | +|---------|------|------|--------------| +| GET | `/api/v1/global-override` | authUser | Aktiven Override abrufen (204 wenn keiner aktiv) | +| POST | `/api/v1/global-override` | authUser | Override setzen + sofort MQTT an alle Screens | +| DELETE | `/api/v1/global-override` | authUser | Override aufheben | + +**GET /api/v1/global-override** + +Ruft den aktuell aktiven globalen Override ab. + +**Response:** `200 OK` (wenn aktiv) +```json +{"type":"off","until":"2026-04-05T18:00:00+02:00","set_at":"2026-03-27T15:30:00+02:00"} +``` + +**Response:** `204 No Content` (wenn kein Override aktiv) + +--- + +**POST /api/v1/global-override** + +Setzt einen globalen Override und sendet sofort MQTT-Befehle an alle Screens. + +**Request-Body:** +```json +{"type":"off","until":"2026-04-05T18:00:00+02:00"} +``` + +**Response:** `200 OK` +```json +{"type":"off","until":"2026-04-05T18:00:00+02:00","set_at":"2026-03-27T15:30:00+02:00"} +``` + +**Fehler:** +- `400 Bad Request` — `type` nicht "on"/"off", oder ungültiges Zeitformat +- `500 Internal Server Error` — DB-Fehler + +--- + +**DELETE /api/v1/global-override** + +Hebt den aktuellen globalen Override auf. + +**Response:** `204 No Content` + +**Fehler:** +- `500 Internal Server Error` — DB-Fehler + +--- + +### Per-Screen Override + +| Methode | Pfad | Auth | Beschreibung | +|---------|------|------|--------------| +| POST | `/api/v1/screens/{screenSlug}/override` | authScreen | Per-Screen "Einschalten bis" setzen oder löschen | + +**POST /api/v1/screens/{screenSlug}/override** + +Setzt oder löscht den per-Screen "Einschalten bis"-Override. Mit diesem Override bleibt ein Monitor bis zu +dem angegebenen Zeitpunkt eingeschaltet, selbst wenn der globale Schedule "aus" vorsieht. + +**Auth:** Erforderlich. Screen-Zugriff erforderlich. + +**Path-Parameter:** +- `screenSlug` — Slug des Screens + +**Request-Body:** +```json +{"on_until":"2026-04-05T18:00:00+02:00"} +``` + +Um den Override zu löschen, `on_until` auf `null` setzen: +```json +{"on_until":null} +``` + +**Response:** `204 No Content` + +**Fehler:** +- `400 Bad Request` — Ungültiges Zeitformat oder ungültiges JSON +- `404 Not Found` — Screen nicht vorhanden +- `500 Internal Server Error` — DB-Fehler + +--- + ## Message Wall ### POST /api/v1/tools/message-wall/resolve diff --git a/docs/SCHEMA.md b/docs/SCHEMA.md index 51944f0..c512fbf 100644 --- a/docs/SCHEMA.md +++ b/docs/SCHEMA.md @@ -523,6 +523,36 @@ Regeln: - `schedule_enabled = false` bedeutet: Zeitplan vorhanden, aber deaktiviert - Leere Zeitfelder bedeuten: kein Einschalt- bzw. kein Ausschaltbefehl +Neue Spalte in `screen_schedules` (Migration `006`): +- `override_on_until timestamptz` — Einschalten-Override: Monitor bleibt bis zu diesem Zeitpunkt eingeschaltet (null = kein Override) + +### `global_override` (Migration 006) + +Zweck: + +- Speichert den globalen Display-Override (maximal eine Zeile) + +Spalten: + +```sql +id INT PRIMARY KEY DEFAULT 1 +type TEXT NOT NULL -- "on" oder "off" +until TIMESTAMPTZ NOT NULL -- Override aktiv bis zu diesem Zeitpunkt +set_at TIMESTAMPTZ NOT NULL DEFAULT now() -- Wann der Override gesetzt wurde +``` + +Constraint: +```sql +CHECK (id = 1) +``` + +Regeln: + +- Die Tabelle enthaelt maximal eine Zeile (id = 1) +- `type` bestimmt den globalen Zielzustand (alle Screens) +- `until` gibt an, wann der Override automatisch aufgehoben wird +- Der Scheduler prueft jede Minute, ob der Override noch aktiv ist (aktuell <= until) + ### `screen_snapshots` Zweck: