docs: API-ENDPOINTS + SCHEMA für Override und Wochenend-Sperre

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Jesko Anschütz 2026-03-27 20:25:50 +01:00
parent fc94f56162
commit db68c84d45
2 changed files with 117 additions and 0 deletions

View file

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

View file

@ -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: