Aller au contenu principal

ClassValidator

Description Générale​

Le fichier classValidator.ts contient une fonction utilitaire permettant de valider les données d'une classe DTO (Data Transfer Object) à l'aide de la bibliothèque class-validator. Cette validation garantit que les données reçues respectent les contraintes définies dans les classes DTO, comme les formats d'email, les longueurs minimales, ou les champs obligatoires.


Fonctionnalités Principales​

1. Validation des Données​

La fonction validateClass utilise la méthode validate de class-validator pour vérifier que les données d'une classe respectent les contraintes définies par ses décorateurs (par exemple, @IsEmail, @MinLength).

2. Retour des Erreurs​

Si les données ne respectent pas les contraintes, la fonction retourne un tableau d'erreurs de validation. Sinon, elle retourne null.

3. Arrêt à la Première Erreur​

La validation s'arrête dès qu'une erreur est détectée grâce à l'option stopAtFirstError: true. Cela permet d'optimiser les performances et de fournir un retour rapide.


Fonction : validateClass​

Signature​

export async function validateClass(data: any): Promise<ValidationError[] | null>;

Paramètres​

  • data : Instance de la classe DTO contenant les données à valider.

Retour​

  • ValidationError[] : Tableau contenant les erreurs de validation si les données sont invalides.
  • null : Si les données sont valides.

Exemple d'Utilisation​

Validation d'une Classe DTO​

Supposons que nous ayons une classe DTO pour l'inscription d'un utilisateur :

import { IsEmail, MinLength } from "class-validator";

export class UserRegisterDTO {
@IsEmail()
email: string;

@MinLength(8)
password: string;

@MinLength(3)
pseudo: string;
}

Exemple de Validation​

import { validateClass } from "../utils/classValidator";
import { UserRegisterDTO } from "../api/users/users.dto";

const data = new UserRegisterDTO();
data.email = "test@@"; // Email invalide
data.password = "test"; // Mot de passe trop court
data.pseudo = "T"; // Pseudo trop court

const validationErrors = await validateClass(data);

if (validationErrors) {
console.error("Erreurs de validation :", validationErrors);
} else {
console.log("Les données sont valides !");
}

Exemple d'Intégration dans une Route API​

Route d'Inscription​

import { validateClass } from "../utils/classValidator";
import { UserRegisterDTO } from "../api/users/users.dto";
import { Res } from "../types/response.entity";

app.post("/api/users/register", async (req, res) => {
const data = Object.assign(new UserRegisterDTO(), req.body);

// Validation des données
const validationErrors = await validateClass(data);
if (validationErrors) {
return res.status(400).json(new Res(400, "Données invalides", validationErrors));
}

// Logique métier pour créer l'utilisateur
// ...
res.status(201).json(new Res(201, "Utilisateur créé avec succès"));
});

Points Techniques​

1. Utilisation de class-validator​

  • class-validator est une bibliothèque qui permet de valider les données d'une classe en utilisant des décorateurs comme @IsEmail, @MinLength, ou @IsOptional.
  • Elle est particulièrement utile pour valider les données des DTOs dans les applications TypeScript.

2. Arrêt à la Première Erreur​

L'option stopAtFirstError: true optimise les performances en arrêtant la validation dès qu'une erreur est détectée.

3. Retour Structuré des Erreurs​

Les erreurs retournées par la fonction validateClass sont structurées et contiennent des informations détaillées sur les champs invalides, ce qui facilite leur gestion dans les réponses API.


Avantages​

  1. Validation Centralisée :

    • La validation est centralisée dans les DTOs, ce qui améliore la maintenabilité et réduit la duplication de code.
  2. Gestion des Erreurs Simplifiée :

    • Les erreurs de validation sont retournées sous une forme standardisée, ce qui facilite leur traitement dans les contrôleurs.
  3. Flexibilité :

    • Les contraintes de validation peuvent être facilement modifiées en ajoutant ou en modifiant les décorateurs dans les DTOs.