""" Database schema definition for StarPunk Initial database schema (v1.0.0 baseline) DO NOT MODIFY - This represents the v1.0.0 schema state All schema changes after v1.0.0 must go in migration files """ INITIAL_SCHEMA_SQL = """ -- Notes metadata (content is in files) CREATE TABLE IF NOT EXISTS notes ( id INTEGER PRIMARY KEY AUTOINCREMENT, slug TEXT UNIQUE NOT NULL, file_path TEXT UNIQUE NOT NULL, published BOOLEAN DEFAULT 0, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, deleted_at TIMESTAMP, content_hash TEXT ); CREATE INDEX IF NOT EXISTS idx_notes_created_at ON notes(created_at DESC); CREATE INDEX IF NOT EXISTS idx_notes_published ON notes(published); CREATE INDEX IF NOT EXISTS idx_notes_slug ON notes(slug); CREATE INDEX IF NOT EXISTS idx_notes_deleted_at ON notes(deleted_at); -- Authentication sessions (IndieLogin) CREATE TABLE IF NOT EXISTS sessions ( id INTEGER PRIMARY KEY AUTOINCREMENT, session_token_hash TEXT UNIQUE NOT NULL, me TEXT NOT NULL, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, expires_at TIMESTAMP NOT NULL, last_used_at TIMESTAMP, user_agent TEXT, ip_address TEXT ); CREATE INDEX IF NOT EXISTS idx_sessions_token_hash ON sessions(session_token_hash); CREATE INDEX IF NOT EXISTS idx_sessions_expires ON sessions(expires_at); CREATE INDEX IF NOT EXISTS idx_sessions_me ON sessions(me); -- Micropub access tokens (secure storage with hashed tokens) CREATE TABLE IF NOT EXISTS tokens ( id INTEGER PRIMARY KEY AUTOINCREMENT, token_hash TEXT UNIQUE NOT NULL, me TEXT NOT NULL, client_id TEXT, scope TEXT DEFAULT 'create', created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, expires_at TIMESTAMP NOT NULL, last_used_at TIMESTAMP, revoked_at TIMESTAMP ); -- Authorization codes for IndieAuth token exchange CREATE TABLE IF NOT EXISTS authorization_codes ( id INTEGER PRIMARY KEY AUTOINCREMENT, code_hash TEXT UNIQUE NOT NULL, me TEXT NOT NULL, client_id TEXT NOT NULL, redirect_uri TEXT NOT NULL, scope TEXT, state TEXT, code_challenge TEXT, code_challenge_method TEXT, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, expires_at TIMESTAMP NOT NULL, used_at TIMESTAMP ); CREATE INDEX IF NOT EXISTS idx_auth_codes_hash ON authorization_codes(code_hash); CREATE INDEX IF NOT EXISTS idx_auth_codes_expires ON authorization_codes(expires_at); -- CSRF state tokens (for admin login flow) CREATE TABLE IF NOT EXISTS auth_state ( state TEXT PRIMARY KEY, created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, expires_at TIMESTAMP NOT NULL, redirect_uri TEXT ); CREATE INDEX IF NOT EXISTS idx_auth_state_expires ON auth_state(expires_at); """