36-8 Contrainte d'unicité
On peut préciser via le décorateur @Column une contrainte d'unicité dans la base de données.
En effet, on ne veut pas
@Column({ unique: true, type: 'varchar', length: 255 })
courriel: string;
@Column({ unique: true, type: 'varchar', length: 32 })
nomUtilisateur: string;
il est possible que cela génère une erreur si des utilisateurs identiques sont déjà créés. Simplement les supprimer avant le changement.
Gérer l'erreur de duplication
Dans le cas où un courriel, ou nom d'utilisateur selon le cas, est déjà pris, on veut retourner une erreur significative.
Il est possible au niveau du service de faire une vérification et retourner un code d'erreur approprié.
Pour ce faire, on peut premièrement faire une requête qui fait une recherche pour un utilisateur correspondant au courriel OU nom d'utilisateur fourni.
async create(createUtilisateurDto: CreateUtilisateurDto) {
const { prenom, nom, courriel, nomUtilisateur, password } = createUtilisateurDto;
const utilisateurExistant = await Utilisateur.findOne({
where: [
{ courriel: courriel },
{ nomUtilisateur: nomUtilisateur },
]
});
if (utilisateurExistant) {
throw new ConflictException("Un utilisateur existe déjà avec ce nom d'utilisateur ou ce courriel");
}
const utilisateur = Utilisateur.create({
prenom: prenom,
nom: nom,
courriel: courriel.toLowerCase(),
nomUtilisateur: nomUtilisateur,
}
);
utilisateur.password = await bcrypt.hash(password, 12);
return utilisateur.save();
}
Ainsi, si vous essayez de créer un utilisateur avec un courriel ou un nom d'utilisateur qui existe déjà, vous devriez avoir l'erreur suivante:
{
"message": "Un utilisateur existe déjà avec ce nom d'utilisateur ou ce courriel",
"error": "Conflict",
"statusCode": 409
}
Utiliser les fichiers de traduction
Pour utiliser les fichiers de traduction, comme dans le cas des validations, il faut utiliser un principe un peu différent lorsque nous sommes dans un service.
- Créer un fichier
erreurs.jsonpour contenir les erreurs plus génériques et y mettre le texte de l'erreur d'utilisateur déjà présent:src/i18n/fr/erreurs.json{
"UTILISATEUR_EXISTE": "Un utilisateur existe déjà avec ce nom d'utilisateur ou ce courriel"
} - Injecter
I18nServiceexport class UtilisateursService {
constructor(private readonly i18n: I18nService) {}
//... - Aller chercher le contenu à l'aide de la fonction
t()du service//...
if (utilisateurExistant) {
throw new ConflictException(
this.i18n.t('erreurs.UTILISATEUR_EXISTE', { lang: I18nContext.current()?.lang })
);
}
/...
