202 lines
6.6 KiB
SQL
202 lines
6.6 KiB
SQL
-- Users table (minimal)
|
|
CREATE TABLE IF NOT EXISTS users (
|
|
id UUID PRIMARY KEY,
|
|
username VARCHAR(255) UNIQUE NOT NULL,
|
|
password_hashed BYTEA NOT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Notifications table
|
|
CREATE TABLE IF NOT EXISTS notifications (
|
|
id UUID PRIMARY KEY,
|
|
user_uuid UUID REFERENCES users(id) ON DELETE CASCADE UNIQUE,
|
|
discord_webhook VARCHAR(500),
|
|
discord_enabled BOOLEAN DEFAULT FALSE,
|
|
ntfy_topic VARCHAR(255),
|
|
ntfy_enabled BOOLEAN DEFAULT FALSE,
|
|
web_push_enabled BOOLEAN DEFAULT FALSE,
|
|
last_message_sent TIMESTAMP,
|
|
current_notification_status VARCHAR(50) DEFAULT 'inactive',
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- Push subscriptions for web push notifications
|
|
CREATE TABLE IF NOT EXISTS push_subscriptions (
|
|
id UUID PRIMARY KEY,
|
|
user_uuid UUID REFERENCES users(id) ON DELETE CASCADE,
|
|
endpoint TEXT NOT NULL,
|
|
p256dh TEXT NOT NULL,
|
|
auth TEXT NOT NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- ── Routines ────────────────────────────────────────────────
|
|
|
|
CREATE TABLE IF NOT EXISTS routines (
|
|
id UUID PRIMARY KEY,
|
|
user_uuid UUID REFERENCES users(id) ON DELETE CASCADE,
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
icon VARCHAR(100),
|
|
location VARCHAR(255),
|
|
environment_prompts JSON DEFAULT '[]',
|
|
habit_stack_after VARCHAR(255),
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS routine_steps (
|
|
id UUID PRIMARY KEY,
|
|
routine_id UUID REFERENCES routines(id) ON DELETE CASCADE,
|
|
name VARCHAR(255) NOT NULL,
|
|
duration_minutes INTEGER,
|
|
position INTEGER NOT NULL,
|
|
instructions TEXT,
|
|
step_type VARCHAR(50) DEFAULT 'generic',
|
|
media_url TEXT
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS routine_sessions (
|
|
id UUID PRIMARY KEY,
|
|
routine_id UUID REFERENCES routines(id) ON DELETE CASCADE,
|
|
user_uuid UUID REFERENCES users(id) ON DELETE CASCADE,
|
|
status VARCHAR(20) DEFAULT 'active',
|
|
current_step_index INTEGER DEFAULT 0,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
paused_at TIMESTAMP,
|
|
completed_at TIMESTAMP,
|
|
abort_reason TEXT,
|
|
actual_duration_minutes INTEGER
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS routine_schedules (
|
|
id UUID PRIMARY KEY,
|
|
routine_id UUID REFERENCES routines(id) ON DELETE CASCADE,
|
|
days JSON DEFAULT '[]',
|
|
time VARCHAR(5),
|
|
remind BOOLEAN DEFAULT FALSE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS routine_session_notes (
|
|
id UUID PRIMARY KEY,
|
|
session_id UUID REFERENCES routine_sessions(id) ON DELETE CASCADE,
|
|
step_index INTEGER,
|
|
note TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS routine_templates (
|
|
id UUID PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL,
|
|
description TEXT,
|
|
icon VARCHAR(100),
|
|
created_by_admin BOOLEAN DEFAULT FALSE
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS routine_template_steps (
|
|
id UUID PRIMARY KEY,
|
|
template_id UUID REFERENCES routine_templates(id) ON DELETE CASCADE,
|
|
name VARCHAR(255) NOT NULL,
|
|
instructions TEXT,
|
|
step_type VARCHAR(50) DEFAULT 'generic',
|
|
duration_minutes INTEGER,
|
|
media_url TEXT,
|
|
position INTEGER NOT NULL
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS routine_tags (
|
|
id UUID PRIMARY KEY,
|
|
name VARCHAR(255) NOT NULL,
|
|
color VARCHAR(20) DEFAULT '#888888'
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS routine_routine_tags (
|
|
routine_id UUID REFERENCES routines(id) ON DELETE CASCADE,
|
|
tag_id UUID REFERENCES routine_tags(id) ON DELETE CASCADE,
|
|
PRIMARY KEY (routine_id, tag_id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS routine_streaks (
|
|
id UUID PRIMARY KEY,
|
|
user_uuid UUID REFERENCES users(id) ON DELETE CASCADE,
|
|
routine_id UUID REFERENCES routines(id) ON DELETE CASCADE,
|
|
current_streak INTEGER DEFAULT 0,
|
|
longest_streak INTEGER DEFAULT 0,
|
|
last_completed_date DATE
|
|
);
|
|
|
|
-- ── Rewards ───────────────────────────────────────────────
|
|
|
|
CREATE TABLE IF NOT EXISTS reward_pool (
|
|
id UUID PRIMARY KEY,
|
|
category VARCHAR(50) NOT NULL,
|
|
content TEXT NOT NULL,
|
|
emoji VARCHAR(10),
|
|
rarity VARCHAR(20) DEFAULT 'common'
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS user_rewards (
|
|
id UUID PRIMARY KEY,
|
|
user_uuid UUID REFERENCES users(id) ON DELETE CASCADE,
|
|
reward_id UUID REFERENCES reward_pool(id) ON DELETE CASCADE,
|
|
earned_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
context VARCHAR(50)
|
|
);
|
|
|
|
-- ── User Preferences ──────────────────────────────────────
|
|
|
|
CREATE TABLE IF NOT EXISTS user_preferences (
|
|
id UUID PRIMARY KEY,
|
|
user_uuid UUID REFERENCES users(id) ON DELETE CASCADE UNIQUE,
|
|
sound_enabled BOOLEAN DEFAULT FALSE,
|
|
haptic_enabled BOOLEAN DEFAULT TRUE,
|
|
show_launch_screen BOOLEAN DEFAULT TRUE,
|
|
celebration_style VARCHAR(50) DEFAULT 'standard',
|
|
timezone_offset INTEGER DEFAULT 0,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- ── Step Results (per-step tracking within sessions) ───────
|
|
|
|
CREATE TABLE IF NOT EXISTS routine_step_results (
|
|
id UUID PRIMARY KEY,
|
|
session_id UUID REFERENCES routine_sessions(id) ON DELETE CASCADE,
|
|
step_id UUID REFERENCES routine_steps(id) ON DELETE CASCADE,
|
|
step_index INTEGER NOT NULL,
|
|
result VARCHAR(20) NOT NULL,
|
|
duration_seconds INTEGER,
|
|
completed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
-- ── Medications ─────────────────────────────────────────────
|
|
|
|
CREATE TABLE IF NOT EXISTS medications (
|
|
id UUID PRIMARY KEY,
|
|
user_uuid UUID REFERENCES users(id) ON DELETE CASCADE,
|
|
name VARCHAR(255) NOT NULL,
|
|
dosage VARCHAR(100) NOT NULL,
|
|
unit VARCHAR(50) NOT NULL,
|
|
frequency VARCHAR(50) NOT NULL,
|
|
times JSON DEFAULT '[]',
|
|
days_of_week JSON DEFAULT '[]',
|
|
interval_days INTEGER,
|
|
start_date DATE,
|
|
next_dose_date DATE,
|
|
notes TEXT,
|
|
active BOOLEAN DEFAULT TRUE,
|
|
quantity_remaining INTEGER,
|
|
refill_date DATE,
|
|
pharmacy_notes TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS med_logs (
|
|
id UUID PRIMARY KEY,
|
|
medication_id UUID REFERENCES medications(id) ON DELETE CASCADE,
|
|
user_uuid UUID REFERENCES users(id) ON DELETE CASCADE,
|
|
action VARCHAR(20) NOT NULL,
|
|
scheduled_time VARCHAR(5),
|
|
notes TEXT,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
);
|