-- +goose Up CREATE TABLE IF NOT EXISTS user ( id TEXT PRIMARY KEY, username TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS session ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL REFERENCES user(id) ON DELETE CASCADE, expires_at DATETIME NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS account ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL REFERENCES user(id) ON DELETE CASCADE, provider TEXT NOT NULL, provider_account_id TEXT NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, UNIQUE(provider, provider_account_id) ); CREATE TABLE IF NOT EXISTS anime ( id INTEGER PRIMARY KEY, -- Jikan ID title TEXT NOT NULL, image_url TEXT NOT NULL, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS watch_list_entry ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL REFERENCES user(id) ON DELETE CASCADE, anime_id INTEGER NOT NULL REFERENCES anime(id) ON DELETE CASCADE, status TEXT NOT NULL CHECK(status IN ('completed', 'dropped', 'plan_to_watch')), created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, current_episode INTEGER DEFAULT 0, last_episode_at DATETIME, current_time_seconds REAL NOT NULL DEFAULT 0, UNIQUE(user_id, anime_id) ); -- +goose Down DROP TABLE IF EXISTS watch_list_entry; DROP TABLE IF EXISTS anime; DROP TABLE IF EXISTS account; DROP TABLE IF EXISTS session; DROP TABLE IF EXISTS user;