From efc3523579f700f2e858b403e91e1bacd4010fc1 Mon Sep 17 00:00:00 2001 From: Robin Dittmar Date: Sat, 29 Aug 2026 14:32:17 +0200 Subject: [PATCH 01/12] fix: added user_id column to workouts and templates --- internal/database/migrations/000003_create_workouts.up.sql | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/internal/database/migrations/000003_create_workouts.up.sql b/internal/database/migrations/000003_create_workouts.up.sql index 29b708c..d80a716 100644 --- a/internal/database/migrations/000003_create_workouts.up.sql +++ b/internal/database/migrations/000003_create_workouts.up.sql @@ -32,6 +32,7 @@ CREATE TABLE templates ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name TEXT NOT NULL, notes TEXT, + user_id UUID REFERENCES users(id) ON DELETE CASCADE, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); @@ -48,6 +49,7 @@ CREATE TABLE template_exercises ( CREATE TABLE workouts ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name TEXT NOT NULL, + user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, template_id UUID REFERENCES templates(id) ON DELETE SET NULL, started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), ended_at TIMESTAMPTZ, @@ -82,12 +84,14 @@ INSERT INTO exercises (name, metric, load, tags, equipment) VALUES ('Pike push-up', 'reps', 'bodyweight', '{push,shoulders}', '{floor,rings,parallettes}'), ('Dip', 'reps', 'bodyweight', '{push,chest,triceps}', '{rings,parallel_bars}'), ('Handstand hold', 'seconds', 'bodyweight', '{push,shoulders,skill}', '{floor,rings,parallettes}'), - ('Handstand Push-up', 'reps', 'bodyweight', '{push,shoulders,skill}', '{floor,rings,parallettes}'), + ('Handstand Push-up', 'reps', 'bodyweight', '{push,shoulders,skill}', '{floor,rings,parallettes}'), ('Pull-up', 'reps', 'bodyweight', '{pull,back,biceps}', '{rings,pull_up_bar}'), ('Chin-up', 'reps', 'bodyweight', '{pull,back,biceps}', '{rings,pull_up_bar}'), ('Inverted row', 'reps', 'bodyweight', '{pull,back}', '{rings,parallel_bars,low_bar}'), + ('Inverted deadlift', 'reps', 'bodyweight', '{pull,back}', '{rings,parallel_bars,low_bar,pull_up_bar}'), ('Muscle-up', 'reps', 'bodyweight', '{pull,push,skill}', '{rings,pull_up_bar}'), ('Dead hang', 'seconds', 'bodyweight', '{pull,grip}', '{rings,pull_up_bar}'), + ('One arm dead hang', 'seconds', 'bodyweight', '{pull,grip}', '{rings,pull_up_bar}'), ('Front lever hold', 'seconds', 'bodyweight', '{pull,core,skill}', '{rings,pull_up_bar,low_bar}'), ('Pistol squat', 'reps', 'bodyweight', '{legs}', '{floor}'), ('Bulgarian split squat','reps', 'bodyweight', '{legs}', '{floor}'), -- 2.54.0 From 667811a88a4b5b4395912b6c6f8d039fb4939c2d Mon Sep 17 00:00:00 2001 From: Robin Dittmar Date: Sat, 29 Aug 2026 14:39:09 +0200 Subject: [PATCH 02/12] fix: added modified_at to workout tables --- internal/database/migrations/000003_create_workouts.up.sql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/internal/database/migrations/000003_create_workouts.up.sql b/internal/database/migrations/000003_create_workouts.up.sql index d80a716..13c1489 100644 --- a/internal/database/migrations/000003_create_workouts.up.sql +++ b/internal/database/migrations/000003_create_workouts.up.sql @@ -18,6 +18,7 @@ CREATE TABLE exercises ( CHECK (load IN ('bodyweight', 'absolute')), tags TEXT[] NOT NULL DEFAULT '{}', -- push/pull/legs/core/skill/shoulders/... notes TEXT, + progresses_from_id UUID REFERENCES exercises(id) ON DELETE SET NULL, hidden BOOLEAN NOT NULL DEFAULT FALSE, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW() @@ -34,6 +35,7 @@ CREATE TABLE templates ( notes TEXT, user_id UUID REFERENCES users(id) ON DELETE CASCADE, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE TABLE template_exercises ( @@ -56,6 +58,7 @@ CREATE TABLE workouts ( rpe smallint CHECK (rpe BETWEEN 1 AND 10), bodyweight_kg NUMERIC(5,2), notes TEXT + modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); CREATE INDEX workouts_time_idx ON workouts (started_at DESC); @@ -70,6 +73,7 @@ CREATE TABLE workout_sets ( seconds SMALLINT, weight_kg NUMERIC(5,2), note TEXT, + modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW() CONSTRAINT set_has_number CHECK (reps IS NOT NULL OR seconds IS NOT NULL) ); -- 2.54.0 From 9f79a5d73bbc87fbf7e23991f69cef2e6f889339 Mon Sep 17 00:00:00 2001 From: Robin Dittmar Date: Sat, 29 Aug 2026 14:40:49 +0200 Subject: [PATCH 03/12] fix: added type column to workout_sets (warm-up, working, drop) --- internal/database/migrations/000003_create_workouts.up.sql | 2 ++ 1 file changed, 2 insertions(+) diff --git a/internal/database/migrations/000003_create_workouts.up.sql b/internal/database/migrations/000003_create_workouts.up.sql index 13c1489..0c6c2df 100644 --- a/internal/database/migrations/000003_create_workouts.up.sql +++ b/internal/database/migrations/000003_create_workouts.up.sql @@ -72,6 +72,8 @@ CREATE TABLE workout_sets ( reps SMALLINT, seconds SMALLINT, weight_kg NUMERIC(5,2), + type TEXT NOT NULL DEFAULT 'working' + CHECK (metric IN ('warm-up', 'working', 'drop')), note TEXT, modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW() -- 2.54.0 From cf10fda69bd2206eefc45ab4cbbc2e18a35f3632 Mon Sep 17 00:00:00 2001 From: Robin Dittmar Date: Sat, 29 Aug 2026 14:48:45 +0200 Subject: [PATCH 04/12] fix: added bodyweight_logs as own table and target is now explicity defined as target_sets, target_reps and target_seconds --- .../migrations/000003_create_workouts.up.sql | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/internal/database/migrations/000003_create_workouts.up.sql b/internal/database/migrations/000003_create_workouts.up.sql index 0c6c2df..c4c1362 100644 --- a/internal/database/migrations/000003_create_workouts.up.sql +++ b/internal/database/migrations/000003_create_workouts.up.sql @@ -34,7 +34,7 @@ CREATE TABLE templates ( name TEXT NOT NULL, notes TEXT, user_id UUID REFERENCES users(id) ON DELETE CASCADE, - created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); @@ -42,9 +42,23 @@ CREATE TABLE template_exercises ( template_id UUID NOT NULL REFERENCES templates(id) ON DELETE CASCADE, exercise_id UUID NOT NULL REFERENCES exercises(id) ON DELETE CASCADE, position SMALLINT NOT NULL, - target TEXT, + target_sets SMALLINT NOT NULL, + target_reps SMALLINT, + target_seconds SMALLINT, + notes TEXT, PRIMARY KEY (template_id, exercise_id) + + CONSTRAINT target_has_number CHECK (target_reps IS NOT NULL OR target_seconds IS NOT NULL) +); + + +CREATE TABLE bodyweight_logs ( + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), + user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, + bodyweight_kg NUMERIC(5,2) NOT NULL, + logged_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); @@ -56,7 +70,6 @@ CREATE TABLE workouts ( 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 modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); -- 2.54.0 From 78bc7341fca642217449728ca3d7157a558554fb Mon Sep 17 00:00:00 2001 From: Robin Dittmar Date: Sat, 29 Aug 2026 14:53:05 +0200 Subject: [PATCH 05/12] fix: spelling in index name --- internal/database/migrations/000003_create_workouts.up.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/database/migrations/000003_create_workouts.up.sql b/internal/database/migrations/000003_create_workouts.up.sql index c4c1362..ec6958c 100644 --- a/internal/database/migrations/000003_create_workouts.up.sql +++ b/internal/database/migrations/000003_create_workouts.up.sql @@ -94,7 +94,7 @@ CREATE TABLE workout_sets ( ); 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); +CREATE INDEX sets_exercise_idx ON workout_sets (exercise_id, logged_at DESC); INSERT INTO exercises (name, metric, load, tags, equipment) VALUES ('Push-up', 'reps', 'bodyweight', '{push,chest,triceps}', '{floor,rings,parallettes}'), -- 2.54.0 From ac2e66b7319d48ffbd736b3615b72341f4bdceb4 Mon Sep 17 00:00:00 2001 From: Robin Dittmar Date: Sat, 29 Aug 2026 15:04:32 +0200 Subject: [PATCH 06/12] fix: added missing commas in sql file --- internal/database/migrations/000003_create_workouts.up.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/database/migrations/000003_create_workouts.up.sql b/internal/database/migrations/000003_create_workouts.up.sql index ec6958c..0236d0f 100644 --- a/internal/database/migrations/000003_create_workouts.up.sql +++ b/internal/database/migrations/000003_create_workouts.up.sql @@ -47,7 +47,7 @@ CREATE TABLE template_exercises ( target_seconds SMALLINT, notes TEXT, - PRIMARY KEY (template_id, exercise_id) + PRIMARY KEY (template_id, exercise_id), CONSTRAINT target_has_number CHECK (target_reps IS NOT NULL OR target_seconds IS NOT NULL) ); @@ -70,7 +70,7 @@ CREATE TABLE workouts ( started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), ended_at TIMESTAMPTZ, rpe smallint CHECK (rpe BETWEEN 1 AND 10), - notes TEXT + notes TEXT, modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); @@ -88,7 +88,7 @@ CREATE TABLE workout_sets ( type TEXT NOT NULL DEFAULT 'working' CHECK (metric IN ('warm-up', 'working', 'drop')), note TEXT, - modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), CONSTRAINT set_has_number CHECK (reps IS NOT NULL OR seconds IS NOT NULL) ); -- 2.54.0 From d0de5b2982e2643431ededd9e5505830712b0130 Mon Sep 17 00:00:00 2001 From: Robin Dittmar Date: Sat, 29 Aug 2026 15:12:11 +0200 Subject: [PATCH 07/12] fix: column name in constraint --- internal/database/migrations/000003_create_workouts.up.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/database/migrations/000003_create_workouts.up.sql b/internal/database/migrations/000003_create_workouts.up.sql index 0236d0f..2520733 100644 --- a/internal/database/migrations/000003_create_workouts.up.sql +++ b/internal/database/migrations/000003_create_workouts.up.sql @@ -86,7 +86,7 @@ CREATE TABLE workout_sets ( seconds SMALLINT, weight_kg NUMERIC(5,2), type TEXT NOT NULL DEFAULT 'working' - CHECK (metric IN ('warm-up', 'working', 'drop')), + CHECK (type IN ('warm-up', 'working', 'drop')), note TEXT, modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), -- 2.54.0 From 7f98fedaa63cc71757a1746cb1dcbb699e0c6975 Mon Sep 17 00:00:00 2001 From: Robin Dittmar Date: Sat, 29 Aug 2026 15:13:28 +0200 Subject: [PATCH 08/12] fix: added optional user_id to exercises table --- internal/database/migrations/000003_create_workouts.up.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/database/migrations/000003_create_workouts.up.sql b/internal/database/migrations/000003_create_workouts.up.sql index 2520733..50347b7 100644 --- a/internal/database/migrations/000003_create_workouts.up.sql +++ b/internal/database/migrations/000003_create_workouts.up.sql @@ -1,6 +1,7 @@ CREATE TABLE exercises ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name TEXT NOT NULL, + user_id UUID REFERENCES users(id) ON DELETE CASCADE, equipment TEXT[] NOT NULL DEFAULT '{}' CHECK ( equipment <@ ARRAY [ -- 2.54.0 From 95da21a84f4e1faf4fab68ec2c8440eb3fa2a5fc Mon Sep 17 00:00:00 2001 From: Robin Dittmar Date: Sat, 29 Aug 2026 15:14:44 +0200 Subject: [PATCH 09/12] fix: added modified_at to template_exercises --- internal/database/migrations/000003_create_workouts.up.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/database/migrations/000003_create_workouts.up.sql b/internal/database/migrations/000003_create_workouts.up.sql index 50347b7..1e3b8fc 100644 --- a/internal/database/migrations/000003_create_workouts.up.sql +++ b/internal/database/migrations/000003_create_workouts.up.sql @@ -47,6 +47,7 @@ CREATE TABLE template_exercises ( target_reps SMALLINT, target_seconds SMALLINT, notes TEXT, + modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), PRIMARY KEY (template_id, exercise_id), -- 2.54.0 From 62b386325707f8445a34634ec029b8546db05fd9 Mon Sep 17 00:00:00 2001 From: Robin Dittmar Date: Sat, 29 Aug 2026 15:15:55 +0200 Subject: [PATCH 10/12] fix: added deleted_at to workouts and workout_sets --- internal/database/migrations/000003_create_workouts.up.sql | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/internal/database/migrations/000003_create_workouts.up.sql b/internal/database/migrations/000003_create_workouts.up.sql index 1e3b8fc..bf6871f 100644 --- a/internal/database/migrations/000003_create_workouts.up.sql +++ b/internal/database/migrations/000003_create_workouts.up.sql @@ -73,7 +73,8 @@ CREATE TABLE workouts ( ended_at TIMESTAMPTZ, rpe smallint CHECK (rpe BETWEEN 1 AND 10), notes TEXT, - modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW() + modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + deleted_at TIMESTAMPTZ ); CREATE INDEX workouts_time_idx ON workouts (started_at DESC); @@ -91,6 +92,7 @@ CREATE TABLE workout_sets ( CHECK (type IN ('warm-up', 'working', 'drop')), note TEXT, modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + deleted_at TIMESTAMPTZ, CONSTRAINT set_has_number CHECK (reps IS NOT NULL OR seconds IS NOT NULL) ); -- 2.54.0 From 06846c611dbe737bcf3ec30bf6c53d0618516ffd Mon Sep 17 00:00:00 2001 From: Robin Dittmar Date: Sat, 29 Aug 2026 15:21:17 +0200 Subject: [PATCH 11/12] fix: moved rpe to sets rather than workouts --- internal/database/migrations/000003_create_workouts.up.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/database/migrations/000003_create_workouts.up.sql b/internal/database/migrations/000003_create_workouts.up.sql index bf6871f..8b03d6f 100644 --- a/internal/database/migrations/000003_create_workouts.up.sql +++ b/internal/database/migrations/000003_create_workouts.up.sql @@ -71,7 +71,6 @@ CREATE TABLE workouts ( 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), notes TEXT, modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), deleted_at TIMESTAMPTZ @@ -88,6 +87,7 @@ CREATE TABLE workout_sets ( reps SMALLINT, seconds SMALLINT, weight_kg NUMERIC(5,2), + rpe SMALLINT CHECK (rpe BETWEEN 1 AND 10), type TEXT NOT NULL DEFAULT 'working' CHECK (type IN ('warm-up', 'working', 'drop')), note TEXT, -- 2.54.0 From ce73cb451a6d4a7479842df98296057bf4027b23 Mon Sep 17 00:00:00 2001 From: Robin Dittmar Date: Sat, 29 Aug 2026 15:27:04 +0200 Subject: [PATCH 12/12] feat: added group_no to template_exercises, to allow grouping exercises to supersets --- internal/database/migrations/000003_create_workouts.up.sql | 1 + 1 file changed, 1 insertion(+) diff --git a/internal/database/migrations/000003_create_workouts.up.sql b/internal/database/migrations/000003_create_workouts.up.sql index 8b03d6f..524b0e4 100644 --- a/internal/database/migrations/000003_create_workouts.up.sql +++ b/internal/database/migrations/000003_create_workouts.up.sql @@ -43,6 +43,7 @@ CREATE TABLE template_exercises ( template_id UUID NOT NULL REFERENCES templates(id) ON DELETE CASCADE, exercise_id UUID NOT NULL REFERENCES exercises(id) ON DELETE CASCADE, position SMALLINT NOT NULL, + group_no SMALLINT, target_sets SMALLINT NOT NULL, target_reps SMALLINT, target_seconds SMALLINT, -- 2.54.0