107 lines
5.5 KiB
TypeScript
107 lines
5.5 KiB
TypeScript
import "dotenv/config";
|
|
import { PrismaClient } from "@prisma/client";
|
|
import { PrismaPg } from "@prisma/adapter-pg";
|
|
import argon2 from "argon2";
|
|
|
|
const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
|
|
const prisma = new PrismaClient({ adapter });
|
|
|
|
async function main() {
|
|
console.log("🌱 Seed en cours...");
|
|
|
|
// ── Admin ──────────────────────────────────────────────────────────────────
|
|
const adminPassword = await argon2.hash("admin1234");
|
|
const admin = await prisma.user.upsert({
|
|
where: { email: "admin@pulseform.app" },
|
|
update: {},
|
|
create: {
|
|
username: "admin",
|
|
email: "admin@pulseform.app",
|
|
password: adminPassword,
|
|
role: "ADMIN",
|
|
},
|
|
});
|
|
console.log(`✅ Admin : ${admin.email}`);
|
|
|
|
// ── Exercices ──────────────────────────────────────────────────────────────
|
|
const exercisesData = [
|
|
{ name: "Squat", description: "Flexion des jambes, dos droit.", difficulty: "BEGINNER" as const, muscleGroups: ["Legs", "Glutes"] },
|
|
{ name: "Squat sauté", description: "Squat avec impulsion vers le haut.", difficulty: "INTERMEDIATE" as const, muscleGroups: ["Legs", "Glutes"] },
|
|
{ name: "Fente avant", description: "Pas en avant, genou à 90°.", difficulty: "BEGINNER" as const, muscleGroups: ["Legs", "Glutes"] },
|
|
{ name: "Pompes", description: "Bras à largeur d'épaules, corps droit.", difficulty: "BEGINNER" as const, muscleGroups: ["Chest", "Arms"] },
|
|
{ name: "Pompes diamant", description: "Mains proches, triceps sollicités.", difficulty: "INTERMEDIATE" as const, muscleGroups: ["Arms", "Chest"] },
|
|
{ name: "Dips", description: "Sur une chaise ou barre parallèle.", difficulty: "INTERMEDIATE" as const, muscleGroups: ["Arms", "Chest"] },
|
|
{ name: "Traction", description: "Barre fixe, prise pronation.", difficulty: "ADVANCED" as const, muscleGroups: ["Back", "Arms"] },
|
|
{ name: "Rowing incliné", description: "Haltère, dos à 45°.", difficulty: "INTERMEDIATE" as const, muscleGroups: ["Back"] },
|
|
{ name: "Planche", description: "Corps droit, abdos contractés.", difficulty: "BEGINNER" as const, muscleGroups: ["Abdominals"] },
|
|
{ name: "Crunch", description: "Soulever les épaules, pas le dos.", difficulty: "BEGINNER" as const, muscleGroups: ["Abdominals"] },
|
|
{ name: "Mountain climber", description: "Alterner genoux vers la poitrine.", difficulty: "INTERMEDIATE" as const, muscleGroups: ["Abdominals", "Legs"] },
|
|
{ name: "Burpee", description: "Pompe + saut, exercice full body.", difficulty: "ADVANCED" as const, muscleGroups: ["Legs", "Chest", "Arms"] },
|
|
];
|
|
|
|
await prisma.exercise.createMany({ data: exercisesData, skipDuplicates: true });
|
|
const exercises = await prisma.exercise.findMany();
|
|
console.log(`✅ ${exercises.length} exercices`);
|
|
|
|
// ── Programme débutant ─────────────────────────────────────────────────────
|
|
const squat = exercises.find((e) => e.name === "Squat")!;
|
|
const pompes = exercises.find((e) => e.name === "Pompes")!;
|
|
const planche = exercises.find((e) => e.name === "Planche")!;
|
|
const crunch = exercises.find((e) => e.name === "Crunch")!;
|
|
const fente = exercises.find((e) => e.name === "Fente avant")!;
|
|
|
|
await prisma.program.upsert({
|
|
where: { id: "00000000-0000-0000-0000-000000000001" },
|
|
update: {},
|
|
create: {
|
|
id: "00000000-0000-0000-0000-000000000001",
|
|
name: "Full Body Débutant",
|
|
description: "Programme complet pour commencer sans équipement.",
|
|
isPublic: true,
|
|
authorId: admin.id,
|
|
exercises: {
|
|
create: [
|
|
{ exerciseId: squat.id!, sets: 3, reps: 12, order: 0 },
|
|
{ exerciseId: pompes.id!, sets: 3, reps: 10, order: 1 },
|
|
{ exerciseId: fente.id!, sets: 3, reps: 10, order: 2 },
|
|
{ exerciseId: planche.id!, sets: 3, durationSec: 30, order: 3 },
|
|
{ exerciseId: crunch.id!, sets: 3, reps: 15, order: 4 },
|
|
],
|
|
},
|
|
},
|
|
});
|
|
console.log("✅ Programme : Full Body Débutant");
|
|
|
|
// ── Programme intermédiaire ────────────────────────────────────────────────
|
|
const burpee = exercises.find((e) => e.name === "Burpee")!;
|
|
const mountain = exercises.find((e) => e.name === "Mountain climber")!;
|
|
const squatSaute = exercises.find((e) => e.name === "Squat sauté")!;
|
|
|
|
await prisma.program.upsert({
|
|
where: { id: "00000000-0000-0000-0000-000000000002" },
|
|
update: {},
|
|
create: {
|
|
id: "00000000-0000-0000-0000-000000000002",
|
|
name: "Cardio Intermédiaire",
|
|
description: "Circuit cardio sans équipement, intensité modérée.",
|
|
isPublic: true,
|
|
authorId: admin.id,
|
|
exercises: {
|
|
create: [
|
|
{ exerciseId: burpee.id!, sets: 4, reps: 8, order: 0 },
|
|
{ exerciseId: squatSaute.id!, sets: 4, reps: 12, order: 1 },
|
|
{ exerciseId: mountain.id!, sets: 4, durationSec: 30, order: 2 },
|
|
{ exerciseId: pompes.id!, sets: 4, reps: 12, order: 3 },
|
|
],
|
|
},
|
|
},
|
|
});
|
|
console.log("✅ Programme : Cardio Intermédiaire");
|
|
|
|
console.log("🎉 Seed terminé.");
|
|
}
|
|
|
|
main()
|
|
.catch((e) => { console.error(e); process.exit(1); })
|
|
.finally(() => prisma.$disconnect());
|