1- import { Injectable } from '@nestjs/common' ;
2- import { InjectModel } from '@nestjs/mongoose' ;
3- import { Agents } from '~/core/agents/_schemas/agents.schema' ;
4- import { Document , Model , ModifyResult , Query , QueryOptions , SaveOptions , Types , UpdateQuery } from 'mongoose' ;
5- import { AbstractServiceSchema } from '~/_common/abstracts/abstract.service.schema' ;
6- import { AgentsCreateDto } from './_dto/agents.dto' ;
7- import { hash } from 'argon2' ;
8- import { randomBytes } from 'node:crypto' ;
9- import { SecurityPartDTO } from './_dto/parts/security.part.dto' ;
1+ import { Injectable } from '@nestjs/common'
2+ import { InjectModel } from '@nestjs/mongoose'
3+ import { Agents } from '~/core/agents/_schemas/agents.schema'
4+ import { Document , Model , ModifyResult , Query , QueryOptions , SaveOptions , Types , UpdateQuery } from 'mongoose'
5+ import { AbstractServiceSchema } from '~/_common/abstracts/abstract.service.schema'
6+ import { AgentsCreateDto } from './_dto/agents.dto'
7+ import { hash } from 'argon2'
8+ import { randomBytes } from 'node:crypto'
9+ import { SecurityPartDTO } from './_dto/parts/security.part.dto'
1010
11+ /**
12+ * Service de gestion des agents.
13+ *
14+ * Ce service fournit les opérations CRUD pour les agents avec des fonctionnalités
15+ * de sécurité intégrées telles que le hachage des mots de passe et la génération
16+ * de clés secrètes.
17+ *
18+ * @class AgentsService
19+ * @extends {AbstractServiceSchema }
20+ *
21+ * @description
22+ * Fonctionnalités principales :
23+ * - Création d'agents avec hachage automatique du mot de passe (Argon2)
24+ * - Génération automatique d'une clé secrète unique pour chaque agent
25+ * - Mise à jour d'agents avec re-hachage du mot de passe si modifié
26+ * - Hérite des opérations CRUD standard via AbstractServiceSchema
27+ */
1128@Injectable ( )
1229export class AgentsService extends AbstractServiceSchema {
30+ /**
31+ * Constructeur du service AgentsService.
32+ *
33+ * @param {Model<Agents> } _model - Le modèle Mongoose pour la collection des agents
34+ */
1335 constructor ( @InjectModel ( Agents . name ) protected _model : Model < Agents > ) {
14- super ( ) ;
36+ super ( )
1537 }
1638
39+ /**
40+ * Crée un nouvel agent dans la base de données.
41+ *
42+ * Cette méthode effectue les opérations suivantes :
43+ * - Hache le mot de passe fourni avec Argon2
44+ * - Génère une clé secrète aléatoire de 64 caractères hexadécimaux
45+ * - Initialise l'objet security si non fourni
46+ * - Persiste l'agent dans la base de données
47+ *
48+ * @template T - Type étendu de Agents ou Document
49+ * @param {AgentsCreateDto } [data] - Les données de l'agent à créer
50+ * @param {SaveOptions } [options] - Options de sauvegarde Mongoose
51+ * @returns {Promise<Document<T, any, T>> } Le document de l'agent créé
52+ *
53+ * @example
54+ * ```typescript
55+ * const agent = await agentsService.create({
56+ * username: 'john.doe',
57+ * email: 'john.doe@example .com',
58+ * password: 'SecurePassword123!'
59+ * });
60+ * ```
61+ */
1762 public async create < T extends Agents | Document > (
1863 data ?: AgentsCreateDto ,
1964 options ?: SaveOptions ,
2065 ) : Promise < Document < T , any , T > > {
21- data . password = await hash ( data . password ) ;
22- data . security = ( data . security || { } ) as SecurityPartDTO ;
23- data . security . secretKey = randomBytes ( 32 ) . toString ( 'hex' ) ;
24- return await super . create ( data , options ) ;
66+ data . password = await hash ( data . password )
67+ data . security = ( data . security || { } ) as SecurityPartDTO
68+ data . security . secretKey = randomBytes ( 32 ) . toString ( 'hex' )
69+
70+ return await super . create ( data , options )
2571 }
2672
73+ /**
74+ * Met à jour un agent existant dans la base de données.
75+ *
76+ * Cette méthode gère automatiquement le re-hachage du mot de passe
77+ * si celui-ci est modifié. Elle supporte les mises à jour directes
78+ * ainsi que les mises à jour via l'opérateur $set de MongoDB.
79+ *
80+ * @template T - Type étendu de Agents ou Document
81+ * @param {Types.ObjectId | any } _id - L'identifiant de l'agent à mettre à jour
82+ * @param {UpdateQuery<T> & any } update - Les données de mise à jour
83+ * @param {QueryOptions<T> } [options] - Options de requête Mongoose
84+ * @returns {Promise<ModifyResult<Query<T, T, any, T>>> } Le résultat de la modification
85+ *
86+ * @example
87+ * ```typescript
88+ * // Mise à jour simple
89+ * await agentsService.update(agentId, {
90+ * password: 'NewPassword456!'
91+ * });
92+ *
93+ * // Mise à jour avec $set
94+ * await agentsService.update(agentId, {
95+ * $set: { password: 'NewPassword456!' }
96+ * });
97+ * ```
98+ */
2799 public async update < T extends Agents | Document > (
28100 _id : Types . ObjectId | any ,
29101 update : UpdateQuery < T > & any ,
30102 options ?: QueryOptions < T > ,
31103 ) : Promise < ModifyResult < Query < T , T , any , T > > > {
32104 if ( update . password ) {
33- update . password = await hash ( update . password ) ;
105+ update . password = await hash ( update . password )
34106 }
107+
35108 if ( update . $set ?. password ) {
36- update . $set . password = await hash ( update . $set . password ) ;
109+ update . $set . password = await hash ( update . $set . password )
37110 }
111+
38112 return await super . update (
39113 _id ,
40114 {
@@ -44,6 +118,6 @@ export class AgentsService extends AbstractServiceSchema {
44118 } ,
45119 } ,
46120 options ,
47- ) ;
121+ )
48122 }
49123}
0 commit comments