Spaces:
Sleeping
Sleeping
| """SQLite layer for DermaConnect. One file, no ORM, easy to read and reset.""" | |
| from __future__ import annotations | |
| import os | |
| import sqlite3 | |
| from datetime import datetime, timezone | |
| DB_PATH = os.path.join(os.path.dirname(__file__), "..", "data", "derma.db") | |
| def _now() -> str: | |
| return datetime.now(timezone.utc).isoformat() | |
| def get_conn() -> sqlite3.Connection: | |
| conn = sqlite3.connect(DB_PATH) | |
| conn.row_factory = sqlite3.Row | |
| conn.execute("PRAGMA foreign_keys = ON") | |
| return conn | |
| SCHEMA = """ | |
| CREATE TABLE IF NOT EXISTS users ( | |
| id INTEGER PRIMARY KEY AUTOINCREMENT, | |
| role TEXT NOT NULL CHECK (role IN ('patient', 'dermatologist')), | |
| name TEXT NOT NULL, | |
| email TEXT NOT NULL UNIQUE, | |
| created_at TEXT NOT NULL | |
| ); | |
| CREATE TABLE IF NOT EXISTS care_links ( | |
| id INTEGER PRIMARY KEY AUTOINCREMENT, | |
| patient_id INTEGER NOT NULL REFERENCES users(id), | |
| dermatologist_id INTEGER NOT NULL REFERENCES users(id), | |
| body_site TEXT NOT NULL DEFAULT 'general', | |
| cadence_days INTEGER NOT NULL DEFAULT 7, | |
| next_due TEXT, | |
| created_at TEXT NOT NULL, | |
| UNIQUE (patient_id, dermatologist_id, body_site) | |
| ); | |
| CREATE TABLE IF NOT EXISTS readings ( | |
| id INTEGER PRIMARY KEY AUTOINCREMENT, | |
| care_link_id INTEGER NOT NULL REFERENCES care_links(id), | |
| image_path TEXT NOT NULL, | |
| score REAL NOT NULL, | |
| category TEXT NOT NULL, | |
| confidence REAL NOT NULL, | |
| signals TEXT, | |
| model TEXT NOT NULL, | |
| created_at TEXT NOT NULL | |
| ); | |
| """ | |
| def init_db() -> None: | |
| os.makedirs(os.path.dirname(DB_PATH), exist_ok=True) | |
| conn = get_conn() | |
| try: | |
| conn.executescript(SCHEMA) | |
| conn.commit() | |
| finally: | |
| conn.close() | |
| def create_user(role: str, name: str, email: str) -> int: | |
| conn = get_conn() | |
| try: | |
| cur = conn.execute( | |
| "INSERT INTO users (role, name, email, created_at) VALUES (?, ?, ?, ?)", | |
| (role, name, email, _now()), | |
| ) | |
| conn.commit() | |
| return cur.lastrowid | |
| finally: | |
| conn.close() | |