feat(store): GlobalOverrideStore + SetOverrideOnUntil
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
1b7c48f27f
commit
8f1abd977b
1 changed files with 63 additions and 0 deletions
|
|
@ -699,3 +699,66 @@ func (s *ScreenScheduleStore) ListEnabled(ctx context.Context) ([]*ScreenSchedul
|
||||||
}
|
}
|
||||||
return out, rows.Err()
|
return out, rows.Err()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// SetOverrideOnUntil setzt oder löscht den per-Screen-Override (null = löschen).
|
||||||
|
func (s *ScreenScheduleStore) SetOverrideOnUntil(ctx context.Context, screenID string, until *time.Time) error {
|
||||||
|
_, err := s.pool.Exec(ctx,
|
||||||
|
`insert into screen_schedules (screen_id, override_on_until)
|
||||||
|
values ($1, $2)
|
||||||
|
on conflict (screen_id) do update
|
||||||
|
set override_on_until = excluded.override_on_until`,
|
||||||
|
screenID, until)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
// GlobalOverrideStore
|
||||||
|
// ------------------------------------------------------------------
|
||||||
|
|
||||||
|
// GlobalOverride beschreibt einen aktiven globalen Display-Override.
|
||||||
|
type GlobalOverride struct {
|
||||||
|
Type string `json:"type"` // "on" oder "off"
|
||||||
|
Until time.Time `json:"until"`
|
||||||
|
SetAt time.Time `json:"set_at"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GlobalOverrideStore verwaltet den globalen Display-Override (max. 1 Zeile).
|
||||||
|
type GlobalOverrideStore struct{ pool *pgxpool.Pool }
|
||||||
|
|
||||||
|
func NewGlobalOverrideStore(pool *pgxpool.Pool) *GlobalOverrideStore {
|
||||||
|
return &GlobalOverrideStore{pool: pool}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get lädt den aktuellen globalen Override. Gibt nil zurück wenn keiner gesetzt ist.
|
||||||
|
func (s *GlobalOverrideStore) Get(ctx context.Context) (*GlobalOverride, error) {
|
||||||
|
var o GlobalOverride
|
||||||
|
err := s.pool.QueryRow(ctx,
|
||||||
|
`select type, until, set_at from global_override where id = 1`).
|
||||||
|
Scan(&o.Type, &o.Until, &o.SetAt)
|
||||||
|
if errors.Is(err, pgx.ErrNoRows) {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &o, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Upsert setzt oder überschreibt den globalen Override.
|
||||||
|
func (s *GlobalOverrideStore) Upsert(ctx context.Context, overrideType string, until time.Time) error {
|
||||||
|
_, err := s.pool.Exec(ctx,
|
||||||
|
`insert into global_override (id, type, until, set_at)
|
||||||
|
values (1, $1, $2, now())
|
||||||
|
on conflict (id) do update
|
||||||
|
set type = excluded.type,
|
||||||
|
until = excluded.until,
|
||||||
|
set_at = excluded.set_at`,
|
||||||
|
overrideType, until)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete entfernt den globalen Override.
|
||||||
|
func (s *GlobalOverrideStore) Delete(ctx context.Context) error {
|
||||||
|
_, err := s.pool.Exec(ctx, `delete from global_override where id = 1`)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue