feat(db): add M2 schema — play_sessions, play_events, skip_events
Tables and indexes per spec §5. session_vector_at_play ships nullable so M3 doesn't need a follow-up migration. Table is named play_sessions to avoid collision with the existing sessions (HTTP auth) table from migration 0004.
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
-- name: GetMostRecentPlaySessionForUser :one
|
||||
SELECT * FROM play_sessions
|
||||
WHERE user_id = $1
|
||||
ORDER BY last_event_at DESC
|
||||
LIMIT 1;
|
||||
|
||||
-- name: InsertPlaySession :one
|
||||
INSERT INTO play_sessions (user_id, started_at, last_event_at, client_id)
|
||||
VALUES ($1, $2, $2, $3)
|
||||
RETURNING *;
|
||||
|
||||
-- name: TouchPlaySessionLastEvent :exec
|
||||
UPDATE play_sessions
|
||||
SET last_event_at = $2,
|
||||
track_count = track_count + 1
|
||||
WHERE id = $1;
|
||||
|
||||
-- name: GetOpenPlayEventForUser :one
|
||||
-- Returns the most recent play_event for a user where ended_at IS NULL.
|
||||
-- Used by the auto-close-prior step in playevents.RecordPlayStarted.
|
||||
SELECT * FROM play_events
|
||||
WHERE user_id = $1 AND ended_at IS NULL
|
||||
ORDER BY started_at DESC
|
||||
LIMIT 1;
|
||||
|
||||
-- name: InsertPlayEvent :one
|
||||
INSERT INTO play_events (
|
||||
user_id, track_id, session_id, started_at, client_id
|
||||
) VALUES ($1, $2, $3, $4, $5)
|
||||
RETURNING *;
|
||||
|
||||
-- name: UpdatePlayEventEnded :one
|
||||
-- Closes a play_event by id with the given ended_at, duration, and skip flag.
|
||||
-- completion_ratio is computed from duration_played_ms and the track duration
|
||||
-- (looked up by the caller — sqlc doesn't do joins on UPDATE).
|
||||
UPDATE play_events
|
||||
SET ended_at = $2,
|
||||
duration_played_ms = $3,
|
||||
completion_ratio = $4,
|
||||
was_skipped = $5
|
||||
WHERE id = $1
|
||||
RETURNING *;
|
||||
|
||||
-- name: GetPlayEventByID :one
|
||||
SELECT * FROM play_events WHERE id = $1;
|
||||
|
||||
-- name: InsertSkipEvent :one
|
||||
INSERT INTO skip_events (user_id, track_id, session_id, skipped_at, position_ms)
|
||||
VALUES ($1, $2, $3, $4, $5)
|
||||
RETURNING *;
|
||||
Reference in New Issue
Block a user