feat(users): timezone column + PUT /api/me/timezone
Schema + endpoint scaffolding for #392 Half B (per-user timezone scheduling). Adds two columns to the users table: - timezone text NOT NULL DEFAULT 'UTC' (IANA name) - timezone_updated_at timestamptz (nullable; populated on each PUT) PUT /api/me/timezone validates the IANA value via time.LoadLocation and writes the row. No scheduler integration yet — the scheduler struct lands in the next commit and the handler-side Refresh call in the commit after. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -142,3 +142,24 @@ RETURNING *;
|
||||
-- to keep the unique index happy and to make the lookup
|
||||
-- case-insensitive.
|
||||
SELECT * FROM users WHERE lower(email) = lower($1);
|
||||
|
||||
-- name: UpdateUserTimezone :exec
|
||||
-- Sets the user's IANA timezone and bumps timezone_updated_at. The
|
||||
-- handler validates the timezone string via time.LoadLocation before
|
||||
-- calling this; the DB does not re-validate.
|
||||
UPDATE users
|
||||
SET timezone = $2,
|
||||
timezone_updated_at = now()
|
||||
WHERE id = $1;
|
||||
|
||||
-- name: ListActiveUsersWithTimezones :many
|
||||
-- Returns (id, timezone) for every user with a play in the last 7
|
||||
-- days. The system-playlist scheduler iterates this list at startup
|
||||
-- and during its hourly reconciliation to discover newly-active /
|
||||
-- no-longer-active users.
|
||||
SELECT u.id, u.timezone FROM users u
|
||||
WHERE EXISTS (
|
||||
SELECT 1 FROM play_events pe
|
||||
WHERE pe.user_id = u.id
|
||||
AND pe.started_at > now() - INTERVAL '7 days'
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user