45 lines
2.0 KiB
SQL
45 lines
2.0 KiB
SQL
-- Migration 005: User Favorites and Listening History
|
|
-- Adds tables for track favorites/ratings and per-user listening history
|
|
|
|
-- User favorites table - tracks that users have liked/rated
|
|
CREATE TABLE IF NOT EXISTS user_favorites (
|
|
_id SERIAL PRIMARY KEY,
|
|
"user-id" INTEGER NOT NULL REFERENCES "USERS"(_id) ON DELETE CASCADE,
|
|
"track-id" INTEGER NOT NULL REFERENCES tracks(_id) ON DELETE CASCADE,
|
|
rating INTEGER DEFAULT 1 CHECK (rating >= 1 AND rating <= 5),
|
|
"created-date" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
UNIQUE("user-id", "track-id")
|
|
);
|
|
|
|
-- Create indexes for efficient queries
|
|
CREATE INDEX IF NOT EXISTS idx_user_favorites_user_id ON user_favorites("user-id");
|
|
CREATE INDEX IF NOT EXISTS idx_user_favorites_track_id ON user_favorites("track-id");
|
|
CREATE INDEX IF NOT EXISTS idx_user_favorites_rating ON user_favorites(rating);
|
|
|
|
-- User listening history - per-user track play history
|
|
CREATE TABLE IF NOT EXISTS listening_history (
|
|
_id SERIAL PRIMARY KEY,
|
|
"user-id" INTEGER NOT NULL REFERENCES "USERS"(_id) ON DELETE CASCADE,
|
|
"track-id" INTEGER NOT NULL REFERENCES tracks(_id) ON DELETE CASCADE,
|
|
"listened-at" TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
"listen-duration" INTEGER DEFAULT 0, -- seconds listened
|
|
"completed" BOOLEAN DEFAULT false -- did they listen to the whole track?
|
|
);
|
|
|
|
-- Create indexes for efficient queries
|
|
CREATE INDEX IF NOT EXISTS idx_listening_history_user_id ON listening_history("user-id");
|
|
CREATE INDEX IF NOT EXISTS idx_listening_history_track_id ON listening_history("track-id");
|
|
CREATE INDEX IF NOT EXISTS idx_listening_history_listened_at ON listening_history("listened-at");
|
|
|
|
-- Grant permissions
|
|
GRANT ALL PRIVILEGES ON user_favorites TO asteroid;
|
|
GRANT ALL PRIVILEGES ON listening_history TO asteroid;
|
|
GRANT ALL PRIVILEGES ON SEQUENCE user_favorites__id_seq TO asteroid;
|
|
GRANT ALL PRIVILEGES ON SEQUENCE listening_history__id_seq TO asteroid;
|
|
|
|
-- Verification
|
|
DO $$
|
|
BEGIN
|
|
RAISE NOTICE 'Migration 005: User favorites and listening history tables created successfully!';
|
|
END $$;
|