Migration 0004 (users, sessions, config_changes, profile_versions, jobs, rating_events.user_id, runs.report_json, issues.issue_json), the issue snapshot writer and loader, the web module skeleton with layout and static assets, axum-login/tower-sessions over a sqlx session store, password-auth users with a CLI, the login throttle, the origin check, security headers, and the public issue pages, archive, Atom feed and robots.txt. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NHyYupFdBiR4VfoUM7NjSM
59 lines
2.0 KiB
SQL
59 lines
2.0 KiB
SQL
CREATE TABLE users (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
username TEXT NOT NULL UNIQUE COLLATE NOCASE,
|
|
password_hash TEXT NOT NULL,
|
|
role TEXT NOT NULL CHECK (role IN ('user', 'admin')),
|
|
disabled INTEGER NOT NULL DEFAULT 0,
|
|
created_at TEXT NOT NULL,
|
|
last_login_at TEXT
|
|
);
|
|
|
|
CREATE TABLE sessions (
|
|
id TEXT PRIMARY KEY,
|
|
data TEXT NOT NULL,
|
|
expiry INTEGER NOT NULL,
|
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
|
created_at TEXT NOT NULL,
|
|
updated_at TEXT NOT NULL
|
|
);
|
|
CREATE INDEX idx_sessions_user ON sessions(user_id);
|
|
CREATE INDEX idx_sessions_expiry ON sessions(expiry);
|
|
|
|
ALTER TABLE rating_events ADD COLUMN user_id INTEGER REFERENCES users(id) ON DELETE SET NULL;
|
|
|
|
CREATE TABLE config_changes (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
user_id INTEGER REFERENCES users(id) ON DELETE SET NULL,
|
|
key TEXT NOT NULL,
|
|
old_value TEXT,
|
|
new_value TEXT,
|
|
changed_at TEXT NOT NULL
|
|
);
|
|
CREATE INDEX idx_config_changes_at ON config_changes(changed_at);
|
|
|
|
CREATE TABLE profile_versions (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
content TEXT NOT NULL,
|
|
saved_by INTEGER REFERENCES users(id) ON DELETE SET NULL,
|
|
saved_at TEXT NOT NULL
|
|
);
|
|
|
|
CREATE TABLE jobs (
|
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
name TEXT NOT NULL,
|
|
unit TEXT NOT NULL,
|
|
requested_by INTEGER REFERENCES users(id) ON DELETE SET NULL,
|
|
requested_at TEXT NOT NULL,
|
|
started_at TEXT,
|
|
finished_at TEXT,
|
|
status TEXT NOT NULL CHECK (status IN ('requested', 'running', 'ok', 'failed')),
|
|
message TEXT,
|
|
run_id INTEGER REFERENCES runs(id) ON DELETE SET NULL
|
|
);
|
|
CREATE INDEX idx_jobs_requested_at ON jobs(requested_at);
|
|
|
|
ALTER TABLE runs ADD COLUMN report_json TEXT;
|
|
ALTER TABLE issues ADD COLUMN issue_json TEXT;
|
|
|
|
CREATE INDEX idx_candidate_runs_article_run ON candidate_runs(article_id, run_id DESC);
|