diff --git a/packages/backend/src/app.module.ts b/packages/backend/src/app.module.ts index 7069fb0..757fb6b 100644 --- a/packages/backend/src/app.module.ts +++ b/packages/backend/src/app.module.ts @@ -4,6 +4,7 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { UsersModule } from './users/users.module'; +import { PersonsModule } from './persons/persons.module'; @Module({ imports: [ @@ -34,6 +35,8 @@ import { UsersModule } from './users/users.module'; }), UsersModule, + + PersonsModule, ], controllers: [AppController], providers: [AppService], diff --git a/packages/backend/src/persons/dto/create-person.dto.ts b/packages/backend/src/persons/dto/create-person.dto.ts new file mode 100644 index 0000000..c08acd8 --- /dev/null +++ b/packages/backend/src/persons/dto/create-person.dto.ts @@ -0,0 +1,33 @@ +import { + IsString, + IsNotEmpty, + IsDateString, + IsBoolean, + IsOptional, +} from 'class-validator'; +import { ICreatePersonneDTO } from '@gim/shared'; + +export class CreatePersonDto implements ICreatePersonneDTO { + @IsString() + @IsNotEmpty() + numeroLicence!: string; + + @IsString() + @IsNotEmpty() + nom!: string; + + @IsString() + @IsNotEmpty() + prenom!: string; + + @IsDateString() + dateNaissance!: string; + + @IsBoolean() + @IsOptional() + surclasse!: boolean; + + @IsBoolean() + @IsOptional() + coach!: boolean; +} diff --git a/packages/backend/src/persons/dto/update-person.dto.ts b/packages/backend/src/persons/dto/update-person.dto.ts new file mode 100644 index 0000000..85e97b5 --- /dev/null +++ b/packages/backend/src/persons/dto/update-person.dto.ts @@ -0,0 +1,4 @@ +import { PartialType } from '@nestjs/mapped-types'; +import { CreatePersonDto } from './create-person.dto'; + +export class UpdatePersonDto extends PartialType(CreatePersonDto) {} diff --git a/packages/backend/src/persons/entities/person.entity.ts b/packages/backend/src/persons/entities/person.entity.ts new file mode 100644 index 0000000..ccc19bd --- /dev/null +++ b/packages/backend/src/persons/entities/person.entity.ts @@ -0,0 +1,26 @@ +import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'; +import { IPersonne } from '@gim/shared'; + +@Entity('personnes') +export class Person implements IPersonne { + @PrimaryGeneratedColumn('uuid') + id!: string; + + @Column({ unique: true }) + numeroLicence!: string; + + @Column() + nom!: string; + + @Column() + prenom!: string; + + @Column({ type: 'date' }) + dateNaissance!: string; + + @Column({ default: false }) + surclasse!: boolean; + + @Column({ default: false }) + coach!: boolean; +} diff --git a/packages/backend/src/persons/persons.controller.spec.ts b/packages/backend/src/persons/persons.controller.spec.ts new file mode 100644 index 0000000..992bc30 --- /dev/null +++ b/packages/backend/src/persons/persons.controller.spec.ts @@ -0,0 +1,20 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { PersonsController } from './persons.controller'; +import { PersonsService } from './persons.service'; + +describe('PersonsController', () => { + let controller: PersonsController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [PersonsController], + providers: [PersonsService], + }).compile(); + + controller = module.get(PersonsController); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); +}); diff --git a/packages/backend/src/persons/persons.controller.ts b/packages/backend/src/persons/persons.controller.ts new file mode 100644 index 0000000..92b028d --- /dev/null +++ b/packages/backend/src/persons/persons.controller.ts @@ -0,0 +1,34 @@ +import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common'; +import { PersonsService } from './persons.service'; +import { CreatePersonDto } from './dto/create-person.dto'; +import { UpdatePersonDto } from './dto/update-person.dto'; + +@Controller('persons') +export class PersonsController { + constructor(private readonly personsService: PersonsService) {} + + @Post() + create(@Body() createPersonDto: CreatePersonDto) { + return this.personsService.create(createPersonDto); + } + + @Get() + findAll() { + return this.personsService.findAll(); + } + + @Get(':id') + findOne(@Param('id') id: string) { + return this.personsService.findOne(+id); + } + + @Patch(':id') + update(@Param('id') id: string, @Body() updatePersonDto: UpdatePersonDto) { + return this.personsService.update(+id, updatePersonDto); + } + + @Delete(':id') + remove(@Param('id') id: string) { + return this.personsService.remove(+id); + } +} diff --git a/packages/backend/src/persons/persons.module.ts b/packages/backend/src/persons/persons.module.ts new file mode 100644 index 0000000..28b1305 --- /dev/null +++ b/packages/backend/src/persons/persons.module.ts @@ -0,0 +1,12 @@ +import { Module } from '@nestjs/common'; +import { PersonsService } from './persons.service'; +import { PersonsController } from './persons.controller'; +import { Person } from './entities/person.entity'; +import { TypeOrmModule } from '@nestjs/typeorm'; + +@Module({ + imports: [TypeOrmModule.forFeature([Person])], + controllers: [PersonsController], + providers: [PersonsService], +}) +export class PersonsModule {} diff --git a/packages/backend/src/persons/persons.service.spec.ts b/packages/backend/src/persons/persons.service.spec.ts new file mode 100644 index 0000000..4c62447 --- /dev/null +++ b/packages/backend/src/persons/persons.service.spec.ts @@ -0,0 +1,18 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { PersonsService } from './persons.service'; + +describe('PersonsService', () => { + let service: PersonsService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [PersonsService], + }).compile(); + + service = module.get(PersonsService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); +}); diff --git a/packages/backend/src/persons/persons.service.ts b/packages/backend/src/persons/persons.service.ts new file mode 100644 index 0000000..1e2c8cc --- /dev/null +++ b/packages/backend/src/persons/persons.service.ts @@ -0,0 +1,26 @@ +import { Injectable } from '@nestjs/common'; +import { CreatePersonDto } from './dto/create-person.dto'; +import { UpdatePersonDto } from './dto/update-person.dto'; + +@Injectable() +export class PersonsService { + create(createPersonDto: CreatePersonDto) { + return 'This action adds a new person'; + } + + findAll() { + return `This action returns all persons`; + } + + findOne(id: number) { + return `This action returns a #${id} person`; + } + + update(id: number, updatePersonDto: UpdatePersonDto) { + return `This action updates a #${id} person`; + } + + remove(id: number) { + return `This action removes a #${id} person`; + } +} diff --git a/packages/backend/src/users/entities/user.entity.ts b/packages/backend/src/users/entities/user.entity.ts index d35be10..3f484ee 100644 --- a/packages/backend/src/users/entities/user.entity.ts +++ b/packages/backend/src/users/entities/user.entity.ts @@ -4,7 +4,10 @@ import { PrimaryGeneratedColumn, Column, CreateDateColumn, + ManyToMany, + JoinTable, } from 'typeorm'; +import { Person } from '../../persons/entities/person.entity'; @Entity('utilisateurs') export class User implements IUser { @@ -25,4 +28,8 @@ export class User implements IUser { @CreateDateColumn() dateCreation!: Date; + + @ManyToMany(() => Person) + @JoinTable({ name: 'utilisateurs_personnes' }) + personnesRattachees!: Person[]; } diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts index 75c70a4..de8244e 100644 --- a/packages/shared/src/index.ts +++ b/packages/shared/src/index.ts @@ -1 +1,2 @@ -export * from './users/user.interface'; \ No newline at end of file +export * from './users/user.interface'; +export * from './persons/person.interface'; \ No newline at end of file diff --git a/packages/shared/src/persons/person.interface.ts b/packages/shared/src/persons/person.interface.ts new file mode 100644 index 0000000..52e5212 --- /dev/null +++ b/packages/shared/src/persons/person.interface.ts @@ -0,0 +1,19 @@ + +/** + * Contrat pour les données envoyées lors de la création d'une personne + */ +export interface ICreatePersonneDTO { + numeroLicence: string; + nom: string; + prenom: string; + dateNaissance: string; // Format ISO: "YYYY-MM-DD" + surclasse?: boolean; + coach?: boolean; +} + +/** + * Contrat pour les données renvoyées par l'API (profil public) + */ +export interface IPersonne extends ICreatePersonneDTO { + id: string; +} \ No newline at end of file