Aller au contenu principal

Créer vos propres Validateurs

Parfois, les validateurs standards ne suffisent pas (ex: vérifier un format spécifique, un code barre, une logique métier). Vous pouvez étendre my-class-validator en créant vos propres décorateurs compatibles AJV.

1. Créer le Décorateur

Utilisez la factory createCustomValidator fournie par la librairie.

Exemple : Valider que la valeur est "coucou"

// decorators/is-coucou.decorator.ts
import { createCustomValidator } from 'my-class-validator';

export const IsCoucou = createCustomValidator<string>(
'is-coucou', // Nom unique du keyword pour AJV
(value) => typeof value === 'string' && value === 'coucou', // Fonction de validation (retourne bool)
`La valeur n'est pas 'coucou'.` // Message d'erreur par défaut
);

2. Utilisation dans un DTO

Utilisez-le comme n'importe quel autre décorateur.

import { IsString, generateSchema } from 'my-class-validator';
import { IsCoucou } from './decorators/is-coucou.decorator';

export class TestDto {
@IsString()
@IsCoucou({ message: "Allez, dis coucou s'il te plaît !" })
text: string;
}

export const TestSchema = generateSchema(TestDto);

3. Enregistrer le Validateur (Important ⚠️)

Pour que AJV (le moteur de validation de Fastify) comprenne ce nouveau mot-clé, vous devez l'enregistrer au démarrage de votre application.

Si vous utilisez my-fastify-decorators, cela se fait généralement dans votre fichier d'entrée (main.ts ou index.ts).

import Fastify from 'fastify';
import Ajv from 'ajv';
import { registerValidators } from 'my-class-validator';
import { bootstrap } from 'my-fastify-decorators';
// ... imports modules ...

async function start() {
const app = Fastify();

// 1. Configuration d'AJV
const ajv = new Ajv({ allErrors: true });

// 2. Enregistrement des validateurs custom de my-class-validator
registerValidators(ajv);

// 3. Liaison avec Fastify
app.setValidatorCompiler(({ schema }) => {
return ajv.compile(schema);
});

await bootstrap(app, AppModule);
await app.listen({ port: 3000 });
}

start();

Validateurs Asynchrones ⏳

Votre fonction de validation peut être async. C'est utile pour vérifier des choses en base de données, mais attention aux performances !

export const IsDatabaseId = createCustomValidator<string>(
'is-db-id',
async (id) => {
// Simulation d'appel BDD
const exists = await db.checkId(id);
return exists;
},
'ID inconnu en base de données'
);