PRAGMA foreign_keys = ON; CREATE TABLE IF NOT EXISTS topics ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE, slug TEXT NOT NULL UNIQUE, description TEXT NOT NULL DEFAULT '', color TEXT NOT NULL DEFAULT '#1f6f8b', created_at TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS sources ( id INTEGER PRIMARY KEY AUTOINCREMENT, topic_id INTEGER REFERENCES topics(id), name TEXT NOT NULL, url TEXT NOT NULL, rss_url TEXT NOT NULL DEFAULT '', is_active INTEGER NOT NULL DEFAULT 1, note TEXT NOT NULL DEFAULT '', created_at TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS source_items ( id INTEGER PRIMARY KEY AUTOINCREMENT, source_id INTEGER REFERENCES sources(id), topic_id INTEGER REFERENCES topics(id), original_title TEXT NOT NULL, original_url TEXT NOT NULL UNIQUE, source_name TEXT NOT NULL, summary TEXT NOT NULL DEFAULT '', published_at TEXT, fetched_at TEXT NOT NULL, processed_at TEXT, is_processed INTEGER NOT NULL DEFAULT 0 ); CREATE TABLE IF NOT EXISTS articles ( id INTEGER PRIMARY KEY AUTOINCREMENT, source_item_id INTEGER REFERENCES source_items(id), topic_id INTEGER REFERENCES topics(id), title TEXT NOT NULL, slug TEXT NOT NULL UNIQUE, summary TEXT NOT NULL, body TEXT NOT NULL, parent_angle TEXT NOT NULL DEFAULT '', status TEXT NOT NULL DEFAULT 'draft', source_title TEXT NOT NULL DEFAULT '', source_url TEXT NOT NULL DEFAULT '', source_name TEXT NOT NULL DEFAULT '', reviewed_by INTEGER REFERENCES users(id), published_at TEXT, created_at TEXT NOT NULL, updated_at TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS social_posts ( id INTEGER PRIMARY KEY AUTOINCREMENT, article_id INTEGER NOT NULL REFERENCES articles(id) ON DELETE CASCADE, platform TEXT NOT NULL, content TEXT NOT NULL, updated_at TEXT NOT NULL, UNIQUE(article_id, platform) ); CREATE TABLE IF NOT EXISTS article_extensions ( id INTEGER PRIMARY KEY AUTOINCREMENT, article_id INTEGER NOT NULL REFERENCES articles(id) ON DELETE CASCADE, comic_title TEXT NOT NULL DEFAULT '', panel_1 TEXT NOT NULL DEFAULT '', panel_2 TEXT NOT NULL DEFAULT '', panel_3 TEXT NOT NULL DEFAULT '', panel_4 TEXT NOT NULL DEFAULT '', joke_title TEXT NOT NULL DEFAULT '', joke_body TEXT NOT NULL DEFAULT '', is_enabled INTEGER NOT NULL DEFAULT 1, updated_at TEXT NOT NULL, UNIQUE(article_id) ); CREATE TABLE IF NOT EXISTS ai_runs ( id INTEGER PRIMARY KEY AUTOINCREMENT, source_item_id INTEGER REFERENCES source_items(id), article_id INTEGER REFERENCES articles(id), action TEXT NOT NULL, input_summary TEXT NOT NULL DEFAULT '', output_summary TEXT NOT NULL DEFAULT '', model TEXT NOT NULL DEFAULT 'MVP local draft helper', status TEXT NOT NULL DEFAULT 'success', error TEXT NOT NULL DEFAULT '', created_at TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, email TEXT NOT NULL UNIQUE, role TEXT NOT NULL DEFAULT 'admin', created_at TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS audit_logs ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER REFERENCES users(id), article_id INTEGER REFERENCES articles(id), action TEXT NOT NULL, detail TEXT NOT NULL DEFAULT '', created_at TEXT NOT NULL ); CREATE TABLE IF NOT EXISTS settings ( key TEXT PRIMARY KEY, value TEXT NOT NULL );