Aller au contenu principal

Users

Chargement...

Ce document explique le fonctionnement des fichiers liés à la gestion des utilisateurs dans le backend de l'application AlgoForge. Ces fichiers incluent le contrôleur, le service, et les DTOs associés.


1. users.controller.ts

Description

Le fichier users.controller.ts définit le contrôleur pour les utilisateurs. Il expose les routes HTTP permettant de gérer les utilisateurs (inscription, connexion, récupération, mise à jour, suppression). Ce contrôleur utilise le service UsersService pour effectuer les opérations métier.

Routes Disponibles

  • POST /register :
    • Inscription d'un utilisateur.
  • GET /confirm/:token :
    • Confirmation de l'inscription via un token.
  • POST /login :
    • Connexion d'un utilisateur.
  • GET /logout :
    • Déconnexion d'un utilisateur.
  • POST /recover :
    • Récupération du mot de passe.
  • GET /:id :
    • Récupérer un utilisateur par son ID.
  • PUT /:id :
    • Mettre à jour un utilisateur.
  • DELETE /:id :
    • Supprimer un utilisateur.

Fonctionnement

  1. Initialisation :
    • Le contrôleur initialise un routeur Express et applique le middleware authMiddleware pour vérifier les droits de l'utilisateur sur certaines routes.
  2. Gestion des Routes :
    • Chaque route est associée à une méthode asynchrone qui utilise le service UsersService pour effectuer les opérations nécessaires.
  3. Gestion des Réponses :
    • Les réponses sont standardisées à l'aide des classes de réponse (OkRes, NotFoundRes, etc.).

Exemple de Code

Inscription d'un Utilisateur (POST /register)

private async register(req: Request, res: Response) {
const { email, password, pseudo } = req.body;

const data = new UserRegisterDTO();
data.pseudo = pseudo;
data.email = email;
data.password = password;

const reponse = await this.usersService.register(data);

return res
.status(reponse.statut)
.json({ message: reponse.message, data: reponse.data });
}

2. users.service.ts

Description

Le fichier users.service.ts contient la logique métier pour la gestion des utilisateurs. Il interagit avec la base de données et les services externes (comme le service de messagerie) pour effectuer des opérations telles que l'inscription, la connexion, et la suppression d'utilisateurs.

Fonctionnalités Principales

  1. Inscription d'un Utilisateur :

    • register(data: UserRegisterDTO) :
      • Valide les données de l'utilisateur.
      • Vérifie l'unicité de l'email.
      • Hash le mot de passe.
      • Crée un utilisateur dans la base de données.
      • Génère un token de confirmation et envoie un email.
  2. Confirmation de l'Inscription :

    • confirm(mailToken: string) :
      • Décode le token pour récupérer l'ID de l'utilisateur.
      • Vérifie que l'utilisateur existe et n'est pas déjà confirmé.
      • Met à jour le statut de l'utilisateur comme "vérifié".
  3. Connexion d'un Utilisateur :

    • login(data: UserLoginDTO) :
      • Vérifie les données de connexion.
      • Authentifie l'utilisateur en comparant le mot de passe hashé.
      • Génère un token d'accès et le stocke dans la base de données.
  4. Déconnexion d'un Utilisateur :

    • logout(token: string) :
      • Supprime le token d'accès de la base de données.
  5. Récupération d'un Utilisateur :

    • getUser(id: number) :
      • Récupère un utilisateur par son ID.
  6. Mise à Jour d'un Utilisateur :

    • updateUser(id: number, data: UserUpdateDTO) :
      • Vérifie les droits de l'utilisateur.
      • Met à jour les informations de l'utilisateur (pseudo, mot de passe, photo de profil).
  7. Suppression d'un Utilisateur :

    • deleteUser(id: number, requestedUserId: number) :
      • Supprime l'utilisateur et toutes ses données associées (tokens, algorithmes, dossiers).

Exemple de Code

Inscription d'un Utilisateur

async register(data: UserRegisterDTO) {
if (!data.email || !data.password || !data.pseudo) {
return new BadRequestRes(Responses.General.Missing_data);
}

const validationErrors = await validateClass(data);
if (validationErrors) {
return new BadRequestRes(
Responses.General.Invalid_data,
validationErrors,
);
}

const userMails = await this.utilisateursRepository.find({
select: { adresseMail: true },
});

if (userMails.some((user) => user.adresseMail === data.email)) {
return new Res(409, Responses.User.Email_already_exists);
}

const hash = hashString(data.password);

const newUser = new Utilisateur();
newUser.adresseMail = data.email;
newUser.mdpHash = hash;
newUser.pseudo = data.pseudo;
newUser.dateInscription = new Date().getTime();

const savedUser = await this.utilisateursRepository.save(newUser);

const mailToken = await createMailToken(savedUser.id);

await this.mailService.sendConfirmationMail(
savedUser.adresseMail,
savedUser,
mailToken,
);

return new CreatedRes(Responses.User.Success.Created, savedUser);
}

3. users.dto.ts

Description

Le fichier users.dto.ts contient les classes de validation pour les données des utilisateurs. Ces classes sont utilisées pour valider les données reçues dans les requêtes HTTP avant de les traiter.

Classes Disponibles

  1. UserRegisterDTO :

    • Utilisée pour valider les données lors de l'inscription d'un utilisateur.
    • Attributs :
      • pseudo : Pseudo de l'utilisateur (entre 3 et 30 caractères).
      • email : Email de l'utilisateur.
      • password : Mot de passe de l'utilisateur (entre 8 et 255 caractères).
  2. UserLoginDTO :

    • Utilisée pour valider les données lors de la connexion d'un utilisateur.
    • Attributs :
      • email : Email de l'utilisateur.
      • password : Mot de passe de l'utilisateur.
  3. UserUpdateDTO :

    • Utilisée pour valider les données lors de la mise à jour d'un utilisateur.
    • Attributs :
      • pseudo (optionnel) : Nouveau pseudo de l'utilisateur.
      • currentPassword : Mot de passe actuel de l'utilisateur.
      • newPassword (optionnel) : Nouveau mot de passe de l'utilisateur.
      • urlPfp (optionnel) : URL de la photo de profil.
      • requestedUserId : ID de l'utilisateur effectuant la requête.

Exemple de Code

Classe UserRegisterDTO

export class UserRegisterDTO {
@Length(3, 30)
@IsNotEmpty()
pseudo: string;

@IsEmail()
@IsNotEmpty()
email: string;

@Length(8, 255)
@IsNotEmpty()
password: string;
}