From a4a84bed68e49806b94f0b83e2a4d7ea02e2745f Mon Sep 17 00:00:00 2001 From: Robin Dittmar Date: Fri, 28 Aug 2026 11:00:30 +0200 Subject: [PATCH] feat: added workouts and workout_sets db tables --- .../000003_create_workouts.down.sql | 4 ++- .../migrations/000003_create_workouts.up.sql | 32 ++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/internal/database/migrations/000003_create_workouts.down.sql b/internal/database/migrations/000003_create_workouts.down.sql index 3624dc4..ff32d5a 100644 --- a/internal/database/migrations/000003_create_workouts.down.sql +++ b/internal/database/migrations/000003_create_workouts.down.sql @@ -1,3 +1,5 @@ +DROP TABLE IF EXISTS workout_sets; +DROP TABLE IF EXISTS workouts; DROP TABLE IF EXISTS template_exercises; DROP TABLE IF EXISTS templates; -DROP TABLE IF EXISTS exercises; \ No newline at end of file +DROP TABLE IF EXISTS exercises; diff --git a/internal/database/migrations/000003_create_workouts.up.sql b/internal/database/migrations/000003_create_workouts.up.sql index 632c838..dad6084 100644 --- a/internal/database/migrations/000003_create_workouts.up.sql +++ b/internal/database/migrations/000003_create_workouts.up.sql @@ -9,6 +9,7 @@ CREATE TABLE exercises ( 'pull_up_bar', 'dip_bars', 'parallettes', + 'resistance_band' ]::TEXT[]), metric TEXT NOT NULL DEFAULT 'reps' CHECK metric IN ('reps', 'seconds'), @@ -42,4 +43,33 @@ CREATE TABLE template_exercises ( PRIMARY KEY (template_id, exercise_id) ); --- todo: workouts, sets + +CREATE TABLE workouts ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + name TEXT NOT NULL, + template_id UUID REFERENCES templates(id) ON DELETE SET NULL, + started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + ended_at TIMESTAMPTZ, + rpe smallint CHECK (rpe BETWEEN 1 AND 10), + bodyweight_kg NUMERIC(5,2), + notes TEXT +); + +CREATE INDEX workouts_time_idx ON workouts (started_at DESC); + + +CREATE TABLE workout_sets ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + workout_id UUID NOT NULL REFERENCES workouts(id) ON DELETE CASCADE, + exercise_id UUID NOT NULL REFERENCES exercises(id) ON DELETE RESTRICT, + logged_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + reps SMALLINT, + seconds SMALLINT, + weight_kg NUMERIC(5,2), + note TEXT, + + CONSTRAINT set_has_number CHECK (reps IS NOT NULL OR seconds IS NOT NULL) +); + +CREATE INDEX sets_workout_idx ON workout_sets (workout_id, logged_at); +CREATE INDEX sets_exercise_ifx ON workout_sets (exercise_id, logged_at DESC);