Aller au contenu principal

30-3 Valider une requête et ses attributs

Lorsqu'on regarde une requête de création de projet, on remarque qu'on accepte en entrée un corps de requête correspondant à un DTO, soit CreateProjetDto

src/projets/projets.controller.ts
create(@Body() createProjetDto: CreateProjetDto) {
return this.projetsService.creer(createProjetDto);
}

L'utilisation de ValidationPipe, configuré précédemment, fait en sorte de valider automatiquement le format d'une requête lorsqu'elle est associée à un objet, comme par exemple via l'utilisation de @Body() createProjetDto: CreateProjetDto.

Validations lors de la création

Pour valider des attributs d'une classe, soit CreateProjetDto, on utilise des décorateurs de validation.

Valider le type de données (ex.: string)

Par exemple, pour vérifier qu'une propriété doit être de type string, on peut utiliser le décorateur IsString().

src/projets/dto/create-projet.dto.ts
export class CreateProjetDto {
@ApiProperty({
description: 'Le nom du projet',
example: 'LAN Party',
})
@IsString()
nom: string;

@ApiProperty({
description: 'la description du projet',
example: "Tout ce qui à trait à l'organisation du LAN Party",
})
@IsString()
description: string;

@ApiProperty({
description: "L'URL de l'image du projet",
example: 'https://i.imgur.com/Y5nZ4Qe.jpg',
})
@IsString()
@IsOptional()
imageUrl?: string;
}

Maintenant, effectuer la requête de création dans Postman avec une valeur booléenne pour la description devrait générer une erreur!

{
"message": [
"description must be a string"
],
"error": "Bad Request",
"statusCode": 400
}

Imgur

Valider la présence (attribut requis)

Le décorateur IsNotEmpty() peut être utilisé pour sa part afin de vérifier qu'un attribut est présent et n'est pas vide ("", null ou undefined).

Par exemple, comme les propriétés nom et description sont requises:

src/projets/dto/create-projet.dto.ts
export class CreateProjetDto {
@ApiProperty({
description: 'Le nom du projet',
example: 'LAN Party',
})
@IsString()
@IsNotEmpty()
nom: string;

@ApiProperty({
description: 'la description du projet',
example: "Tout ce qui à trait à l'organisation du LAN Party",
})
@IsString()
@IsNotEmpty()
description: string;

@ApiProperty({
description: "L'URL de l'image du projet",
example: 'https://i.imgur.com/Y5nZ4Qe.jpg',
})
@IsString()
@IsOptional()
imageUrl?: string;
}

Effectuer la même requête que précédemment résultera en une erreur de plus sur la propriété nom, comme quoi elle devrait être présente.

{
"message": [
"nom should not be empty",
"description must be a string"
],
"error": "Bad Request",
"statusCode": 400
}

Imgur

Validation du format

Il est aussi possible de valider le format des données reçues (courriel, longueur min, longueur max, etc.).

Pour le nom, ajoutons le décorateur @MinLength() en spécifiant la longueur minimale de 3 caractères.

src/projets/dto/create-projet.dto.ts
export class CreateProjetDto {
@ApiProperty({
description: 'Le nom du projet',
example: 'LAN Party',
})
@IsString()
@IsNotEmpty()
@MinLength(3)
nom: string;

//...

Voilà, maintenant vous devrez fournir des informations valides avant de pouvoir créer un nouveau projet! Par exemple:

{
"nom": "Nouveau projet validé",
"description": "Un nouveau projet validé",
"imageUrl": "https://i.imgur.com/Y5nZ4Qe.jpg"
}

Imgur

Validations lors de la mise à jour

La fonction update() du contrôleur récupère le corps de la requête et l'associe à un objet de type UpdateProjetDto:

src/projets/projets.controller.ts
update(@Param('id') id: string, @Body() updateProjetDto: UpdateProjetDto) {
const projetModif = this.projetsService.modifier(+id, updateProjetDto);

if (!projetModif) throw new NotFoundException();

return projetModif;
}

Pour sa part, la classe UpdateProjetDto ne fait qu'hériter de CreateProjetDto, en assignant toutes les propriétés comme étant optionnelles (PartialType).

src/projets/dto/update-projet.dto.ts
export class UpdateProjetDto extends PartialType(CreateProjetDto) {}

Ainsi, pour la mise à jour, rien à faire, les validations du DTO de création seront utilisées!

Liste complète des valideurs

Pour la liste complète des valideurs disponibles, c'est par ici: https://github.com/typestack/class-validator#validation-decorators

Level Up