46 lines
1.5 KiB
SQL
46 lines
1.5 KiB
SQL
CREATE TABLE IF NOT EXISTS users (
|
|
id INTEGER PRIMARY KEY,
|
|
email TEXT UNIQUE NOT NULL,
|
|
display_name TEXT NOT NULL,
|
|
password_hash TEXT NOT NULL,
|
|
role TEXT NOT NULL DEFAULT 'user' CHECK(role IN ('user','admin')),
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS songs (
|
|
id INTEGER PRIMARY KEY,
|
|
title TEXT NOT NULL,
|
|
artist TEXT NOT NULL,
|
|
album TEXT,
|
|
genre TEXT,
|
|
year INTEGER,
|
|
duration_seconds INTEGER,
|
|
audio_path TEXT NOT NULL,
|
|
cover_path TEXT,
|
|
is_public INTEGER NOT NULL DEFAULT 1,
|
|
uploaded_by INTEGER REFERENCES users(id),
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_songs_artist ON songs(artist);
|
|
CREATE INDEX IF NOT EXISTS idx_songs_public ON songs(is_public);
|
|
CREATE INDEX IF NOT EXISTS idx_songs_created ON songs(created_at DESC);
|
|
|
|
CREATE TABLE IF NOT EXISTS playlists (
|
|
id INTEGER PRIMARY KEY,
|
|
title TEXT NOT NULL,
|
|
description TEXT,
|
|
cover_path TEXT,
|
|
is_public INTEGER NOT NULL DEFAULT 1,
|
|
created_by INTEGER REFERENCES users(id),
|
|
created_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_playlists_public ON playlists(is_public);
|
|
|
|
CREATE TABLE IF NOT EXISTS playlist_songs (
|
|
playlist_id INTEGER NOT NULL REFERENCES playlists(id) ON DELETE CASCADE,
|
|
song_id INTEGER NOT NULL REFERENCES songs(id) ON DELETE CASCADE,
|
|
position INTEGER NOT NULL,
|
|
PRIMARY KEY (playlist_id, song_id)
|
|
);
|
|
CREATE INDEX IF NOT EXISTS idx_playlist_songs_order ON playlist_songs(playlist_id, position);
|