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
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().
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
}

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:
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
}

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.
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"
}

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:
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).
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
