Commit graph

197 commits

Author SHA1 Message Date
Jesko Anschütz
e884acf41d docs: media_assets.created_by_user_id + Berechtigungslogik dokumentiert
- SCHEMA.md: Index idx_media_assets_created_by_user_id hinzugefügt
- API-ENDPOINTS.md: GET/POST Media-Endpoints erweitert um owner_is_restricted und owner_username
- API-ENDPOINTS.md: DELETE Media-Endpoint mit Berechtigungslogik dokumentiert
  * admin_user: immer erlaubt
  * screen_user: erlaubt wenn asset.tenant_id == user.tenant_id
  * restricted: erlaubt nur wenn asset.created_by_user_id == user.id

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 09:14:35 +01:00
Jesko Anschütz
8bcb59468a feat(ui): Restricted-Medien Toggle + Besitzer-Badge + Kein-Besitzer-Badge
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-28 09:13:07 +01:00
Jesko Anschütz
bfef6e25f5 feat(tenant): List/Create mit owner-Feld aktualisiert 2026-03-28 09:11:16 +01:00
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
e6ad773e74 docs: Implementierungsplan user-spezifische Medien 2026-03-28 08:55:36 +01:00
Jesko Anschütz
922cb905b3 docs: spec — Besitzername bei Restricted-Medien anzeigen 2026-03-28 08:47:17 +01:00
Jesko Anschütz
0feb3073af docs: spec erweitern — Toggle für Restricted-Medien (Admin + screen_user) 2026-03-28 08:45:07 +01:00
Jesko Anschütz
6d74a4aa30 docs: spec user-spezifische Medien für Restricted Users 2026-03-28 08:41:48 +01:00
Jesko Anschütz
522f15c3cd fix(ansible): cloud-init deinstallieren und Verzeichnisse entfernen 2026-03-27 22:10:19 +01:00
Jesko Anschütz
3c7f5ce725 fix(ansible): network-online.target entfernen, network.target reicht 2026-03-27 22:09:27 +01:00
Jesko Anschütz
30548452bc docs: Implementierungsplan Boot-Optimierung 2026-03-27 22:08:15 +01:00
Jesko Anschütz
2ccfd8592b docs: spec Boot-Optimierung network-online + cloud-init 2026-03-27 22:07:34 +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
f70ebddad2 docs: restricted-Rolle in API-Endpoints und README dokumentiert
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 21:40:48 +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
e0ea7f0bde docs: Implementierungsplan für restricted-Rolle
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 21:26:54 +01:00
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
Jesko Anschütz
4996ff6def feat(ansible): agent-Build unterstützt armv7 (Raspi 2) via agent_goarch/agent_goarm
Build-Task in signage_player/tasks/main.yml aufgeteilt: ohne GOARM (default arm64,
bestehende Hosts unverändert) und mit GOARM für armv7-Hosts. Neue host_vars und
Inventory-Einträge für raspi2a und raspi2b (Platzhalterwerte, TODO-Kommentare).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 21:08:06 +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
f5d8311204 feat: Override, Wochenend-Sperre und per-Screen-Override implementiert 2026-03-27 20:38:10 +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
db68c84d45 docs: API-ENDPOINTS + SCHEMA für Override und Wochenend-Sperre
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 20:25:50 +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
78a04dcee7 chore: .worktrees/ zu .gitignore hinzufügen 2026-03-27 20:07:56 +01:00
Jesko Anschütz
e0d7820480 docs: Implementierungsplan für Override und Wochenend-Sperre
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 20:07:06 +01:00
Jesko Anschütz
bb3f11fa66 docs: Design-Spec für globalen Override und Wochenend-Sperre
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 19:55:58 +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
a27ef11b45 docs: Display-Steuerung + Zeitplan in API-ENDPOINTS, SCHEMA, README
- API-ENDPOINTS.md: neue Sektion "Display-Steuerung" mit POST /api/v1/screens/{screenSlug}/display und POST /api/v1/screens/{screenSlug}/schedule
- SCHEMA.md: Hinweis zur vereinfachten screen_status-Tabelle (Migration 004) und neue Sektion screen_schedules (Migration 005)
- server/backend/README.md: scheduler-Package beschrieben, Migrationen 004+005 ergaenzt, Endpunkt-Tabelle aktualisiert

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-27 07:27:50 +01:00