Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -94,9 +94,6 @@ export class ComplexUseCase {
}

// 2. Validate the data
if (!data.name) {
throw new BadRequestException('Complex name is required');
}
if (!data.exercises) {
throw new BadRequestException('Exercises are required');
}
Expand All @@ -114,7 +111,6 @@ export class ComplexUseCase {

// 5. Create the complex
const complex = new Complex();
complex.name = data.name;
complex.complexCategory = complexCategory;
complex.description = data.description || '';

Expand Down Expand Up @@ -144,16 +140,16 @@ export class ComplexUseCase {
await this.complexRepository.save(complex);

// 9. Get the created complex
const created = await this.complexRepository.getOne(complex.id, coachFilterConditions);
if (!created) {
const complexCreated = await this.complexRepository.getOne(complex.id, coachFilterConditions);
if (!complexCreated) {
throw new NotFoundException('Complex not found');
}

// 10. Map the complex
const dto = ComplexMapper.toDto(created);
const complexDto = ComplexMapper.toDto(complexCreated);

// 11. Present the complex
return ComplexPresenter.presentOne(dto);
return ComplexPresenter.presentCreationSuccess(complexDto);
} catch (error) {
return ComplexPresenter.presentCreationError(error as Error);
}
Expand All @@ -177,10 +173,6 @@ export class ComplexUseCase {
}

// 4. Update the complex properties
if (data.name) {
complexToUpdate.name = data.name;
}

if (data.description !== undefined) {
complexToUpdate.description = data.description;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ export class ExerciseUseCase {
const exerciseDto = ExerciseMapper.toDto(createdExercise);

//7. Return exercise
return ExercisePresenter.presentOne(exerciseDto);
return ExercisePresenter.presentCreationSuccess(exerciseDto);
} catch (error) {
return ExercisePresenter.presentCreationError(error as Error);
}
Expand Down
3 changes: 0 additions & 3 deletions apps/api/src/modules/training/domain/complex.entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,6 @@ export class Complex {
)
exercises = new Collection<ExerciseComplex>(this);

@Property()
name!: string;

@Property({ nullable: true })
description?: string;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ export const ComplexMapper = {
toDto(complex: Complex): ComplexDto {
return {
id: complex.id,
name: complex.name,
complexCategory: {
id: complex.complexCategory.id,
name: complex.complexCategory.name,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ export const WorkoutMapper = {
type: 'complex' as const,
complex: {
id: element.complex.id,
name: element.complex.name,
description: element.complex.description,
complexCategory: {
id: element.complex.complexCategory.id,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@ export const ComplexPresenter = {
};
},

presentCreationSuccess(message: string) {
presentCreationSuccess(complexDto: ComplexDto) {
return {
status: 201 as const,
body: { message },
body: complexDto,
};
},

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@ export const ExercisePresenter = {
};
},

presentCreationSuccess(message: string) {
presentCreationSuccess(exerciseDto: ExerciseDto) {
return {
status: 201 as const,
body: { message },
body: exerciseDto,
};
},

Expand Down
16 changes: 5 additions & 11 deletions apps/api/src/seeders/complex.seeder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { seedExercises } from './exercise.seeder';

export async function seedComplexes(
em: EntityManager
): Promise<Record<string, Complex>> {
): Promise<Complex[]> {

const exercisesMap = await seedExercises(em);

Expand Down Expand Up @@ -41,7 +41,6 @@ export async function seedComplexes(

const complexesToCreate = [
{
name: 'EMOM Technique Arraché',
category: 'EMOM',
description: "Focus sur la technique de l'arraché",
exercises: [
Expand All @@ -60,7 +59,6 @@ export async function seedComplexes(
],
},
{
name: 'Complex Épaulé-Jeté',
category: 'Technique Épaulé-Jeté',
description: "Focus sur la technique de l'épaulé-jeté",
exercises: [
Expand All @@ -83,7 +81,6 @@ export async function seedComplexes(
],
},
{
name: 'TABATA Force',
category: 'TABATA',
description: 'Focus sur la force',
exercises: [
Expand All @@ -102,7 +99,6 @@ export async function seedComplexes(
],
},
{
name: 'Technique Arraché Complet',
category: 'Technique Arraché',
description: "Focus sur la technique de l'arraché",
exercises: [
Expand All @@ -121,7 +117,6 @@ export async function seedComplexes(
],
},
{
name: 'EMOM Épaulé',
category: 'EMOM',
description: "Focus sur l'épaulé",
exercises: [
Expand All @@ -141,10 +136,9 @@ export async function seedComplexes(
},
];

const complexesMap: Record<string, Complex> = {};
const complexesCreated: Complex[] = [];
for (const complexData of complexesToCreate) {
const complex = new Complex();
complex.name = complexData.name;
complex.description = complexData.description;
complex.complexCategory = complexCategoriesMap[complexData.category];
complex.createdBy = null;
Expand All @@ -163,9 +157,9 @@ export async function seedComplexes(
await em.persistAndFlush(exerciseComplex);
}

console.log('Complex created:', complex.name);
complexesMap[complex.name] = complex;
console.log('Complex created:', complex);
complexesCreated.push(complex);
}

return complexesMap;
return complexesCreated;
}
23 changes: 11 additions & 12 deletions apps/api/src/seeders/workout.seeder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@ import { seedComplexes } from './complex.seeder';

export async function seedWorkouts(em: EntityManager): Promise<void> {

const complexesMap = await seedComplexes(em);
// Creation of complexes and their categories
const complexes = await seedComplexes(em);

// Exercises are already created by seedComplexes
const exercisesMap: Record<string, Exercise> = {};
Expand Down Expand Up @@ -53,7 +54,7 @@ export async function seedWorkouts(em: EntityManager): Promise<void> {
elements: [
{
type: WORKOUT_ELEMENT_TYPES.COMPLEX,
id: 'EMOM Technique Arraché', // EMOM Technique Arraché
complexIndex: 0, // Premier complex créé (EMOM Technique Arraché)
order: 0,
sets: 4,
reps: 1,
Expand All @@ -72,7 +73,7 @@ export async function seedWorkouts(em: EntityManager): Promise<void> {
},
{
type: WORKOUT_ELEMENT_TYPES.COMPLEX,
id: 'Complex Épaulé-Jeté', // Complex Épaulé-Jeté
complexIndex: 1, // Deuxième complex créé (Complex Épaulé-Jeté)
order: 2,
sets: 3,
reps: 1,
Expand All @@ -97,7 +98,7 @@ export async function seedWorkouts(em: EntityManager): Promise<void> {
elements: [
{
type: WORKOUT_ELEMENT_TYPES.COMPLEX,
id: 'Technique Arraché Complet', // Technique Arraché Complet
complexIndex: 3, // Quatrième complex créé (Technique Arraché Complet)
order: 0,
sets: 3,
reps: 2,
Expand All @@ -115,7 +116,7 @@ export async function seedWorkouts(em: EntityManager): Promise<void> {
},
{
type: WORKOUT_ELEMENT_TYPES.COMPLEX,
id: 'EMOM Épaulé', // EMOM Épaulé
complexIndex: 4, // Cinquième complex créé (EMOM Épaulé)
order: 2,
sets: 3,
reps: 2,
Expand All @@ -140,7 +141,7 @@ export async function seedWorkouts(em: EntityManager): Promise<void> {
elements: [
{
type: WORKOUT_ELEMENT_TYPES.COMPLEX,
id: 'TABATA Force', // TABATA Force
complexIndex: 2, // Troisième complex créé (TABATA Force)
order: 0,
sets: 4,
reps: 1,
Expand Down Expand Up @@ -194,18 +195,16 @@ export async function seedWorkouts(em: EntityManager): Promise<void> {
continue;
}
} else {
// Trouver le complex par son nom
const complex = await em.findOne(Complex, {
name: element.id,
});
// Utiliser l'index du complex
const complex = complexes[element.complexIndex];
if (!complex) {
console.warn(`Complex ${element.id} not found, skipping element`);
console.warn(`Complex at index ${element.complexIndex} not found, skipping element`);
continue;
}
workoutElement.complex = complex;
}

em.persist(workoutElement);
await em.persistAndFlush(workoutElement);
}

console.log('Workout created:', workout.title);
Expand Down
15 changes: 4 additions & 11 deletions apps/api/src/test/complex.integration.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ export async function runComplexTests(orm: MikroORM): Promise<void> {
exerciseCategory: exerciseCategory.id,
}, testData.organization.id, testData.adminUser.id);

if (exercise1Result.status !== 200 || exercise2Result.status !== 200 || exercise3Result.status !== 200) {
if (exercise1Result.status !== 201 || exercise2Result.status !== 201 || exercise3Result.status !== 201) {
throw new Error('Failed to create exercises');
}

Expand All @@ -100,7 +100,6 @@ export async function runComplexTests(orm: MikroORM): Promise<void> {
// Test 2: Créer un complex via use case
console.log('🧪 Testing complex creation via use case...');
const complex1Result = await complexUseCase.create({
name: 'Arraché simple',
complexCategory: complexCategory.id,
exercises: [
{
Expand All @@ -122,15 +121,14 @@ export async function runComplexTests(orm: MikroORM): Promise<void> {
description: 'Pour monter en gamme tranquillement',
}, testData.organization.id, testData.adminUser.id);

if (complex1Result.status !== 200) {
if (complex1Result.status !== 201) {
throw new Error(`Failed to create complex: ${complex1Result.body.message}`);
}

const complex1 = complex1Result.body;

expect(complex1).toBeDefined();
expect(complex1.id).toBeDefined();
expect(complex1.name).toBe('Arraché simple');
expect(complex1.exercises).toHaveLength(3);

// Test 3: Créer un autre complex
Expand All @@ -147,15 +145,14 @@ export async function runComplexTests(orm: MikroORM): Promise<void> {
exerciseCategory: exerciseCategory.id,
}, testData.organization.id, testData.adminUser.id);

if (exercise4Result.status !== 200 || exercise5Result.status !== 200) {
if (exercise4Result.status !== 201 || exercise5Result.status !== 201) {
throw new Error('Failed to create exercises for second complex');
}

const exercise4 = exercise4Result.body;
const exercise5 = exercise5Result.body;

const complex2Result = await complexUseCase.create({
name: 'Complex Push-Pull',
description: 'Complexe push-pull',
complexCategory: complexCategory.id,
exercises: [
Expand All @@ -164,14 +161,13 @@ export async function runComplexTests(orm: MikroORM): Promise<void> {
],
}, testData.organization.id, testData.adminUser.id);

if (complex2Result.status !== 200) {
if (complex2Result.status !== 201) {
throw new Error(`Failed to create second complex: ${complex2Result.body.message}`);
}

const complex2 = complex2Result.body;

expect(complex2).toBeDefined();
expect(complex2.name).toBe('Complex Push-Pull');
expect(complex2.exercises).toHaveLength(2);

// Test 4: Récupérer tous les complexes via use case
Expand All @@ -195,14 +191,12 @@ export async function runComplexTests(orm: MikroORM): Promise<void> {

const singleComplex = singleComplexResult.body;
expect(singleComplex.id).toBe(complex1.id);
expect(singleComplex.name).toBe('Arraché simple');

// Test 6: Mettre à jour un complex via use case
console.log('🧪 Testing complex update via use case...');
const updatedComplexResult = await complexUseCase.update(
complex1.id,
{
name: 'Arraché simple Modifié',
description: 'Description modifiée',
},
testData.organization.id,
Expand All @@ -214,7 +208,6 @@ export async function runComplexTests(orm: MikroORM): Promise<void> {
}

const updatedComplex = updatedComplexResult.body;
expect(updatedComplex.name).toBe('Arraché simple Modifié');
expect(updatedComplex.description).toBe('Description modifiée');

// Test 7: Supprimer un complex via use case
Expand Down
6 changes: 3 additions & 3 deletions apps/api/src/test/exercise.integration.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ export async function runExerciseTests(orm: MikroORM): Promise<void> {
exerciseCategory: exerciseCategory.id,
}, testData.organization.id, testData.adminUser.id);

if (exercise1Result.status !== 200) {
if (exercise1Result.status !== 201) {
throw new Error(`Failed to create exercise1: ${exercise1Result.body.message}`);
}

Expand All @@ -71,7 +71,7 @@ export async function runExerciseTests(orm: MikroORM): Promise<void> {
exerciseCategory: exerciseCategory.id,
}, testData.organization.id, testData.adminUser.id);

if (exercise2Result.status !== 200) {
if (exercise2Result.status !== 201) {
throw new Error(`Failed to create exercise2: ${exercise2Result.body.message}`);
}

Expand All @@ -87,7 +87,7 @@ export async function runExerciseTests(orm: MikroORM): Promise<void> {
shortName: 'FS',
}, testData.organization.id, testData.adminUser.id);

if (exercise3Result.status !== 200) {
if (exercise3Result.status !== 201) {
throw new Error(`Failed to create exercise3: ${exercise3Result.body.message}`);
}

Expand Down
Loading