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);