-- Migration 004: Add custom workout support -- Allows users to create personalized workout plans based on program days -- Custom workouts created by users CREATE TABLE IF NOT EXISTS custom_workouts ( id SERIAL PRIMARY KEY, user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, name VARCHAR(255) NOT NULL, description TEXT, source_program_day_id INTEGER REFERENCES program_days(id) ON DELETE SET NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Exercises within a custom workout CREATE TABLE IF NOT EXISTS custom_workout_exercises ( id SERIAL PRIMARY KEY, custom_workout_id INTEGER NOT NULL REFERENCES custom_workouts(id) ON DELETE CASCADE, exercise_id INTEGER NOT NULL REFERENCES exercises(id) ON DELETE CASCADE, sets INTEGER NOT NULL DEFAULT 3, reps_min INTEGER NOT NULL DEFAULT 8, reps_max INTEGER NOT NULL DEFAULT 12, rpe_target DECIMAL(3,1), replaced_exercise_id INTEGER REFERENCES exercises(id) ON DELETE SET NULL, order_index INTEGER NOT NULL DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Extend workout_logs to support custom workouts ALTER TABLE workout_logs ADD COLUMN IF NOT EXISTS source_type VARCHAR(20) DEFAULT 'program' CHECK (source_type IN ('program', 'custom')), ADD COLUMN IF NOT EXISTS custom_workout_id INTEGER REFERENCES custom_workouts(id) ON DELETE SET NULL; -- Indexes CREATE INDEX IF NOT EXISTS idx_custom_workouts_user ON custom_workouts(user_id); CREATE INDEX IF NOT EXISTS idx_custom_workout_exercises_workout ON custom_workout_exercises(custom_workout_id); CREATE INDEX IF NOT EXISTS idx_workout_logs_custom_workout ON workout_logs(custom_workout_id);