-- name: LikeTrack :many -- A like is on the song (M498 #5438): every copy of it sharing the track's -- song_key is liked. Returns the tracks newly liked, for the sync log; empty -- when the song was already liked. INSERT INTO general_likes (user_id, track_id) SELECT sqlc.arg(user_id)::uuid, t.id FROM tracks t WHERE t.song_key = (SELECT s.song_key FROM tracks s WHERE s.id = sqlc.arg(track_id)::uuid) ON CONFLICT (user_id, track_id) DO NOTHING RETURNING track_id; -- name: UnlikeTrack :many -- Unlikes the song: every copy sharing the track's song_key. Returns the -- tracks unliked, for the sync log. DELETE FROM general_likes WHERE user_id = sqlc.arg(user_id)::uuid AND (track_id = sqlc.arg(track_id)::uuid OR track_id IN (SELECT t.id FROM tracks t WHERE t.song_key = (SELECT s.song_key FROM tracks s WHERE s.id = sqlc.arg(track_id)::uuid))) RETURNING track_id; -- name: ListLikedTrackRows :many -- One row per liked song: of its copies, the one present on disk, then the -- one liked first. SELECT t.* FROM tracks t JOIN (SELECT DISTINCT ON (lt.song_key) l.track_id, l.liked_at FROM general_likes l JOIN tracks lt ON lt.id = l.track_id WHERE l.user_id = $1 ORDER BY lt.song_key, (lt.missing_since IS NOT NULL), l.liked_at, lt.id) l ON l.track_id = t.id ORDER BY l.liked_at DESC, t.id LIMIT $2 OFFSET $3; -- name: CountLikedTracks :one -- Liked songs, each counted once however many releases hold it. SELECT count(DISTINCT t.song_key) FROM general_likes l JOIN tracks t ON t.id = l.track_id WHERE l.user_id = $1; -- name: ListLikedTrackIDs :many SELECT track_id FROM general_likes WHERE user_id = $1 ORDER BY liked_at DESC; -- name: LikeAlbum :exec INSERT INTO general_likes_albums (user_id, album_id) VALUES ($1, $2) ON CONFLICT (user_id, album_id) DO NOTHING; -- name: UnlikeAlbum :exec DELETE FROM general_likes_albums WHERE user_id = $1 AND album_id = $2; -- name: ListLikedAlbumRows :many SELECT a.* FROM albums a JOIN general_likes_albums l ON l.album_id = a.id WHERE l.user_id = $1 ORDER BY l.liked_at DESC LIMIT $2 OFFSET $3; -- name: CountLikedAlbums :one SELECT count(*) FROM general_likes_albums WHERE user_id = $1; -- name: ListLikedAlbumIDs :many SELECT album_id FROM general_likes_albums WHERE user_id = $1 ORDER BY liked_at DESC; -- name: LikeArtist :exec INSERT INTO general_likes_artists (user_id, artist_id) VALUES ($1, $2) ON CONFLICT (user_id, artist_id) DO NOTHING; -- name: UnlikeArtist :exec DELETE FROM general_likes_artists WHERE user_id = $1 AND artist_id = $2; -- name: ListLikedArtistRows :many SELECT a.* FROM artists a JOIN general_likes_artists l ON l.artist_id = a.id WHERE l.user_id = $1 ORDER BY l.liked_at DESC LIMIT $2 OFFSET $3; -- name: CountLikedArtists :one SELECT count(*) FROM general_likes_artists WHERE user_id = $1; -- name: ListLikedArtistIDs :many SELECT artist_id FROM general_likes_artists WHERE user_id = $1 ORDER BY liked_at DESC;