daemos 0.1.2

A local-only music player
Documentation
use color_eyre::Result;
use rusqlite::Connection;

use super::connection::Database;

const TRACKS_TABLE: &str = "
CREATE TABLE IF NOT EXISTS tracks (
    id TEXT PRIMARY KEY,
    path TEXT NOT NULL,
    name TEXT NOT NULL,
    hash TEXT,
    duration_secs REAL NOT NULL,
    valid BOOLEAN NOT NULL,

    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,

    UNIQUE(hash, path)
);
";

const PLAYLISTS_TABLE: &str = "
CREATE TABLE IF NOT EXISTS playlists (
    id TEXT PRIMARY KEY,
    name TEXT NOT NULL UNIQUE,

    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
";

const PLAYLIST_TRACKS_TABLE: &str = "
CREATE TABLE IF NOT EXISTS playlist_tracks (
    playlist_id TEXT NOT NULL,
    track_id TEXT NOT NULL,

    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,

    PRIMARY KEY (playlist_id, track_id),
    FOREIGN KEY (playlist_id) REFERENCES playlists(id) ON DELETE CASCADE,
    FOREIGN KEY (track_id) REFERENCES tracks(id) ON DELETE CASCADE
);
";

const TAGS_TABLE: &str = "
CREATE TABLE IF NOT EXISTS tags (
    id TEXT PRIMARY KEY,
    name TEXT NOT NULL UNIQUE,

    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
";

const TAG_TRACKS_TABLE: &str = "
CREATE TABLE IF NOT EXISTS track_tags (
    tag_id TEXT NOT NULL,
    track_id TEXT NOT NULL,

    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,

    PRIMARY KEY (tag_id, track_id),
    FOREIGN KEY (tag_id) REFERENCES tags(id) ON DELETE CASCADE,
    FOREIGN KEY (track_id) REFERENCES tracks(id) ON DELETE CASCADE
);
";

const TABLES: [&str; 5] = [
    TRACKS_TABLE,
    PLAYLISTS_TABLE,
    PLAYLIST_TRACKS_TABLE,
    TAGS_TABLE,
    TAG_TRACKS_TABLE,
];

impl Database {
    pub(crate) fn create_tables(conn: &Connection) -> Result<()> {
        for table in TABLES {
            conn.execute(table, ())?;
        }

        Ok(())
    }
}