51 lines
1.8 KiB
SQL
51 lines
1.8 KiB
SQL
-- 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);
|