-- Migration 001: Initial Schema -- Creates the core tables for the weight tracker app -- Users table CREATE TABLE IF NOT EXISTS users ( id SERIAL PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, display_name VARCHAR(100), height_cm DECIMAL(5,1), age INTEGER, gender VARCHAR(20), goal_weight_kg DECIMAL(5,1), starting_weight_kg DECIMAL(5,1), created_at TIMESTAMP DEFAULT NOW() ); -- Check-ins table CREATE TABLE IF NOT EXISTS checkins ( id SERIAL PRIMARY KEY, user_id INTEGER REFERENCES users(id) ON DELETE CASCADE, weight_kg DECIMAL(5,1) NOT NULL, bmi DECIMAL(4,1), notes TEXT, checked_in_at TIMESTAMP DEFAULT NOW() ); -- Milestones table CREATE TABLE IF NOT EXISTS milestones ( id SERIAL PRIMARY KEY, user_id INTEGER REFERENCES users(id) ON DELETE CASCADE, milestone_key VARCHAR(50) NOT NULL, achieved_at TIMESTAMP DEFAULT NOW(), UNIQUE(user_id, milestone_key) ); -- Challenges table CREATE TABLE IF NOT EXISTS challenges ( id SERIAL PRIMARY KEY, title VARCHAR(200) NOT NULL, description TEXT, target_type VARCHAR(30) NOT NULL, target_value DECIMAL(8,2) NOT NULL, start_date DATE NOT NULL, end_date DATE NOT NULL, created_at TIMESTAMP DEFAULT NOW() ); -- Challenge participants CREATE TABLE IF NOT EXISTS challenge_participants ( id SERIAL PRIMARY KEY, challenge_id INTEGER REFERENCES challenges(id) ON DELETE CASCADE, user_id INTEGER REFERENCES users(id) ON DELETE CASCADE, completed BOOLEAN DEFAULT FALSE, completed_at TIMESTAMP, UNIQUE(challenge_id, user_id) ); -- Indexes CREATE INDEX IF NOT EXISTS idx_checkins_user_date ON checkins(user_id, checked_in_at DESC); CREATE INDEX IF NOT EXISTS idx_milestones_user ON milestones(user_id); -- Migrations tracking table CREATE TABLE IF NOT EXISTS schema_migrations ( version INTEGER PRIMARY KEY, applied_at TIMESTAMP DEFAULT NOW() );