Files
homepage/src/routes/api/fitness/templates/seed/+server.ts
T
Alexander 1228677498 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.
2026-03-19 08:32:41 +01:00

291 lines
6.0 KiB
TypeScript

import { json } from '@sveltejs/kit';
import type { RequestHandler } from './$types';
import { requireAuth } from '$lib/server/middleware/auth';
import { dbConnect } from '$utils/db';
import { WorkoutTemplate } from '$models/WorkoutTemplate';
const defaultTemplates = [
{
name: 'Day 1 - Pull',
description: 'Back, biceps, and shoulders pull day',
exercises: [
{
exerciseId: 'bent-over-row-barbell',
sets: [
{ reps: 10, weight: 60, rpe: 7 },
{ reps: 10, weight: 60, rpe: 8 },
{ reps: 10, weight: 60, rpe: 9 }
],
restTime: 120
},
{
exerciseId: 'pull-up',
sets: [
{ reps: 6, rpe: 8 },
{ reps: 6, rpe: 8 },
{ reps: 6, rpe: 9 }
],
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: [
{ reps: 15, weight: 10, rpe: 7 },
{ reps: 15, weight: 10, rpe: 8 }
],
restTime: 90
},
{
exerciseId: 'front-raise-dumbbell',
sets: [
{ reps: 10, weight: 10, rpe: 7 },
{ reps: 10, weight: 10, rpe: 8 }
],
restTime: 90
}
]
},
{
name: 'Day 2 - Push',
description: 'Chest, triceps, and biceps push day',
exercises: [
{
exerciseId: 'bench-press-barbell',
sets: [
{ reps: 8, weight: 80, rpe: 7 },
{ reps: 8, weight: 80, rpe: 8 },
{ reps: 8, weight: 80, rpe: 9 }
],
restTime: 120
},
{
exerciseId: 'incline-bench-press-barbell',
sets: [
{ reps: 10, weight: 60, rpe: 7 },
{ reps: 10, weight: 60, rpe: 8 }
],
restTime: 120
},
{
exerciseId: 'skullcrusher-dumbbell',
sets: [
{ reps: 15, weight: 15, rpe: 7 },
{ reps: 15, weight: 15, rpe: 8 }
],
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: [
{ reps: 15, weight: 12, rpe: 7 },
{ reps: 15, weight: 12, rpe: 8 }
],
restTime: 90
},
{
exerciseId: 'bicep-curl-dumbbell',
sets: [
{ reps: 15, weight: 10, rpe: 7 },
{ reps: 15, weight: 10, rpe: 8 }
],
restTime: 90
}
]
},
{
name: 'Day 3 - Legs',
description: 'Quad, hamstring, and calf focused leg day',
exercises: [
{
exerciseId: 'squat-barbell',
sets: [
{ reps: 8, weight: 80, rpe: 7 },
{ reps: 8, weight: 80, rpe: 8 },
{ reps: 8, weight: 80, rpe: 9 }
],
restTime: 150
},
{
exerciseId: 'romanian-deadlift-barbell',
sets: [
{ reps: 10, weight: 70, rpe: 7 },
{ reps: 10, weight: 70, rpe: 8 },
{ reps: 10, weight: 70, rpe: 9 }
],
restTime: 120
},
{
exerciseId: 'bulgarian-split-squat-dumbbell',
sets: [
{ reps: 10, weight: 16, rpe: 7 },
{ reps: 10, weight: 16, rpe: 8 }
],
restTime: 120
},
{
exerciseId: 'calf-raise-standing',
sets: [
{ 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-standing',
sets: [
{ reps: 15, rpe: 7 },
{ reps: 15, rpe: 8 }
],
restTime: 60
}
]
}
];
export const POST: RequestHandler = async ({ locals }) => {
const user = await requireAuth(locals);
await dbConnect();
// Check if user already has templates (don't re-seed)
const existingCount = await WorkoutTemplate.countDocuments({ createdBy: user.nickname });
if (existingCount > 0) {
return json({ message: 'Templates already exist', seeded: false });
}
const templates = await WorkoutTemplate.insertMany(
defaultTemplates.map((t) => ({
...t,
createdBy: user.nickname,
isDefault: true
}))
);
return json({ message: 'Default templates created', templates, seeded: true }, { status: 201 });
};