51 lines
1.6 KiB
SQL
51 lines
1.6 KiB
SQL
-- +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;
|