Aller au contenu principal

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

src/utilisateurs/entities/utilisateur.entity.ts
@Column({ unique: true, type: 'varchar', length: 255 })
courriel: string;

@Column({ unique: true, type: 'varchar', length: 32 })
nomUtilisateur: string;
info

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.

src/utilisateurs/utilisateurs.service.ts
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.

  1. Créer un fichier erreurs.json pour 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"
    }
  2. Injecter I18nService
    export class UtilisateursService {
    constructor(private readonly i18n: I18nService) {}
    //...
  3. 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 })
    );
    }

    /...

Level Up