Jesko Anschütz
7b0b132169
feat(ui): manage-Handler — restricted-aware List/Create/Delete
2026-03-28 09:09:59 +01:00
Jesko Anschütz
865c5e7ca8
feat(manage): canDeleteMedia + role-aware handlers für restricted users
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 09:07:13 +01:00
Jesko Anschütz
52f503d462
feat(store): MediaAsset-Ownership — List/Create/Get mit created_by_user_id
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 09:03:44 +01:00
Jesko Anschütz
c40c846436
feat(db): created_by_user_id zu media_assets hinzufügen
2026-03-28 09:01:00 +01:00
Jesko Anschütz
b4d0a24320
fix(auth): restricted-User landen nach Login auf eigenen Screens (nicht Tenant-Dashboard)
...
Login und already-logged-in-Check verwendeten default-Branch für restricted-Rolle,
der zum Tenant-Dashboard mit allen Screens führte. Jetzt wie screen_user behandelt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 21:59:32 +01:00
Jesko Anschütz
787287b328
fix(restricted): Display-Box ausblenden; Sidebar zeigt nur eigene Screens
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 21:43:51 +01:00
Jesko Anschütz
c943df4663
feat(ui): restricted-User sehen keine Steuerungs-UI (An/Aus, Zeitplan, Override)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 21:38:37 +01:00
Jesko Anschütz
e35c3cfdbd
feat(ui): Admin-Formular: Rolle-Dropdown + Badge in User-Liste
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 21:35:52 +01:00
Jesko Anschütz
03ea3edb8b
feat(handler): HandleCreateScreenUser liest role; UserRole ans Template übergeben
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 21:34:21 +01:00
Jesko Anschütz
f1dcb4f1d3
feat(router): Steuerungs-Endpunkte blocken restricted-User (403)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 21:32:40 +01:00
Jesko Anschütz
18ba448f05
feat(store): CreateScreenUser nimmt role-Parameter; ListScreenUsers schließt restricted ein
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 21:31:15 +01:00
Jesko Anschütz
700567071b
feat(auth): RequireNotRestricted middleware
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 21:29:26 +01:00
Jesko Anschütz
958090cb00
feat(admin): Link zu Monitor-Steuerung im Admin-Navbar
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 20:55:50 +01:00
Jesko Anschütz
bb30a75f5a
fix(ui): Admin sieht /manage mit allen Screens statt Redirect
2026-03-27 20:53:23 +01:00
Jesko Anschütz
2bf82eed53
fix: Upsert löscht override_on_until nicht mehr; README + Auth-Kommentar
...
- ScreenScheduleStore.Upsert: override_on_until aus INSERT und ON CONFLICT
entfernt — verhindert stillen Datenverlust beim Speichern eines Zeitplans.
SetOverrideOnUntil bleibt alleinig zuständig für diese Spalte.
- README.md: GlobalOverrideStore, vier neue API-Routen, Wochenend-Sperre
und Migration 006_override.sql dokumentiert.
- override.go: Auth-Scope-Kommentar über HandleSetGlobalOverride ergänzt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 20:30:52 +01:00
Jesko Anschütz
fc94f56162
feat(ui): per-Screen-Override in Übersichtskarte und Detailseite
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 20:24:21 +01:00
Jesko Anschütz
c263d97cca
feat(ui): Übersichtsseite – globaler Override-Banner
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 20:21:06 +01:00
Jesko Anschütz
9aabf18aa2
feat(wiring): GlobalOverrideStore in Router, App und Scheduler-Goroutinen
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 20:19:03 +01:00
Jesko Anschütz
42458e68ff
feat(manage): Handler für globalen + per-Screen-Override
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 20:17:20 +01:00
Jesko Anschütz
0ca63a5367
feat(scheduler): check() unterdrückt display_on bei Wochenende/Override
2026-03-27 20:15:21 +01:00
Jesko Anschütz
81711f2f3d
feat(scheduler): Reconciler iteriert alle Screens + resolveDesiredState
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 20:14:32 +01:00
Jesko Anschütz
e76f89798f
feat(scheduler): resolveDesiredState – per-Screen, global, Wochenende, Zeitplan
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 20:13:23 +01:00
Jesko Anschütz
be3a5f5aac
feat(store): ScreenSchedule.OverrideOnUntil – Struct, Get, Upsert, ListEnabled
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 20:11:41 +01:00
Jesko Anschütz
8f1abd977b
feat(store): GlobalOverrideStore + SetOverrideOnUntil
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 20:10:36 +01:00
Jesko Anschütz
1b7c48f27f
feat(db): Migration 006 – global_override-Tabelle + override_on_until
2026-03-27 20:09:23 +01:00
Jesko Anschütz
ccec32c832
feat(scheduler): Reconciler gleicht Ist- und Soll-Display-Zustand ab
...
Fügt Reconcile() und desiredState() zum Scheduler-Package hinzu.
Der Reconciler läuft alle 5 Minuten, berechnet den Soll-Zustand aus
den konfigurierten Ein-/Ausschaltzeiten (inkl. Mitternacht-Überschreitung)
und sendet bei Abweichung oder unbekanntem Ist-Zustand einen MQTT-Befehl.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 18:33:48 +01:00
Jesko Anschütz
88e10d1e67
fix(ui): saveSchedule nutzt SCREEN_SLUG statt printf %q
2026-03-27 17:57:31 +01:00
Jesko Anschütz
e7776720c8
fix(ui): sendDisplayCmd nutzt SCREEN_SLUG statt printf %q (URL-Escaping-Bug)
2026-03-27 17:56:46 +01:00
Jesko Anschütz
dc16a0fbd0
fix(store): GetDisplayState unterscheidet pgx.ErrNoRows; tz-Kommentar im Scheduler
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 07:32:28 +01:00
Jesko Anschütz
588045ac04
feat(ui): Zeitplan-Formular in Playlist-Verwaltung
2026-03-27 07:23:38 +01:00
Jesko Anschütz
6cabaeca58
feat(manage): Schedule in ManageUI-Template-Daten
2026-03-27 07:23:07 +01:00
Jesko Anschütz
fc5587c171
fix: Zeitformat-Validierung + pgx.ErrNoRows in ScreenScheduleStore.Get
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 07:21:01 +01:00
Jesko Anschütz
83af005fad
feat(api): POST /api/v1/screens/{slug}/schedule + Scheduler verdrahtet
...
ScheduleStore in RouterDeps, HandleUpdateSchedule-Handler, Scheduler-Goroutine
in app.Run(), ScreenStore.GetByID hinzugefügt.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 07:17:45 +01:00
Jesko Anschütz
9b766f9086
feat(scheduler): Display-Zeitplan-Scheduler Package
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 07:17:40 +01:00
Jesko Anschütz
7e485e505e
feat(store): ScreenScheduleStore mit Get/Upsert/ListEnabled
...
Fügt ScreenSchedule-Typ, ScreenScheduleStore und GetByID-Methode
für ScreenStore hinzu.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 07:17:37 +01:00
Jesko Anschütz
1556c0d002
feat(db): screen_schedules-Tabelle für Zeitplan
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 07:17:34 +01:00
Jesko Anschütz
bdd99d10bd
feat(ui): Display-Buttons und Sammelschalter in Screen-Übersicht
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 07:10:40 +01:00
Jesko Anschütz
68fc0bf4cf
feat(ui): Display-Steuerbox in Playlist-Verwaltung
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 07:10:23 +01:00
Jesko Anschütz
2a312cd61a
feat(manage): DisplayState je Screen in ScreenOverview
2026-03-27 07:05:06 +01:00
Jesko Anschütz
c4f15d862c
feat(manage): DisplayState in ManageUI-Template-Daten
2026-03-27 07:04:54 +01:00
Jesko Anschütz
086f093cb9
feat(store): GetDisplayState für screen_status
2026-03-27 07:02:26 +01:00
Jesko Anschütz
79fcc20b79
fix(display): screen UUID lookup, authScreen middleware, JSON encoding
...
- playerstatus: look up screen by slug before UpsertDisplayState to pass UUID (not slug) and avoid FK violation
- router: switch display command route from authOnly to authScreen for proper permission enforcement
- display.go: remove redundant GetBySlug + requireScreenAccess (now handled by authScreen middleware), drop store dependency
- notifier: replace fmt.Sprintf %q with json.Marshal for correct JSON encoding of display command payload
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-26 23:35:05 +01:00
Jesko Anschütz
f985a99ea1
feat(api): display_state im Player-Status-Report persistieren
2026-03-26 23:05:25 +01:00
Jesko Anschütz
fbcda1e2b8
feat(api): POST /api/v1/screens/{slug}/display
2026-03-26 23:05:22 +01:00
Jesko Anschütz
0d51d951a2
feat(mqtt): SendDisplayCommand mit retained QoS 1
2026-03-26 23:05:20 +01:00
Jesko Anschütz
c359757e31
feat(store): UpsertDisplayState für screen_status
2026-03-26 23:05:18 +01:00
Jesko Anschütz
a833220ca6
feat(db): screen_status-Tabelle für Display-Zustand
2026-03-26 23:05:15 +01:00
Jesko Anschütz
052cf199ae
fix(manage): HandleReorder gibt 400 bei Mismatch zurück, slog für 500-Fehler
2026-03-26 22:29:48 +01:00
Jesko Anschütz
4fab5fe28a
fix(manage): HandleReorderUI gibt 400 bei Mismatch zurück
2026-03-26 22:27:07 +01:00
Jesko Anschütz
1c11aa9877
fix(store): Reorder validiert Vollständigkeit und RowsAffected
2026-03-26 22:25:47 +01:00