Improvements to workouts sql #27

Merged
robin merged 1 commits from dev into main 2026-08-29 16:09:07 +02:00
@@ -1,7 +1,7 @@
CREATE TABLE exercises ( CREATE TABLE exercises (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(), id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT NOT NULL, name TEXT NOT NULL,
user_id UUID REFERENCES users(id) ON DELETE CASCADE, user_id UUID REFERENCES users(id) ON DELETE RESTRICT,
equipment TEXT[] NOT NULL DEFAULT '{}' equipment TEXT[] NOT NULL DEFAULT '{}'
CHECK ( CHECK (
equipment <@ ARRAY [ equipment <@ ARRAY [
@@ -25,7 +25,8 @@ CREATE TABLE exercises (
modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW() modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
); );
CREATE UNIQUE INDEX exercises_name_key ON exercises (lower(name)); CREATE UNIQUE INDEX exercises_name_shared_key ON exercises (lower(name)) WHERE user_id IS NULL;
CREATE UNIQUE INDEX exercises_name_personal_key ON exercises (user_id, lower(name)) WHERE user_id IS NOT NULL;
CREATE INDEX exercises_equipment_idx ON exercises USING gin (equipment); CREATE INDEX exercises_equipment_idx ON exercises USING gin (equipment);
CREATE INDEX exercises_tags_idx ON exercises USING gin (tags); CREATE INDEX exercises_tags_idx ON exercises USING gin (tags);
@@ -47,19 +48,23 @@ CREATE TABLE template_exercises (
target_sets SMALLINT NOT NULL, target_sets SMALLINT NOT NULL,
target_reps SMALLINT, target_reps SMALLINT,
target_seconds SMALLINT, target_seconds SMALLINT,
target_to_failure BOOLEAN,
rest_seconds SMALLINT,
notes TEXT, notes TEXT,
modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
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) CONSTRAINT has_target CHECK (target_reps IS NOT NULL OR target_seconds IS NOT NULL OR target_to_failure IS TRUE)
); );
CREATE TABLE bodyweight_logs ( CREATE TABLE bodyweight_logs (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(), id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE, user_id UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
bodyweight_kg NUMERIC(5,2) NOT NULL, bodyweight NUMERIC(5,2) NOT NULL,
unit TEXT NOT NULL DEFAULT 'kg'
CHECK (unit in ('kg', 'lbs')),
logged_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), logged_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW() modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
); );
@@ -72,6 +77,7 @@ CREATE TABLE workouts (
template_id UUID REFERENCES templates(id) ON DELETE SET NULL, template_id UUID REFERENCES templates(id) ON DELETE SET NULL,
started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), started_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
ended_at TIMESTAMPTZ, ended_at TIMESTAMPTZ,
rpe SMALLINT CHECK (rpe BETWEEN 1 AND 10),
notes TEXT, notes TEXT,
modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), modified_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
deleted_at TIMESTAMPTZ deleted_at TIMESTAMPTZ
@@ -87,7 +93,9 @@ CREATE TABLE workout_sets (
logged_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), logged_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
reps SMALLINT, reps SMALLINT,
seconds SMALLINT, seconds SMALLINT,
weight_kg NUMERIC(5,2), weight NUMERIC(5,2),
unit TEXT NOT NULL DEFAULT 'kg'
CHECK (unit in ('kg', 'lbs')),
rpe SMALLINT CHECK (rpe BETWEEN 1 AND 10), rpe SMALLINT CHECK (rpe BETWEEN 1 AND 10),
type TEXT NOT NULL DEFAULT 'working' type TEXT NOT NULL DEFAULT 'working'
CHECK (type IN ('warm-up', 'working', 'drop')), CHECK (type IN ('warm-up', 'working', 'drop')),
@@ -108,7 +116,7 @@ INSERT INTO exercises (name, metric, load, tags, equipment) VALUES
('Pike push-up', 'reps', 'bodyweight', '{push,shoulders}', '{floor,rings,parallettes}'), ('Pike push-up', 'reps', 'bodyweight', '{push,shoulders}', '{floor,rings,parallettes}'),
('Dip', 'reps', 'bodyweight', '{push,chest,triceps}', '{rings,parallel_bars}'), ('Dip', 'reps', 'bodyweight', '{push,chest,triceps}', '{rings,parallel_bars}'),
('Handstand hold', 'seconds', 'bodyweight', '{push,shoulders,skill}', '{floor,rings,parallettes}'), ('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}'), ('Pull-up', 'reps', 'bodyweight', '{pull,back,biceps}', '{rings,pull_up_bar}'),
('Chin-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 row', 'reps', 'bodyweight', '{pull,back}', '{rings,parallel_bars,low_bar}'),
@@ -127,3 +135,9 @@ INSERT INTO exercises (name, metric, load, tags, equipment) VALUES
('Hanging leg raise', 'reps', 'bodyweight', '{core}', '{rings,pull_up_bar}'), ('Hanging leg raise', 'reps', 'bodyweight', '{core}', '{rings,pull_up_bar}'),
('Face pull', 'reps', 'bodyweight', '{pull,shoulders}', '{rings,resistance_band}'), ('Face pull', 'reps', 'bodyweight', '{pull,shoulders}', '{rings,resistance_band}'),
('Lateral raise', 'reps', 'absolute', '{shoulders,isolation}', '{floor}'); ('Lateral raise', 'reps', 'absolute', '{shoulders,isolation}', '{floor}');
UPDATE exercises SET progresses_from_id = (SELECT id FROM exercises WHERE name = 'Pike push-up')
WHERE name = 'Handstand push-up';
UPDATE exercises SET progresses_from_id = (SELECT id FROM exercises WHERE name = 'Dead hang')
WHERE name = 'One arm dead hang';