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'
);