From d0efaa524187a400427f18ea2cce06eec2fb9538 Mon Sep 17 00:00:00 2001 From: Sten Levasseur Date: Fri, 3 Jan 2025 23:26:57 +0100 Subject: [PATCH] refactor: migrate exerciseType to exerciseCategory --- apps/api/package.json | 1 + apps/api/src/app.module.ts | 4 +- apps/api/src/entities/exercise.entity.ts | 6 +- ...e.entity.ts => exerciseCategory.entity.ts} | 4 +- apps/api/src/migrations/.snapshot-dropit.json | 16 ++--- ...03214146_exerciseTypeToExerciseCategory.ts | 27 +++++++ .../src/modules/exercise/exercise.service.ts | 70 +++++++++---------- .../exerciseCategory.controller.ts | 51 ++++++++++++++ .../exerciseCategory/exerciseCategory.dto.ts | 3 + .../exerciseCategory.module.ts | 9 +++ .../exerciseCategory.service.ts | 54 ++++++++++++++ .../exerciseType/exerciseType.controller.ts | 44 ------------ .../modules/exerciseType/exerciseType.dto.ts | 3 - .../exerciseType/exerciseType.module.ts | 9 --- .../exerciseType/exerciseType.service.ts | 47 ------------- apps/api/src/seeders/database.seeder.ts | 12 ++-- apps/api/test/exercise.e2e-spec.ts | 49 ++++++------- packages/contract/src/exercise.contract.ts | 12 ++-- packages/schemas/src/exercice.schema.ts | 8 +-- 19 files changed, 234 insertions(+), 195 deletions(-) rename apps/api/src/entities/{exerciseType.entity.ts => exerciseCategory.entity.ts} (86%) create mode 100644 apps/api/src/migrations/Migration20250103214146_exerciseTypeToExerciseCategory.ts create mode 100644 apps/api/src/modules/exerciseCategory/exerciseCategory.controller.ts create mode 100644 apps/api/src/modules/exerciseCategory/exerciseCategory.dto.ts create mode 100644 apps/api/src/modules/exerciseCategory/exerciseCategory.module.ts create mode 100644 apps/api/src/modules/exerciseCategory/exerciseCategory.service.ts delete mode 100644 apps/api/src/modules/exerciseType/exerciseType.controller.ts delete mode 100644 apps/api/src/modules/exerciseType/exerciseType.dto.ts delete mode 100644 apps/api/src/modules/exerciseType/exerciseType.module.ts delete mode 100644 apps/api/src/modules/exerciseType/exerciseType.service.ts diff --git a/apps/api/package.json b/apps/api/package.json index 25109ae..4b1606e 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -11,6 +11,7 @@ "dev": "nest start --watch", "start:debug": "nest start --debug --watch", "start:prod": "node dist/main", + "db:create": "mikro-orm database:create && pnpm db:migration:up", "db:sync": "mikro-orm schema:update --run", "db:fresh": "mikro-orm schema:fresh --seed --run", "db:migration:up": "mikro-orm migration:up", diff --git a/apps/api/src/app.module.ts b/apps/api/src/app.module.ts index cbe90c0..afc111a 100644 --- a/apps/api/src/app.module.ts +++ b/apps/api/src/app.module.ts @@ -6,7 +6,7 @@ import { AppService } from './app.service'; //import { devOrmConfig, testOrmConfig } from './mikro-orm.config'; import config from './mikro-orm.config'; import { ExerciseModule } from './modules/exercise/exercise.module'; -import { ExerciseTypeModule } from './modules/exerciseType/exerciseType.module'; +import { ExerciseCategoryModule } from './modules/exerciseCategory/exerciseCategory.module'; import { VideoModule } from './modules/video/video.module'; @Module({ @@ -15,7 +15,7 @@ import { VideoModule } from './modules/video/video.module'; MikroOrmModule.forRoot(config), ExerciseModule, VideoModule, - ExerciseTypeModule, + ExerciseCategoryModule, ], controllers: [AppController], providers: [AppService], diff --git a/apps/api/src/entities/exercise.entity.ts b/apps/api/src/entities/exercise.entity.ts index 44b1a3e..6416615 100644 --- a/apps/api/src/entities/exercise.entity.ts +++ b/apps/api/src/entities/exercise.entity.ts @@ -1,5 +1,5 @@ import { Entity, ManyToOne, PrimaryKey, Property } from '@mikro-orm/core'; -import { ExerciseType } from './exerciseType.entity'; +import { ExerciseCategory } from './exerciseCategory.entity'; import { Video } from './video.entity'; @Entity() @@ -7,8 +7,8 @@ export class Exercise { @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' }) id!: string; - @ManyToOne(() => ExerciseType) - exerciseType!: ExerciseType; + @ManyToOne(() => ExerciseCategory) + exerciseCategory!: ExerciseCategory; @ManyToOne(() => Video, { nullable: true }) video?: Video; diff --git a/apps/api/src/entities/exerciseType.entity.ts b/apps/api/src/entities/exerciseCategory.entity.ts similarity index 86% rename from apps/api/src/entities/exerciseType.entity.ts rename to apps/api/src/entities/exerciseCategory.entity.ts index 9acdce7..b27c084 100644 --- a/apps/api/src/entities/exerciseType.entity.ts +++ b/apps/api/src/entities/exerciseCategory.entity.ts @@ -8,13 +8,13 @@ import { import { Exercise } from './exercise.entity'; @Entity() -export class ExerciseType { +export class ExerciseCategory { @PrimaryKey({ type: 'uuid', defaultRaw: 'gen_random_uuid()' }) id!: string; @OneToMany( () => Exercise, - (exercise) => exercise.exerciseType + (exercise) => exercise.exerciseCategory ) exercises = new Collection(this); diff --git a/apps/api/src/migrations/.snapshot-dropit.json b/apps/api/src/migrations/.snapshot-dropit.json index 1199450..2d2e191 100644 --- a/apps/api/src/migrations/.snapshot-dropit.json +++ b/apps/api/src/migrations/.snapshot-dropit.json @@ -47,11 +47,11 @@ "mappedType": "datetime" } }, - "name": "exercise_type", + "name": "exercise_category", "schema": "public", "indexes": [ { - "keyName": "exercise_type_pkey", + "keyName": "exercise_category_pkey", "columnNames": [ "id" ], @@ -209,8 +209,8 @@ "default": "gen_random_uuid()", "mappedType": "uuid" }, - "exercise_type_id": { - "name": "exercise_type_id", + "exercise_category_id": { + "name": "exercise_category_id", "type": "uuid", "unsigned": false, "autoincrement": false, @@ -304,16 +304,16 @@ ], "checks": [], "foreignKeys": { - "exercise_exercise_type_id_foreign": { - "constraintName": "exercise_exercise_type_id_foreign", + "exercise_exercise_category_id_foreign": { + "constraintName": "exercise_exercise_category_id_foreign", "columnNames": [ - "exercise_type_id" + "exercise_category_id" ], "localTableName": "public.exercise", "referencedColumnNames": [ "id" ], - "referencedTableName": "public.exercise_type", + "referencedTableName": "public.exercise_category", "updateRule": "cascade" }, "exercise_video_id_foreign": { diff --git a/apps/api/src/migrations/Migration20250103214146_exerciseTypeToExerciseCategory.ts b/apps/api/src/migrations/Migration20250103214146_exerciseTypeToExerciseCategory.ts new file mode 100644 index 0000000..56d8ca2 --- /dev/null +++ b/apps/api/src/migrations/Migration20250103214146_exerciseTypeToExerciseCategory.ts @@ -0,0 +1,27 @@ +import { Migration } from '@mikro-orm/migrations'; + +export class Migration20250103214146_exerciseTypeToExerciseCategory extends Migration { + + override async up(): Promise { + this.addSql(`alter table "exercise" drop constraint "exercise_exercise_type_id_foreign";`); + + this.addSql(`create table "exercise_category" ("id" uuid not null default gen_random_uuid(), "name" varchar(255) not null, "created_at" timestamptz not null, "updated_at" timestamptz not null, constraint "exercise_category_pkey" primary key ("id"));`); + + this.addSql(`drop table if exists "exercise_type" cascade;`); + + this.addSql(`alter table "exercise" rename column "exercise_type_id" to "exercise_category_id";`); + this.addSql(`alter table "exercise" add constraint "exercise_exercise_category_id_foreign" foreign key ("exercise_category_id") references "exercise_category" ("id") on update cascade;`); + } + + override async down(): Promise { + this.addSql(`alter table "exercise" drop constraint "exercise_exercise_category_id_foreign";`); + + this.addSql(`create table "exercise_type" ("id" uuid not null default gen_random_uuid(), "name" varchar(255) not null, "created_at" timestamptz not null, "updated_at" timestamptz not null, constraint "exercise_type_pkey" primary key ("id"));`); + + this.addSql(`drop table if exists "exercise_category" cascade;`); + + this.addSql(`alter table "exercise" rename column "exercise_category_id" to "exercise_type_id";`); + this.addSql(`alter table "exercise" add constraint "exercise_exercise_type_id_foreign" foreign key ("exercise_type_id") references "exercise_type" ("id") on update cascade;`); + } + +} diff --git a/apps/api/src/modules/exercise/exercise.service.ts b/apps/api/src/modules/exercise/exercise.service.ts index 64cee31..42fb443 100644 --- a/apps/api/src/modules/exercise/exercise.service.ts +++ b/apps/api/src/modules/exercise/exercise.service.ts @@ -1,8 +1,4 @@ -import { - CreateExercise, - ExerciseResponse, - UpdateExercise, -} from '@dropit/schemas'; +import { CreateExercise, ExerciseDto, UpdateExercise } from '@dropit/schemas'; import { EntityManager, wrap } from '@mikro-orm/postgresql'; import { BadRequestException, @@ -10,15 +6,15 @@ import { NotFoundException, } from '@nestjs/common'; import { Exercise } from '../../entities/exercise.entity'; -import { ExerciseType } from '../../entities/exerciseType.entity'; +import { ExerciseCategory } from '../../entities/exerciseCategory.entity'; @Injectable() export class ExerciseService { constructor(private readonly em: EntityManager) {} - async getExercises(): Promise { + async getExercises(): Promise { const exercises = await this.em.findAll(Exercise, { - populate: ['exerciseType'], + populate: ['exerciseCategory'], }); if (!exercises || exercises.length === 0) { @@ -29,9 +25,9 @@ export class ExerciseService { return { id: exercise.id, name: exercise.name, - exerciseType: { - id: exercise.exerciseType.id, - name: exercise.exerciseType.name, + exerciseCategory: { + id: exercise.exerciseCategory.id, + name: exercise.exerciseCategory.name, }, video: exercise.video?.id ?? undefined, description: exercise.description ?? '', @@ -41,12 +37,12 @@ export class ExerciseService { }); } - async getExercise(id: string): Promise { + async getExercise(id: string): Promise { const exercise = await this.em.findOne( Exercise, { id }, { - populate: ['exerciseType'], + populate: ['exerciseCategory'], } ); @@ -57,9 +53,9 @@ export class ExerciseService { return { id: exercise.id, name: exercise.name, - exerciseType: { - id: exercise.exerciseType.id, - name: exercise.exerciseType.name, + exerciseCategory: { + id: exercise.exerciseCategory.id, + name: exercise.exerciseCategory.name, }, video: exercise.video?.id, description: exercise.description, @@ -68,18 +64,18 @@ export class ExerciseService { }; } - async createExercise(newExercise: CreateExercise): Promise { + async createExercise(newExercise: CreateExercise): Promise { if (!newExercise.name) { throw new BadRequestException('Exercise name is required'); } - const exerciseType = await this.em.findOne(ExerciseType, { - id: newExercise.exerciseType, + const exerciseCategory = await this.em.findOne(ExerciseCategory, { + id: newExercise.exerciseCategory, }); - if (!exerciseType) { + if (!exerciseCategory) { throw new NotFoundException( - `Exercise type with ID ${newExercise.exerciseType} not found` + `Exercise category with ID ${newExercise.exerciseCategory} not found` ); } @@ -88,7 +84,7 @@ export class ExerciseService { if (newExercise.description) { exerciseToCreate.description = newExercise.description; } - exerciseToCreate.exerciseType = exerciseType; + exerciseToCreate.exerciseCategory = exerciseCategory; await this.em.persistAndFlush(exerciseToCreate); @@ -98,7 +94,7 @@ export class ExerciseService { id: exerciseToCreate.id, }, { - populate: ['exerciseType'], + populate: ['exerciseCategory'], } ); @@ -109,9 +105,9 @@ export class ExerciseService { return { id: exerciseCreated.id, name: exerciseCreated.name, - exerciseType: { - id: exerciseCreated.exerciseType.id, - name: exerciseCreated.exerciseType.name, + exerciseCategory: { + id: exerciseCreated.exerciseCategory.id, + name: exerciseCreated.exerciseCategory.name, }, video: exerciseCreated.video?.id, description: exerciseCreated.description, @@ -123,12 +119,12 @@ export class ExerciseService { async updateExercise( id: string, exercise: UpdateExercise - ): Promise { + ): Promise { const exerciseToUpdate = await this.em.findOne( Exercise, { id }, { - populate: ['exerciseType'], + populate: ['exerciseCategory'], } ); @@ -146,7 +142,7 @@ export class ExerciseService { id: exerciseToUpdate.id, }, { - populate: ['exerciseType'], + populate: ['exerciseCategory'], } ); @@ -157,9 +153,9 @@ export class ExerciseService { return { id: exerciseUpdated.id, name: exerciseUpdated.name, - exerciseType: { - id: exerciseUpdated.exerciseType.id, - name: exerciseUpdated.exerciseType.name, + exerciseCategory: { + id: exerciseUpdated.exerciseCategory.id, + name: exerciseUpdated.exerciseCategory.name, }, video: exerciseUpdated.video?.id, description: exerciseUpdated.description, @@ -182,14 +178,14 @@ export class ExerciseService { }; } - async searchExercises(query: string): Promise { + async searchExercises(query: string): Promise { const exercises = await this.em.find( Exercise, { name: { $ilike: `%${query}%` }, }, { - populate: ['exerciseType'], + populate: ['exerciseCategory'], } ); @@ -201,9 +197,9 @@ export class ExerciseService { return { id: exercise.id, name: exercise.name, - exerciseType: { - id: exercise.exerciseType.id, - name: exercise.exerciseType.name, + exerciseCategory: { + id: exercise.exerciseCategory.id, + name: exercise.exerciseCategory.name, }, video: exercise.video?.id, description: exercise.description, diff --git a/apps/api/src/modules/exerciseCategory/exerciseCategory.controller.ts b/apps/api/src/modules/exerciseCategory/exerciseCategory.controller.ts new file mode 100644 index 0000000..1a16517 --- /dev/null +++ b/apps/api/src/modules/exerciseCategory/exerciseCategory.controller.ts @@ -0,0 +1,51 @@ +import { + Body, + Controller, + Delete, + Get, + Param, + Post, + Put, +} from '@nestjs/common'; +import { ExerciseCategory } from '../../entities/exerciseCategory.entity'; +import { ExerciseCategoryService } from './exerciseCategory.service'; + +@Controller('exercise-category') +export class ExerciseCategoryController { + constructor( + private readonly exerciseCategoryService: ExerciseCategoryService + ) {} + + @Get() + async getExerciseCategories() { + return this.exerciseCategoryService.getExerciseCategories(); + } + + @Get(':id') + async getExerciseCategory(@Param('id') id: string) { + return this.exerciseCategoryService.getExerciseCategory(id); + } + + @Post() + async createExerciseCategory(@Body() exerciseCategory: ExerciseCategory) { + return this.exerciseCategoryService.createExerciseCategory( + exerciseCategory + ); + } + + @Put(':id') + async updateExerciseCategory( + @Param('id') id: string, + @Body() exerciseCategory: ExerciseCategory + ) { + return this.exerciseCategoryService.updateExerciseCategory( + id, + exerciseCategory + ); + } + + @Delete(':id') + async deleteExerciseCategory(@Param('id') id: string) { + return this.exerciseCategoryService.deleteExerciseCategory(id); + } +} diff --git a/apps/api/src/modules/exerciseCategory/exerciseCategory.dto.ts b/apps/api/src/modules/exerciseCategory/exerciseCategory.dto.ts new file mode 100644 index 0000000..35f82c8 --- /dev/null +++ b/apps/api/src/modules/exerciseCategory/exerciseCategory.dto.ts @@ -0,0 +1,3 @@ +export type ExerciseCategoryDto = { + name: string; +}; diff --git a/apps/api/src/modules/exerciseCategory/exerciseCategory.module.ts b/apps/api/src/modules/exerciseCategory/exerciseCategory.module.ts new file mode 100644 index 0000000..1b8c571 --- /dev/null +++ b/apps/api/src/modules/exerciseCategory/exerciseCategory.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { ExerciseCategoryController } from './exerciseCategory.controller'; +import { ExerciseCategoryService } from './exerciseCategory.service'; + +@Module({ + controllers: [ExerciseCategoryController], + providers: [ExerciseCategoryService], +}) +export class ExerciseCategoryModule {} diff --git a/apps/api/src/modules/exerciseCategory/exerciseCategory.service.ts b/apps/api/src/modules/exerciseCategory/exerciseCategory.service.ts new file mode 100644 index 0000000..7537c16 --- /dev/null +++ b/apps/api/src/modules/exerciseCategory/exerciseCategory.service.ts @@ -0,0 +1,54 @@ +import { EntityManager, wrap } from '@mikro-orm/postgresql'; +import { Injectable } from '@nestjs/common'; +import { ExerciseCategory } from '../../entities/exerciseCategory.entity'; +import { ExerciseCategoryDto } from './exerciseCategory.dto'; + +@Injectable() +export class ExerciseCategoryService { + constructor(private readonly em: EntityManager) {} + + async getExerciseCategories() { + return this.em.find(ExerciseCategory, {}); + } + + async getExerciseCategory(id: string) { + return this.em.findOne(ExerciseCategory, { id }); + } + + async createExerciseCategory(exerciseCategory: ExerciseCategoryDto) { + const exerciseCategoryToCreate = new ExerciseCategory(); + exerciseCategoryToCreate.name = exerciseCategory.name; + await this.em.persistAndFlush(exerciseCategoryToCreate); + return exerciseCategoryToCreate; + } + + async updateExerciseCategory( + id: string, + exerciseCategory: ExerciseCategoryDto + ) { + const exerciseCategoryToUpdate = await this.em.findOne(ExerciseCategory, { + id, + }); + + if (!exerciseCategoryToUpdate) { + throw new Error('Exercise category not found'); + } + + wrap(exerciseCategoryToUpdate).assign(exerciseCategory); + + await this.em.persistAndFlush(exerciseCategoryToUpdate); + return exerciseCategoryToUpdate; + } + + async deleteExerciseCategory(id: string) { + const exerciseCategoryToDelete = await this.em.findOne(ExerciseCategory, { + id, + }); + + if (!exerciseCategoryToDelete) { + throw new Error('Exercise category not found'); + } + + await this.em.removeAndFlush(exerciseCategoryToDelete); + } +} diff --git a/apps/api/src/modules/exerciseType/exerciseType.controller.ts b/apps/api/src/modules/exerciseType/exerciseType.controller.ts deleted file mode 100644 index 66849d0..0000000 --- a/apps/api/src/modules/exerciseType/exerciseType.controller.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { - Body, - Controller, - Delete, - Get, - Param, - Post, - Put, -} from '@nestjs/common'; -import { ExerciseType } from '../../entities/exerciseType.entity'; -import { ExerciseTypeService } from './exerciseType.service'; - -@Controller('exercise-type') -export class ExerciseTypeController { - constructor(private readonly exerciseTypeService: ExerciseTypeService) {} - - @Get() - async getExerciseTypes() { - return this.exerciseTypeService.getExerciseTypes(); - } - - @Get(':id') - async getExerciseType(@Param('id') id: string) { - return this.exerciseTypeService.getExerciseType(id); - } - - @Post() - async createExerciseType(@Body() exerciseType: ExerciseType) { - return this.exerciseTypeService.createExerciseType(exerciseType); - } - - @Put(':id') - async updateExerciseType( - @Param('id') id: string, - @Body() exerciseType: ExerciseType - ) { - return this.exerciseTypeService.updateExerciseType(id, exerciseType); - } - - @Delete(':id') - async deleteExerciseType(@Param('id') id: string) { - return this.exerciseTypeService.deleteExerciseType(id); - } -} diff --git a/apps/api/src/modules/exerciseType/exerciseType.dto.ts b/apps/api/src/modules/exerciseType/exerciseType.dto.ts deleted file mode 100644 index 82ec829..0000000 --- a/apps/api/src/modules/exerciseType/exerciseType.dto.ts +++ /dev/null @@ -1,3 +0,0 @@ -export type ExerciseTypeDto = { - name: string; -}; diff --git a/apps/api/src/modules/exerciseType/exerciseType.module.ts b/apps/api/src/modules/exerciseType/exerciseType.module.ts deleted file mode 100644 index 0bb1cb2..0000000 --- a/apps/api/src/modules/exerciseType/exerciseType.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { Module } from '@nestjs/common'; -import { ExerciseTypeController } from './exerciseType.controller'; -import { ExerciseTypeService } from './exerciseType.service'; - -@Module({ - controllers: [ExerciseTypeController], - providers: [ExerciseTypeService], -}) -export class ExerciseTypeModule {} diff --git a/apps/api/src/modules/exerciseType/exerciseType.service.ts b/apps/api/src/modules/exerciseType/exerciseType.service.ts deleted file mode 100644 index b392b65..0000000 --- a/apps/api/src/modules/exerciseType/exerciseType.service.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { EntityManager, wrap } from '@mikro-orm/postgresql'; -import { Injectable } from '@nestjs/common'; -import { ExerciseType } from '../../entities/exerciseType.entity'; -import { ExerciseTypeDto } from './exerciseType.dto'; - -@Injectable() -export class ExerciseTypeService { - constructor(private readonly em: EntityManager) {} - - async getExerciseTypes() { - return this.em.find(ExerciseType, {}); - } - - async getExerciseType(id: string) { - return this.em.findOne(ExerciseType, { id }); - } - - async createExerciseType(exerciseType: ExerciseTypeDto) { - const exerciseTypeToCreate = new ExerciseType(); - exerciseTypeToCreate.name = exerciseType.name; - await this.em.persistAndFlush(exerciseTypeToCreate); - return exerciseTypeToCreate; - } - - async updateExerciseType(id: string, exerciseType: ExerciseTypeDto) { - const exerciseTypeToUpdate = await this.em.findOne(ExerciseType, { id }); - - if (!exerciseTypeToUpdate) { - throw new Error('Exercise type not found'); - } - - wrap(exerciseTypeToUpdate).assign(exerciseType); - - await this.em.persistAndFlush(exerciseTypeToUpdate); - return exerciseTypeToUpdate; - } - - async deleteExerciseType(id: string) { - const exerciseTypeToDelete = await this.em.findOne(ExerciseType, { id }); - - if (!exerciseTypeToDelete) { - throw new Error('Exercise type not found'); - } - - await this.em.removeAndFlush(exerciseTypeToDelete); - } -} diff --git a/apps/api/src/seeders/database.seeder.ts b/apps/api/src/seeders/database.seeder.ts index 03d9a4e..8c2e45c 100644 --- a/apps/api/src/seeders/database.seeder.ts +++ b/apps/api/src/seeders/database.seeder.ts @@ -1,18 +1,18 @@ //import { faker } from '@faker-js/faker'; import { EntityManager } from '@mikro-orm/core'; import { Factory, Seeder } from '@mikro-orm/seeder'; -import { ExerciseType } from '../entities/exerciseType.entity'; +import { ExerciseCategory } from '../entities/exerciseCategory.entity'; export class DatabaseSeeder extends Seeder { async run(em: EntityManager): Promise { const types = ['Haltérophilie', 'Endurance', 'Cardio', 'Musculation']; - for (const exerciseType of types) { - const exerciseTypeToCreate = new ExerciseType(); - exerciseTypeToCreate.name = exerciseType; - await em.persistAndFlush(exerciseTypeToCreate); + for (const exerciseCategory of types) { + const exerciseCategoryToCreate = new ExerciseCategory(); + exerciseCategoryToCreate.name = exerciseCategory; + await em.persistAndFlush(exerciseCategoryToCreate); - console.log('Exercise type created:', exerciseTypeToCreate); + console.log('Exercise type created:', exerciseCategoryToCreate); } } } diff --git a/apps/api/test/exercise.e2e-spec.ts b/apps/api/test/exercise.e2e-spec.ts index 436e8de..d458dfd 100644 --- a/apps/api/test/exercise.e2e-spec.ts +++ b/apps/api/test/exercise.e2e-spec.ts @@ -1,21 +1,21 @@ -import { CreateExercise, ExerciseResponse } from '@dropit/schemas'; +import { CreateExercise, ExerciseDto } from '@dropit/schemas'; import { MikroORM } from '@mikro-orm/core'; import { INestApplication } from '@nestjs/common'; import { Test, TestingModule } from '@nestjs/testing'; import request from 'supertest'; import { AppModule } from '../src/app.module'; -import { ExerciseType } from '../src/entities/exerciseType.entity'; +import { ExerciseCategory } from '../src/entities/exerciseCategory.entity'; import { ExerciseService } from '../src/modules/exercise/exercise.service'; -import { ExerciseTypeService } from '../src/modules/exerciseType/exerciseType.service'; +import { ExerciseCategoryService } from '../src/modules/exerciseCategory/exerciseCategory.service'; describe('ExerciseController (e2e)', () => { let app: INestApplication; let orm: MikroORM; - let exerciseType: ExerciseType; + let exerciseCategory: ExerciseCategory; // Déclaration des fonctions utilitaires - let createExerciseType: (name: string) => Promise; - let createExercise: (exercise: CreateExercise) => Promise; + let createExerciseCategory: (name: string) => Promise; + let createExercise: (exercise: CreateExercise) => Promise; beforeAll(async () => { const moduleFixture: TestingModule = await Test.createTestingModule({ @@ -30,23 +30,24 @@ describe('ExerciseController (e2e)', () => { await generator.refreshDatabase(); // Initialisation des fonctions utilitaires - const exerciseTypeService = - moduleFixture.get(ExerciseTypeService); + const exerciseCategoryService = moduleFixture.get( + ExerciseCategoryService + ); const exerciseService = moduleFixture.get(ExerciseService); - createExerciseType = async (name: string): Promise => { - return await exerciseTypeService.createExerciseType({ name }); + createExerciseCategory = async ( + name: string + ): Promise => { + return await exerciseCategoryService.createExerciseCategory({ name }); }; - createExercise = async ( - exercise: CreateExercise - ): Promise => { + createExercise = async (exercise: CreateExercise): Promise => { const exerciseCreated = await exerciseService.createExercise(exercise); return { id: exerciseCreated.id, name: exerciseCreated.name, - exerciseType: exerciseCreated.exerciseType, + exerciseCategory: exerciseCreated.exerciseCategory, video: exerciseCreated.video, description: exerciseCreated.description, englishName: exerciseCreated.englishName, @@ -55,7 +56,7 @@ describe('ExerciseController (e2e)', () => { }; // Seed de la base de données avec au moinsun type d'exercice - exerciseType = await createExerciseType('Haltérophilie'); + exerciseCategory = await createExerciseCategory('Haltérophilie'); await app.init(); }); @@ -72,7 +73,7 @@ describe('ExerciseController (e2e)', () => { const exercise: CreateExercise = { name: 'Squat', description: 'Basic squat exercise', - exerciseType: exerciseType.id, + exerciseCategory: exerciseCategory.id, }; console.log('Sending exercise:', exercise); // Debug @@ -84,8 +85,8 @@ describe('ExerciseController (e2e)', () => { expect(response.body).toBeDefined(); expect(response.body.name).toBe(exercise.name); - expect(response.body.exerciseType.name).toBe(exerciseType.name); - expect(response.body.exerciseType.id).toBe(exerciseType.id); + expect(response.body.exerciseCategory.name).toBe(exerciseCategory.name); + expect(response.body.exerciseCategory.id).toBe(exerciseCategory.id); }); it('GET - should return all exercises', async () => { @@ -93,13 +94,13 @@ describe('ExerciseController (e2e)', () => { await createExercise({ name: 'Push-up', description: 'Basic push-up', - exerciseType: exerciseType.id, + exerciseCategory: exerciseCategory.id, }); await createExercise({ name: 'Pull-up', description: 'Basic pull-up', - exerciseType: exerciseType.id, + exerciseCategory: exerciseCategory.id, }); const response = await request(app.getHttpServer()) @@ -114,7 +115,7 @@ describe('ExerciseController (e2e)', () => { const newExercise = await createExercise({ name: 'Deadlift', description: 'Basic deadlift', - exerciseType: exerciseType.id, + exerciseCategory: exerciseCategory.id, }); const response = await request(app.getHttpServer()) @@ -123,14 +124,14 @@ describe('ExerciseController (e2e)', () => { expect(response.body).toBeDefined(); expect(response.body.name).toBe('Deadlift'); - expect(response.body.exerciseType.id).toBe(exerciseType.id); + expect(response.body.exerciseCategory.id).toBe(exerciseCategory.id); }); it('PATCH :id - should update an exercise', async () => { const newExercise = await createExercise({ name: 'Old name', description: 'Old description', - exerciseType: exerciseType.id, + exerciseCategory: exerciseCategory.id, }); const updateData = { @@ -151,7 +152,7 @@ describe('ExerciseController (e2e)', () => { const newExercise = await createExercise({ name: 'Burpees', description: 'Will be deleted', - exerciseType: exerciseType.id, + exerciseCategory: exerciseCategory.id, }); await request(app.getHttpServer()) diff --git a/packages/contract/src/exercise.contract.ts b/packages/contract/src/exercise.contract.ts index 712d75e..9fcd099 100644 --- a/packages/contract/src/exercise.contract.ts +++ b/packages/contract/src/exercise.contract.ts @@ -1,6 +1,6 @@ import { createExerciseSchema, - exerciseTypeSchema, + exerciseSchema, updateExerciseSchema, } from '@dropit/schemas'; import { initContract } from '@ts-rest/core'; @@ -13,7 +13,7 @@ export const exerciseContract = c.router({ path: '/exercise', summary: 'Get all exercises', responses: { - 200: z.array(exerciseTypeSchema), + 200: z.array(exerciseSchema), 404: z.object({ message: z.string(), }), @@ -31,7 +31,7 @@ export const exerciseContract = c.router({ id: z.string(), }), responses: { - 200: exerciseTypeSchema, + 200: exerciseSchema, 404: z.object({ message: z.string(), }), @@ -47,7 +47,7 @@ export const exerciseContract = c.router({ summary: 'Create an exercise', body: createExerciseSchema, responses: { - 201: exerciseTypeSchema, + 201: exerciseSchema, 400: z.object({ message: z.string(), }), @@ -69,7 +69,7 @@ export const exerciseContract = c.router({ }), body: updateExerciseSchema, responses: { - 200: exerciseTypeSchema, + 200: exerciseSchema, 404: z.object({ message: z.string(), }), @@ -107,7 +107,7 @@ export const exerciseContract = c.router({ like: z.string(), }), responses: { - 200: z.array(exerciseTypeSchema), + 200: z.array(exerciseSchema), 404: z.object({ message: z.string(), }), diff --git a/packages/schemas/src/exercice.schema.ts b/packages/schemas/src/exercice.schema.ts index 767f0ad..80fdc42 100644 --- a/packages/schemas/src/exercice.schema.ts +++ b/packages/schemas/src/exercice.schema.ts @@ -3,7 +3,7 @@ import { z } from 'zod'; export const createExerciseSchema = z.object({ name: z.string(), description: z.string().optional(), - exerciseType: z.string(), + exerciseCategory: z.string(), video: z.string().optional(), englishName: z.string().optional(), shortName: z.string().optional(), @@ -15,10 +15,10 @@ export const updateExerciseSchema = createExerciseSchema.partial(); export type UpdateExercise = z.infer; -export const exerciseTypeSchema = z.object({ +export const exerciseSchema = z.object({ id: z.string(), name: z.string(), - exerciseType: z.object({ + exerciseCategory: z.object({ id: z.string(), name: z.string(), }), @@ -28,4 +28,4 @@ export const exerciseTypeSchema = z.object({ shortName: z.string().optional(), }); -export type ExerciseResponse = z.infer; +export type ExerciseDto = z.infer;