fitness: add 5 default workout templates and new exercises

Add all 5 PPL+Upper/Lower templates matching the target split,
with Day 3 (Legs) adjusted to include Bulgarian split squats and
standing calf raises, and Day 5 (Lower) reworked with front squats,
hip thrusts, and goblet squats — all equipment-free of machines.

Also adds incline row, decline crunch, flat leg raise, and nordic
hamstring curl to the exercise list, and updates the WorkoutTemplate
model to use exerciseId instead of name for exercise references.
This commit is contained in:
2026-03-19 08:32:20 +01:00
parent 1c62819d18
commit 5198340c49
4 changed files with 205 additions and 17 deletions

View File

@@ -256,6 +256,20 @@ export const exercises: Exercise[] = [
'Lower with control.'
]
},
{
id: 'incline-row-dumbbell',
name: 'Incline Row (Dumbbell)',
bodyPart: 'back',
equipment: 'dumbbell',
target: 'lats',
secondaryMuscles: ['rhomboids', 'biceps', 'rear deltoids'],
instructions: [
'Lie face down on an incline bench set to about 30-45 degrees.',
'Hold a dumbbell in each hand with arms hanging straight down.',
'Row the dumbbells up to your sides, squeezing your shoulder blades together.',
'Lower with control.'
]
},
{
id: 'face-pull-cable',
name: 'Face Pull (Cable)',
@@ -713,6 +727,20 @@ export const exercises: Exercise[] = [
'Lower with control.'
]
},
{
id: 'nordic-hamstring-curl',
name: 'Nordic Hamstring Curl',
bodyPart: 'legs',
equipment: 'body weight',
target: 'hamstrings',
secondaryMuscles: ['glutes', 'calves'],
instructions: [
'Kneel on a pad with your ankles secured under a sturdy object or by a partner.',
'Keep your body straight from knees to head.',
'Slowly lower yourself forward by extending at the knees, resisting with your hamstrings.',
'Lower as far as you can control, then push off the ground lightly to return to the start.'
]
},
{
id: 'goblet-squat-dumbbell',
name: 'Goblet Squat (Dumbbell)',
@@ -754,6 +782,34 @@ export const exercises: Exercise[] = [
'Hold the position for the desired duration.'
]
},
{
id: 'decline-crunch',
name: 'Decline Crunch',
bodyPart: 'core',
equipment: 'body weight',
target: 'abdominals',
secondaryMuscles: ['hip flexors'],
instructions: [
'Lie on a decline bench with your feet secured under the pads.',
'Place hands behind your head or across your chest.',
'Curl your upper body up towards your knees.',
'Lower with control.'
]
},
{
id: 'flat-leg-raise',
name: 'Flat Leg Raise',
bodyPart: 'core',
equipment: 'body weight',
target: 'abdominals',
secondaryMuscles: ['hip flexors'],
instructions: [
'Lie flat on a bench or the floor with legs extended.',
'Place hands at your sides or under your hips for support.',
'Raise your legs until they are perpendicular to the floor.',
'Lower with control without letting your feet touch the floor.'
]
},
{
id: 'crunch',
name: 'Crunch',

View File

@@ -7,7 +7,8 @@ export interface ISet {
}
export interface IExercise {
name: string;
exerciseId: string;
name?: string;
sets: ISet[];
restTime?: number; // Rest time in seconds, defaults to 120 (2 minutes)
}
@@ -43,11 +44,15 @@ const SetSchema = new mongoose.Schema({
});
const ExerciseSchema = new mongoose.Schema({
name: {
exerciseId: {
type: String,
required: true,
trim: true
},
name: {
type: String,
trim: true
},
sets: {
type: [SetSchema],
required: true,

View File

@@ -53,8 +53,8 @@ export const POST: RequestHandler = async ({ request, locals }) => {
// Validate exercises structure
for (const exercise of exercises) {
if (!exercise.name || !exercise.sets || !Array.isArray(exercise.sets) || exercise.sets.length === 0) {
return json({ error: 'Each exercise must have a name and at least one set' }, { status: 400 });
if (!exercise.exerciseId || !exercise.sets || !Array.isArray(exercise.sets) || exercise.sets.length === 0) {
return json({ error: 'Each exercise must have an exerciseId and at least one set' }, { status: 400 });
}
for (const set of exercise.sets) {

View File

@@ -7,7 +7,7 @@ import { WorkoutTemplate } from '$models/WorkoutTemplate';
const defaultTemplates = [
{
name: 'Day 1 - Pull',
description: 'Back and biceps focused pull day',
description: 'Back, biceps, and shoulders pull day',
exercises: [
{
exerciseId: 'bent-over-row-barbell',
@@ -27,6 +27,30 @@ const defaultTemplates = [
],
restTime: 120
},
{
exerciseId: 'incline-row-dumbbell',
sets: [
{ reps: 12, weight: 16, rpe: 7 },
{ reps: 12, weight: 16, rpe: 8 }
],
restTime: 90
},
{
exerciseId: 'upright-row-barbell',
sets: [
{ reps: 12, weight: 30, rpe: 7 },
{ reps: 12, weight: 30, rpe: 8 }
],
restTime: 90
},
{
exerciseId: 'decline-crunch',
sets: [
{ reps: 15, rpe: 7 },
{ reps: 15, rpe: 8 }
],
restTime: 60
},
{
exerciseId: 'lateral-raise-dumbbell',
sets: [
@@ -47,7 +71,7 @@ const defaultTemplates = [
},
{
name: 'Day 2 - Push',
description: 'Chest, shoulders, and triceps push day',
description: 'Chest, triceps, and biceps push day',
exercises: [
{
exerciseId: 'bench-press-barbell',
@@ -74,6 +98,14 @@ const defaultTemplates = [
],
restTime: 90
},
{
exerciseId: 'bench-press-close-grip-barbell',
sets: [
{ reps: 10, weight: 60, rpe: 7 },
{ reps: 10, weight: 60, rpe: 8 }
],
restTime: 120
},
{
exerciseId: 'hammer-curl-dumbbell',
sets: [
@@ -94,7 +126,7 @@ const defaultTemplates = [
},
{
name: 'Day 3 - Legs',
description: 'Lower body leg day',
description: 'Quad, hamstring, and calf focused leg day',
exercises: [
{
exerciseId: 'squat-barbell',
@@ -109,31 +141,126 @@ const defaultTemplates = [
exerciseId: 'romanian-deadlift-barbell',
sets: [
{ reps: 10, weight: 70, rpe: 7 },
{ reps: 10, weight: 70, rpe: 8 }
{ reps: 10, weight: 70, rpe: 8 },
{ reps: 10, weight: 70, rpe: 9 }
],
restTime: 120
},
{
exerciseId: 'leg-press-machine',
exerciseId: 'bulgarian-split-squat-dumbbell',
sets: [
{ reps: 12, weight: 100, rpe: 7 },
{ reps: 12, weight: 100, rpe: 8 }
{ reps: 10, weight: 16, rpe: 7 },
{ reps: 10, weight: 16, rpe: 8 }
],
restTime: 120
},
{
exerciseId: 'leg-curl-machine',
exerciseId: 'calf-raise-standing',
sets: [
{ reps: 12, weight: 40, rpe: 7 },
{ reps: 12, weight: 40, rpe: 8 }
{ reps: 15, rpe: 7 },
{ reps: 15, rpe: 8 },
{ reps: 15, rpe: 9 }
],
restTime: 60
}
]
},
{
name: 'Day 4 - Upper',
description: 'Full upper body day — shoulders, chest, back, and core',
exercises: [
{
exerciseId: 'overhead-press-barbell',
sets: [
{ reps: 8, weight: 40, rpe: 7 },
{ reps: 8, weight: 40, rpe: 8 }
],
restTime: 120
},
{
exerciseId: 'bench-press-dumbbell',
sets: [
{ reps: 10, weight: 28, rpe: 7 },
{ reps: 10, weight: 28, rpe: 8 }
],
restTime: 120
},
{
exerciseId: 'chin-up',
sets: [
{ reps: 6, rpe: 8 },
{ reps: 6, rpe: 9 }
],
restTime: 120
},
{
exerciseId: 'bench-press-close-grip-barbell',
sets: [
{ reps: 10, weight: 60, rpe: 7 },
{ reps: 10, weight: 60, rpe: 8 }
],
restTime: 120
},
{
exerciseId: 'decline-crunch',
sets: [
{ reps: 15, rpe: 7 },
{ reps: 15, rpe: 8 }
],
restTime: 60
},
{
exerciseId: 'flat-leg-raise',
sets: [
{ reps: 15, rpe: 7 },
{ reps: 15, rpe: 8 }
],
restTime: 60
}
]
},
{
name: 'Day 5 - Lower',
description: 'Glute, quad, and hamstring focused lower day',
exercises: [
{
exerciseId: 'front-squat-barbell',
sets: [
{ reps: 8, weight: 60, rpe: 7 },
{ reps: 8, weight: 60, rpe: 8 },
{ reps: 8, weight: 60, rpe: 9 }
],
restTime: 150
},
{
exerciseId: 'romanian-deadlift-dumbbell',
sets: [
{ reps: 10, weight: 24, rpe: 7 },
{ reps: 10, weight: 24, rpe: 8 }
],
restTime: 120
},
{
exerciseId: 'hip-thrust-barbell',
sets: [
{ reps: 10, weight: 60, rpe: 7 },
{ reps: 10, weight: 60, rpe: 8 }
],
restTime: 120
},
{
exerciseId: 'goblet-squat-dumbbell',
sets: [
{ reps: 12, weight: 20, rpe: 7 },
{ reps: 12, weight: 20, rpe: 8 }
],
restTime: 90
},
{
exerciseId: 'calf-raise-machine',
exerciseId: 'calf-raise-standing',
sets: [
{ reps: 15, weight: 60, rpe: 7 },
{ reps: 15, weight: 60, rpe: 8 }
{ reps: 15, rpe: 7 },
{ reps: 15, rpe: 8 }
],
restTime: 60
}