File size: 2,025 Bytes
a8c0492
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
-- AnemiaLens — Supabase Schema
-- Run this in Supabase SQL Editor to create all tables

CREATE TABLE IF NOT EXISTS users (
    id SERIAL PRIMARY KEY,
    uid VARCHAR(36) UNIQUE NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    hashed_password TEXT NOT NULL,
    full_name VARCHAR(255),
    role VARCHAR(32) NOT NULL DEFAULT 'user',
    is_active BOOLEAN NOT NULL DEFAULT TRUE,
    scan_count INTEGER NOT NULL DEFAULT 0,
    subscription_tier VARCHAR(32) NOT NULL DEFAULT 'free',
    stripe_customer_id VARCHAR(128) UNIQUE,
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    last_login_at TIMESTAMPTZ
);

CREATE INDEX IF NOT EXISTS ix_users_uid ON users(uid);
CREATE INDEX IF NOT EXISTS ix_users_email ON users(email);
CREATE INDEX IF NOT EXISTS ix_users_stripe_customer_id ON users(stripe_customer_id);

CREATE TABLE IF NOT EXISTS screenings (
    id SERIAL PRIMARY KEY,
    uid VARCHAR(36) UNIQUE NOT NULL,
    user_id INTEGER,
    request_id VARCHAR(16) NOT NULL,
    triage_band VARCHAR(32) NOT NULL,
    triage_score FLOAT NOT NULL,
    triage_label VARCHAR(64) NOT NULL,
    anemia_risk FLOAT,
    predicted_hemoglobin FLOAT,
    confidence FLOAT,
    uncertainty FLOAT,
    screening_label VARCHAR(32),
    model_source VARCHAR(64),
    quality_passed BOOLEAN NOT NULL DEFAULT TRUE,
    blocked BOOLEAN NOT NULL DEFAULT FALSE,
    processing_path VARCHAR(32) NOT NULL DEFAULT 'roi_crop',
    guidance_source VARCHAR(16) NOT NULL DEFAULT 'fallback',
    symptoms_json TEXT,
    full_response_json TEXT,
    share_text TEXT,
    urgency_label VARCHAR(128),
    headline VARCHAR(255),
    processing_time_ms FLOAT NOT NULL DEFAULT 0.0,
    language VARCHAR(16),
    region VARCHAR(64),
    created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE INDEX IF NOT EXISTS ix_screenings_uid ON screenings(uid);
CREATE INDEX IF NOT EXISTS ix_screenings_user_id ON screenings(user_id);
CREATE INDEX IF NOT EXISTS ix_screenings_created_at ON screenings(created_at);