diff --git a/srcs/requirements/nestjs/api_back/src/common/validation/validation.pipe.ts b/srcs/requirements/nestjs/api_back/src/common/validation/validation.pipe.ts new file mode 100644 index 00000000..a15048f2 --- /dev/null +++ b/srcs/requirements/nestjs/api_back/src/common/validation/validation.pipe.ts @@ -0,0 +1,24 @@ + +import { PipeTransform, Injectable, ArgumentMetadata, BadRequestException } from '@nestjs/common'; +import { validate } from 'class-validator'; +import { plainToInstance } from 'class-transformer'; + +@Injectable() +export class ValidationPipe implements PipeTransform { + async transform(value: any, { metatype }: ArgumentMetadata) { + if (!metatype || !this.toValidate(metatype)) { + return value; + } + const object = plainToInstance(metatype, value); + const errors = await validate(object); + if (errors.length > 0) { + throw new BadRequestException('Validation failed'); + } + return value; + } + + private toValidate(metatype: Function): boolean { + const types: Function[] = [String, Boolean, Number, Array, Object]; + return !types.includes(metatype); + } +} diff --git a/srcs/requirements/nestjs/api_back/src/users/dto/create-users.dto.ts b/srcs/requirements/nestjs/api_back/src/users/dto/create-users.dto.ts index 4c86a8de..b5c862ea 100644 --- a/srcs/requirements/nestjs/api_back/src/users/dto/create-users.dto.ts +++ b/srcs/requirements/nestjs/api_back/src/users/dto/create-users.dto.ts @@ -10,6 +10,5 @@ export class CreateUsersDto { @IsString() readonly image_url: string; @IsBoolean() - @IsOptional() readonly isEnabledTwoFactorAuth: boolean; } diff --git a/srcs/requirements/nestjs/api_back/src/users/users.controller.ts b/srcs/requirements/nestjs/api_back/src/users/users.controller.ts index e321636f..333aae30 100644 --- a/srcs/requirements/nestjs/api_back/src/users/users.controller.ts +++ b/srcs/requirements/nestjs/api_back/src/users/users.controller.ts @@ -4,6 +4,7 @@ import { } from '@nestjs/common'; import { AuthenticateGuard } from 'src/auth/42/guards/42guards'; import { PaginationQueryDto } from 'src/common/dto/pagination-query.dto'; +import { ValidationPipe } from 'src/common/validation/validation.pipe'; import { CreateUsersDto } from './dto/create-users.dto'; import { UpdateUsersDto } from './dto/update-users.dto'; @@ -46,7 +47,7 @@ export class UsersController { @UseGuards(AuthenticateGuard) @Patch() - update(@Req() req, @Body() usersUpdateDto: UpdateUsersDto) { + update(@Req() req, @Body(new ValidationPipe()) usersUpdateDto: UpdateUsersDto) { console.log("DANS PATCH USERS"); return this.usersService.update(req.user.id, usersUpdateDto); } diff --git a/srcs/requirements/nestjs/api_back/src/users/users.service.ts b/srcs/requirements/nestjs/api_back/src/users/users.service.ts index a6a0097c..24e1c4c0 100644 --- a/srcs/requirements/nestjs/api_back/src/users/users.service.ts +++ b/srcs/requirements/nestjs/api_back/src/users/users.service.ts @@ -65,7 +65,7 @@ export class UsersService { } async update(id: string, updateUserDto: UpdateUsersDto) { - console.log(`Update user ${id} with ${updateUserDto}`); + console.log(`Update user ${id} with ${updateUserDto.image_url} + ${updateUserDto.isEnabledTwoFactorAuth}`); const user = await this.userRepository.preload( {id: +id, ...updateUserDto}); diff --git a/srcs/requirements/svelte/api_front/src/pages/profil/updateProfil.svelte b/srcs/requirements/svelte/api_front/src/pages/profil/updateProfil.svelte index db983491..a37c722c 100644 --- a/srcs/requirements/svelte/api_front/src/pages/profil/updateProfil.svelte +++ b/srcs/requirements/svelte/api_front/src/pages/profil/updateProfil.svelte @@ -2,41 +2,45 @@ import { onMount } from "svelte"; - let username; - let image_url; + let usernameSv = ""; + let image_urlSv = ""; let gAuth = false; - let errors = {username, image_url}; + let errors = {usernameSv, image_urlSv}; onMount(async () => { await fetch("http://transcendance:8080/api/v2/user"). then(response => response.json()). then(data => { - console.log(data); - username = data.username; - image_url = data.image_url; + usernameSv = data.username; + image_urlSv = data.image_url; gAuth = data.isEnabledTwoFactorAuth; }); }); $: submit = async() => { - errors.username = ""; - errors.image_url =""; - if (username === undefined || username.trim() === "") { - errors.username = "Username is required"; + errors.usernameSv = ""; + errors.image_urlSv =""; + if (usernameSv === undefined || usernameSv.trim() === "") { + errors.usernameSv = "Username is required"; return; } - if (image_url === undefined || image_url.trim() === "") { - errors.image_url = "image_url is required"; + if (image_urlSv === undefined || image_urlSv.trim() === "") { + errors.image_urlSv = "image_url is required"; return; } + console.log(usernameSv); await fetch("http://transcendance:8080/api/v2/user/", { method: "PATCH", + headers: { + "Content-Type": "application/json", + }, body: JSON.stringify({ - "username": username, - "image_url": image_url, - "isEnabledTwoFactorAuth": gAuth - })}); - }; + "username" : usernameSv, + "image_url" : image_urlSv, + "isEnabledTwoFactorAuth" : gAuth + }) + }) +}; @@ -54,10 +58,10 @@ {/if}
- + - +