diff --git a/server/backend/internal/store/store.go b/server/backend/internal/store/store.go index 986deb8..9f98f30 100644 --- a/server/backend/internal/store/store.go +++ b/server/backend/internal/store/store.go @@ -42,10 +42,11 @@ type ScreenStatus struct { } type ScreenSchedule struct { - ScreenID string `json:"screen_id"` - ScheduleEnabled bool `json:"schedule_enabled"` - PowerOnTime string `json:"power_on_time"` - PowerOffTime string `json:"power_off_time"` + ScreenID string `json:"screen_id"` + ScheduleEnabled bool `json:"schedule_enabled"` + PowerOnTime string `json:"power_on_time"` + PowerOffTime string `json:"power_off_time"` + OverrideOnUntil *time.Time `json:"override_on_until,omitempty"` } type MediaAsset struct { @@ -653,9 +654,9 @@ func scanPlaylistItem(row interface { func (s *ScreenScheduleStore) Get(ctx context.Context, screenID string) (*ScreenSchedule, error) { var sc ScreenSchedule err := s.pool.QueryRow(ctx, - `select screen_id, schedule_enabled, power_on_time, power_off_time + `select screen_id, schedule_enabled, power_on_time, power_off_time, override_on_until from screen_schedules where screen_id = $1`, screenID). - Scan(&sc.ScreenID, &sc.ScheduleEnabled, &sc.PowerOnTime, &sc.PowerOffTime) + Scan(&sc.ScreenID, &sc.ScheduleEnabled, &sc.PowerOnTime, &sc.PowerOffTime, &sc.OverrideOnUntil) if errors.Is(err, pgx.ErrNoRows) { return &ScreenSchedule{ScreenID: screenID}, nil } @@ -668,20 +669,21 @@ func (s *ScreenScheduleStore) Get(ctx context.Context, screenID string) (*Screen // Upsert speichert oder aktualisiert den Zeitplan eines Screens. func (s *ScreenScheduleStore) Upsert(ctx context.Context, sc *ScreenSchedule) error { _, err := s.pool.Exec(ctx, - `insert into screen_schedules (screen_id, schedule_enabled, power_on_time, power_off_time) - values ($1, $2, $3, $4) + `insert into screen_schedules (screen_id, schedule_enabled, power_on_time, power_off_time, override_on_until) + values ($1, $2, $3, $4, $5) on conflict (screen_id) do update - set schedule_enabled = excluded.schedule_enabled, - power_on_time = excluded.power_on_time, - power_off_time = excluded.power_off_time`, - sc.ScreenID, sc.ScheduleEnabled, sc.PowerOnTime, sc.PowerOffTime) + set schedule_enabled = excluded.schedule_enabled, + power_on_time = excluded.power_on_time, + power_off_time = excluded.power_off_time, + override_on_until = excluded.override_on_until`, + sc.ScreenID, sc.ScheduleEnabled, sc.PowerOnTime, sc.PowerOffTime, sc.OverrideOnUntil) return err } // ListEnabled gibt alle Screens mit aktivem Zeitplan zurück. func (s *ScreenScheduleStore) ListEnabled(ctx context.Context) ([]*ScreenSchedule, error) { rows, err := s.pool.Query(ctx, - `select screen_id, schedule_enabled, power_on_time, power_off_time + `select screen_id, schedule_enabled, power_on_time, power_off_time, override_on_until from screen_schedules where schedule_enabled = true and (power_on_time != '' or power_off_time != '')`) @@ -692,7 +694,7 @@ func (s *ScreenScheduleStore) ListEnabled(ctx context.Context) ([]*ScreenSchedul var out []*ScreenSchedule for rows.Next() { var sc ScreenSchedule - if err := rows.Scan(&sc.ScreenID, &sc.ScheduleEnabled, &sc.PowerOnTime, &sc.PowerOffTime); err != nil { + if err := rows.Scan(&sc.ScreenID, &sc.ScheduleEnabled, &sc.PowerOnTime, &sc.PowerOffTime, &sc.OverrideOnUntil); err != nil { return nil, err } out = append(out, &sc)