-- name: CreateQueue :one INSERT INTO queue DEFAULT VALUES RETURNING *; -- name: GetQueue :one SELECT * FROM queue WHERE uuid = $1; -- name: EndQueue :exec UPDATE queue SET ended_at = NOW() WHERE uuid = $1 AND ended_at IS NULL; -- name: EndActiveQueues :exec UPDATE queue SET ended_at = NOW() WHERE ended_at IS NULL; -- name: SetQueueLastFetched :exec UPDATE queue SET last_fetched_song_uuid = $2 WHERE uuid = $1; -- name: SetQueueCurrentSong :exec UPDATE queue SET current_song = $2 WHERE uuid = $1; -- name: AddLastFetchedToQueue :exec -- Appends the queue's last fetched song and makes it the current song. -- Does nothing when no song has been fetched since the last call. WITH added AS ( INSERT INTO queue_song (queue_uuid, song_no, song_uuid, soundtrack_name, song_name) SELECT q.uuid, (SELECT COALESCE(MAX(qs.song_no), -1) + 1 FROM queue_song qs WHERE qs.queue_uuid = q.uuid), s.uuid, st.soundtrack_name, s.song_name FROM queue q JOIN song s ON s.uuid = q.last_fetched_song_uuid JOIN soundtrack st ON st.id = s.soundtrack_id WHERE q.uuid = $1 RETURNING queue_uuid, song_no ) UPDATE queue SET current_song = added.song_no, last_fetched_song_uuid = NULL FROM added WHERE queue.uuid = added.queue_uuid; -- name: ListQueueSongs :many -- The song columns are NULL when the song has been removed from the library since. SELECT qs.song_no, qs.song_uuid, qs.soundtrack_name, qs.song_name, s.path, s.times_played, s.soundtrack_uuid FROM queue_song qs LEFT JOIN song s ON s.uuid = qs.song_uuid WHERE qs.queue_uuid = $1 ORDER BY qs.song_no;