import sqlite3
import os
from datetime import datetime
DB_PATH = os.path.join(os.path.dirname(__file__), 'had_digital.db')
def get_connection():
"""Establish and return a connection to the SQLite database."""
conn = sqlite3.connect(DB_PATH)
conn.row_factory = sqlite3.Row
return conn
def init_db():
"""Initialize the database schema for the HAD Digital MVP."""
conn = get_connection()
cursor = conn.cursor()
# Enable foreign keys
cursor.execute("PRAGMA foreign_keys = ON;")
# Core Tables
cursor.executescript("""
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT UNIQUE NOT NULL,
password_hash TEXT NOT NULL,
role TEXT NOT NULL, -- 'oncologist', 'nurse', 'patient', 'admin'
name TEXT NOT NULL
);
CREATE TABLE IF NOT EXISTS patients (
id INTEGER PRIMARY KEY AUTOINCREMENT,
mrn TEXT UNIQUE NOT NULL,
name TEXT NOT NULL,
dob DATE,
status TEXT DEFAULT 'active'
);
CREATE TABLE IF NOT EXISTS toxicity_reports (
id INTEGER PRIMARY KEY AUTOINCREMENT,
patient_id INTEGER,
submitted_by INTEGER,
report_data TEXT NOT NULL, -- JSON string of symptoms
computed_grade INTEGER,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (patient_id) REFERENCES patients(id),
FOREIGN KEY (submitted_by) REFERENCES users(id)
);
CREATE TABLE IF NOT EXISTS alerts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
report_id INTEGER,
tier TEXT NOT NULL, -- 'Routine', 'Urgent', 'Emergency'
status TEXT DEFAULT 'Unacknowledged',
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (report_id) REFERENCES toxicity_reports(id)
);
CREATE TABLE IF NOT EXISTS timeline_events (
id INTEGER PRIMARY KEY AUTOINCREMENT,
patient_id INTEGER,
event_type TEXT NOT NULL, -- 'Report', 'Alert', 'Observation', 'Message'
event_data TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (patient_id) REFERENCES patients(id)
);
CREATE TABLE IF NOT EXISTS audit_log (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
action TEXT NOT NULL,
entity_type TEXT NOT NULL,
entity_id INTEGER,
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
""")
conn.commit()
conn.close()
print(f"Database initialized successfully at {DB_PATH}")
if __name__ == '__main__':
init_db()