-- Initial database schema -- Services table CREATE TABLE IF NOT EXISTS services ( id SERIAL PRIMARY KEY, name VARCHAR(255) NOT NULL, url VARCHAR(500) NOT NULL, logo_url VARCHAR(500), policy_url VARCHAR(500), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Policy versions table CREATE TABLE IF NOT EXISTS policy_versions ( id SERIAL PRIMARY KEY, service_id INTEGER REFERENCES services(id) ON DELETE CASCADE, content TEXT NOT NULL, content_hash VARCHAR(64) NOT NULL, fetched_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Analyses table CREATE TABLE IF NOT EXISTS analyses ( id SERIAL PRIMARY KEY, service_id INTEGER REFERENCES services(id) ON DELETE CASCADE, policy_version_id INTEGER REFERENCES policy_versions(id) ON DELETE CASCADE, overall_score VARCHAR(1) NOT NULL CHECK (overall_score IN ('A', 'B', 'C', 'D', 'E')), findings JSONB NOT NULL, raw_analysis TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Admin sessions table CREATE TABLE IF NOT EXISTS admin_sessions ( id SERIAL PRIMARY KEY, session_token VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, expires_at TIMESTAMP NOT NULL ); -- Indexes for performance CREATE INDEX IF NOT EXISTS idx_services_name ON services(name); CREATE INDEX IF NOT EXISTS idx_analyses_service_id ON analyses(service_id); CREATE INDEX IF NOT EXISTS idx_analyses_score ON analyses(overall_score); CREATE INDEX IF NOT EXISTS idx_policy_versions_service_id ON policy_versions(service_id); CREATE INDEX IF NOT EXISTS idx_admin_sessions_token ON admin_sessions(session_token); CREATE INDEX IF NOT EXISTS idx_admin_sessions_expires ON admin_sessions(expires_at);