Files
Synculous-2/config/schema.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
);