nestcraftx 0.1.7 → 0.1.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -14,6 +14,7 @@ const {
14
14
  generateMiddlewares,
15
15
  generateRepository,
16
16
  generateController,
17
+ generateMongooseSchemaFileContent,
17
18
  } = require("../utils");
18
19
 
19
20
  async function setupCleanArchitecture(inputs) {
@@ -83,6 +84,16 @@ export class AppModule {}`,
83
84
  await createDirectory(`${entityPath}/${folder}`);
84
85
  }
85
86
 
87
+ if (dbConfig.orm === "mongoose") {
88
+ const mongooseSchemaContent = await generateMongooseSchemaFileContent(
89
+ entity
90
+ );
91
+ await createFile({
92
+ path: `src/${entity.name}/domain/entities/${entity.name}.schema.ts`,
93
+ contente: mongooseSchemaContent,
94
+ });
95
+ }
96
+
86
97
  // 📌 1. Entité
87
98
  const entityContent = await generateEntityFileContent(entity);
88
99
  await createFile({
@@ -107,136 +118,181 @@ export interface I${entityNameCapitalized}Repository {
107
118
 
108
119
  // 📌 3. Repository Implémentation
109
120
  await generateRepository(entity.name, dbConfig.orm);
110
- /* await createFile({
111
- path: `${entityPath}/infrastructure/repositories/${entityNameLower}.repository.ts`,
112
- contente: repositoryContent,
113
- }); */
114
121
 
115
122
  // 📌 4. Use Cases
116
123
  const useCases = ["Create", "GetById", "GetAll", "Update", "Delete"];
117
124
  useCases.forEach(async (useCase) => {
118
125
  let content = "";
126
+ const entityName = capitalize(entity.name);
127
+ const entityNameLower = decapitalize(entity.name);
119
128
 
120
129
  switch (useCase) {
121
130
  case "Create":
122
131
  content = `/**
123
- * Use Case pour créer un ${capitalize(entity.name)}.
132
+ * Use Case pour créer un ${entityName}.
124
133
  */
125
- import { Inject } from '@nestjs/common';
126
- import { Create${capitalize(entity.name)}Dto } from 'src/${
127
- entity.name
128
- }/application/dtos/${entity.name}.dto';
129
- import { I${capitalize(entity.name)}Repository } from 'src/${
130
- entity.name
131
- }/application/interfaces/${entity.name}.repository.interface';
132
-
133
- export class ${useCase}${capitalize(entity.name)}UseCase {
134
+ import { Inject, Logger } from '@nestjs/common';
135
+ import { Create${entityName}Dto } from 'src/${entity.name}/application/dtos/${entity.name}.dto';
136
+ import { I${entityName}Repository } from 'src/${entity.name}/application/interfaces/${entity.name}.repository.interface';
137
+ import { ${entityName}Entity } from 'src/${entity.name}/domain/entities/${entityNameLower}.entity';
138
+
139
+ export class Create${entityName}UseCase {
140
+ private readonly logger = new Logger(Create${entityName}UseCase.name);
141
+
134
142
  constructor(
135
- @Inject("I${capitalize(entity.name)}Repository")
136
- private readonly ${decapitalize(entity.name)}Repository: I${capitalize(
137
- entity.name
138
- )}Repository,
143
+ @Inject("I${entityName}Repository")
144
+ private readonly ${entityNameLower}Repository: I${entityName}Repository,
139
145
  ) {}
140
146
 
141
- execute(data: Create${capitalize(entity.name)}Dto) {
142
- return this.${decapitalize(entity.name)}Repository.create(data);
147
+ async execute(data: Create${entityName}Dto): Promise<${entityName}Entity> {
148
+ this.logger.log('Début création ${entityName}');
149
+ try {
150
+ const result = await this.${entityNameLower}Repository.create(data);
151
+ this.logger.log('Création réussie: ', result.getId());
152
+ return result;
153
+ } catch (error) {
154
+ this.logger.error('Erreur lors de la création', error.stack);
155
+ throw error;
156
+ }
143
157
  }
144
- }`;
158
+ }
159
+ `;
145
160
  break;
146
161
 
147
162
  case "GetById":
148
163
  content = `/**
149
- * Use Case pour récupérer un ${capitalize(entity.name)} par son ID.
164
+ * Use Case pour récupérer un ${entityName} par son ID.
150
165
  */
151
- import { Inject } from '@nestjs/common';
152
- import { I${capitalize(entity.name)}Repository } from 'src/${
153
- entity.name
154
- }/application/interfaces/${entity.name}.repository.interface';
166
+ import { Inject, Logger } from '@nestjs/common';
167
+ import { I${entityName}Repository } from 'src/${entity.name}/application/interfaces/${entity.name}.repository.interface';
168
+ import { ${entityName}Entity } from 'src/${entity.name}/domain/entities/${entityNameLower}.entity';
169
+
170
+ export class GetById${entityName}UseCase {
171
+ private readonly logger = new Logger(GetById${entityName}UseCase.name);
155
172
 
156
- export class ${useCase}${capitalize(entity.name)}UseCase {
157
173
  constructor(
158
- @Inject("I${capitalize(entity.name)}Repository")
159
- private readonly ${decapitalize(entity.name)}Repository: I${capitalize(
160
- entity.name
161
- )}Repository,
174
+ @Inject("I${entityName}Repository")
175
+ private readonly ${entityNameLower}Repository: I${entityName}Repository,
162
176
  ) {}
163
177
 
164
- execute(id: string) {
165
- return this.${decapitalize(entity.name)}Repository.findById(id);
178
+ async execute(id: string): Promise<${entityName}Entity | null> {
179
+ // this.logger.log(\`Recherche de ${entityName} par id: \${id}\`);
180
+ try {
181
+ const result = await this.${entityNameLower}Repository.findById(id);
182
+ this.logger.log('Recherche réussie');
183
+ return result;
184
+ } catch (error) {
185
+ this.logger.error('Erreur lors de la recherche', error.stack);
186
+ throw error;
187
+ }
166
188
  }
167
- }`;
189
+ }
190
+ `;
168
191
  break;
169
192
 
170
193
  case "GetAll":
171
194
  content = `/**
172
- * Use Case pour récupérer tous les ${capitalize(entity.name)}s.
195
+ * Use Case pour récupérer tous les ${entityName}s.
173
196
  */
174
- import { Inject } from '@nestjs/common';
175
- import { I${capitalize(entity.name)}Repository } from 'src/${
176
- entity.name
177
- }/application/interfaces/${entity.name}.repository.interface';
197
+ import { Inject, Logger } from '@nestjs/common';
198
+ import { I${entityName}Repository } from 'src/${entity.name}/application/interfaces/${entity.name}.repository.interface';
199
+ import { ${entityName}Entity } from 'src/${entity.name}/domain/entities/${entityNameLower}.entity';
200
+
201
+ export class GetAll${entityName}UseCase {
202
+ private readonly logger = new Logger(GetAll${entityName}UseCase.name);
178
203
 
179
- export class ${useCase}${capitalize(entity.name)}UseCase {
180
204
  constructor(
181
- @Inject("I${capitalize(entity.name)}Repository")
182
- private readonly ${decapitalize(entity.name)}Repository: I${capitalize(
183
- entity.name
184
- )}Repository,
205
+ @Inject("I${entityName}Repository")
206
+ private readonly ${entityNameLower}Repository: I${entityName}Repository,
185
207
  ) {}
186
208
 
187
- execute() {
188
- return this.${decapitalize(entity.name)}Repository.findAll();
209
+ async execute(): Promise<${entityName}Entity[]> {
210
+ // this.logger.log('Récupération de tous les ${entityName}s');
211
+ try {
212
+ const result = await this.${entityNameLower}Repository.findAll();
213
+ this.logger.log('Récupération réussie');
214
+ return result;
215
+ } catch (error) {
216
+ this.logger.error('Erreur lors de la récupération', error.stack);
217
+ throw error;
218
+ }
189
219
  }
190
- }`;
220
+ }
221
+ `;
191
222
  break;
192
223
 
193
224
  case "Update":
194
225
  content = `/**
195
- * Use Case pour mettre à jour un ${capitalize(entity.name)} existant.
226
+ * Use Case pour mettre à jour un ${entityName} existant.
196
227
  */
197
- import { Inject } from '@nestjs/common';
198
- import { Update${capitalize(entity.name)}Dto } from 'src/${
199
- entity.name
200
- }/application/dtos/${entity.name}.dto';
201
- import { I${capitalize(entity.name)}Repository } from 'src/${
202
- entity.name
203
- }/application/interfaces/${entity.name}.repository.interface';
204
-
205
- export class ${useCase}${capitalize(entity.name)}UseCase {
228
+ import { Inject, Logger } from '@nestjs/common';
229
+ import { Update${entityName}Dto } from 'src/${entity.name}/application/dtos/${entity.name}.dto';
230
+ import { I${entityName}Repository } from 'src/${entity.name}/application/interfaces/${entity.name}.repository.interface';
231
+ import { ${entityName}Entity } from 'src/${entity.name}/domain/entities/${entityNameLower}.entity';
232
+
233
+ export class Update${entityName}UseCase {
234
+ private readonly logger = new Logger(Update${entityName}UseCase.name);
235
+
206
236
  constructor(
207
- @Inject("I${capitalize(entity.name)}Repository")
208
- private readonly ${decapitalize(entity.name)}Repository: I${capitalize(
209
- entity.name
210
- )}Repository,
237
+ @Inject("I${entityName}Repository")
238
+ private readonly ${entityNameLower}Repository: I${entityName}Repository,
211
239
  ) {}
212
240
 
213
- execute(id: string, data: Update${capitalize(entity.name)}Dto) {
214
- return this.${decapitalize(entity.name)}Repository.update(id, data);
241
+ async execute(id: string, data: Update${entityName}Dto): Promise<${entityName}Entity | null> {
242
+ // this.logger.log(\`Mise à jour de ${entityName} id: \${id}\`);
243
+
244
+ try {
245
+ // Vérifier l'existence de l'élément
246
+ const existing = await this.${entityNameLower}Repository.findById(id);
247
+ if (!existing) {
248
+ this.logger.warn(\`${entityName} avec l'id \${id} non trouvé pour la mise à jour\`);
249
+ throw new Error('${entityName} non trouvé');
250
+ }
251
+ const result = await this.${entityNameLower}Repository.update(id, data);
252
+ this.logger.log('Mise à jour réussie');
253
+ return result;
254
+ } catch (error) {
255
+ this.logger.error('Erreur lors de la mise à jour', error.stack);
256
+ throw error;
257
+ }
215
258
  }
216
- }`;
259
+ }
260
+ `;
217
261
  break;
218
262
 
219
263
  case "Delete":
220
264
  content = `/**
221
- * Use Case pour supprimer un ${capitalize(entity.name)}.
265
+ * Use Case pour supprimer un ${entityName}.
222
266
  */
223
- import { Inject } from '@nestjs/common';
224
- import { I${capitalize(entity.name)}Repository } from 'src/${
225
- entity.name
226
- }/application/interfaces/${entity.name}.repository.interface';
267
+ import { Inject, Logger } from '@nestjs/common';
268
+ import { I${entityName}Repository } from 'src/${entity.name}/application/interfaces/${entity.name}.repository.interface';
269
+
270
+ export class Delete${entityName}UseCase {
271
+ private readonly logger = new Logger(Delete${entityName}UseCase.name);
227
272
 
228
- export class ${useCase}${capitalize(entity.name)}UseCase {
229
273
  constructor(
230
- @Inject("I${capitalize(entity.name)}Repository")
231
- private readonly ${decapitalize(entity.name)}Repository: I${capitalize(
232
- entity.name
233
- )}Repository,
274
+ @Inject("I${entityName}Repository")
275
+ private readonly ${entityNameLower}Repository: I${entityName}Repository,
234
276
  ) {}
235
277
 
236
- execute(id: string) {
237
- return this.${decapitalize(entity.name)}Repository.delete(id);
278
+ async execute(id: string): Promise<void> {
279
+ // this.logger.log(\`Suppression de ${entityName} id: \${id}\`);
280
+ try {
281
+ // Vérifier l'existence de l'élément
282
+ const existing = await this.${entityNameLower}Repository.findById(id);
283
+ if (!existing) {
284
+ this.logger.warn(\`${entityName} avec l'id \${id} non trouvé !\`);
285
+ throw new Error('${entityName} non trouvé');
286
+ }
287
+ await this.${entityNameLower}Repository.delete(id);
288
+ this.logger.log('Suppression réussie');
289
+ } catch (error) {
290
+ this.logger.error('Erreur lors de la suppression', error.stack);
291
+ throw error;
292
+ }
238
293
  }
239
- }`;
294
+ }
295
+ `;
240
296
  break;
241
297
  }
242
298
 
@@ -285,7 +341,7 @@ export enum Role {
285
341
  // 📌 7. Mapper
286
342
  const mapperFileContent = await generateMapper(entity);
287
343
  await createFile({
288
- path: `${entityPath}/domain/mappers/${entity.name}.mapper.ts`,
344
+ path: `${entityPath}/domain/mappers/${entityNameLower}.mapper.ts`,
289
345
  contente: mapperFileContent,
290
346
  });
291
347
 
@@ -293,53 +349,42 @@ export enum Role {
293
349
  await createFile({
294
350
  path: `${entityPath}/infrastructure/services/${entityNameLower}.service.ts`,
295
351
  contente: `
296
- // Le service est responsable de la logique métier de l'application. Il agit comme un orchestrateur entre
297
- // différents composants tels que les repositories, les use cases et les adaptateurs.
298
-
299
- import { Inject } from '@nestjs/common';
300
- import { I${entityNameCapitalized}Repository } from 'src/${entityNameLower}/application/interfaces/${entityNameLower}.repository.interface';
352
+ import { Injectable } from '@nestjs/common';
353
+ import { Create${entityNameCapitalized}UseCase } from 'src/${entityNameLower}/application/use-cases/create-${entityNameLower}.use-case';
354
+ import { Update${entityNameCapitalized}UseCase } from 'src/${entityNameLower}/application/use-cases/update-${entityNameLower}.use-case';
355
+ import { GetById${entityNameCapitalized}UseCase } from 'src/${entityNameLower}/application/use-cases/getById-${entityNameLower}.use-case';
356
+ import { GetAll${entityNameCapitalized}UseCase } from 'src/${entityNameLower}/application/use-cases/getAll-${entityNameLower}.use-case';
357
+ import { Delete${entityNameCapitalized}UseCase } from 'src/${entityNameLower}/application/use-cases/delete-${entityNameLower}.use-case';
358
+ import { Create${entityNameCapitalized}Dto, Update${entityNameCapitalized}Dto } from 'src/${entityNameLower}/application/dtos/${entityNameLower}.dto';
359
+ import { ${entityNameCapitalized}Entity } from 'src/${entityNameLower}/domain/entities/${entityNameLower}.entity';
301
360
 
361
+ @Injectable()
302
362
  export class ${entityNameCapitalized}Service {
303
363
  constructor(
304
- @Inject("I${entityNameCapitalized}Repository")
305
- private readonly repository: I${entityNameCapitalized}Repository,
364
+ private readonly createUseCase: Create${entityNameCapitalized}UseCase,
365
+ private readonly updateUseCase: Update${entityNameCapitalized}UseCase,
366
+ private readonly getByIdUseCase: GetById${entityNameCapitalized}UseCase,
367
+ private readonly getAllUseCase: GetAll${entityNameCapitalized}UseCase,
368
+ private readonly deleteUseCase: Delete${entityNameCapitalized}UseCase,
306
369
  ) {}
307
370
 
308
- // La méthode 'process' prend en charge la logique pour traiter les données.
309
- async process(data: any) {
310
- if (!data || !data.id) {
311
- throw new Error('Données invalides, ID requis');
312
- }
313
-
314
- const entityFromDb = await this.repository.findById(data.id);
315
-
316
- if (!entityFromDb) {
317
- throw new Error('Entité non trouvée avec cet ID');
318
- }
319
-
320
- const processedData = {
321
- ...entityFromDb,
322
- updatedAt: new Date(),
323
- processedBy: 'System',
324
- };
325
-
326
- return processedData;
371
+ async create(dto: Create${entityNameCapitalized}Dto): Promise<${entityNameCapitalized}Entity> {
372
+ return await this.createUseCase.execute(dto);
327
373
  }
328
-
329
- // Vous pouvez ajouter d'autres méthodes métier ici si nécessaire.
330
- async create(data: any) {
331
- // Logique pour créer une nouvelle entité
374
+ async update(id: string, dto: Update${entityNameCapitalized}Dto): Promise<${entityNameCapitalized}Entity | null> {
375
+ return await this.updateUseCase.execute(id, dto);
332
376
  }
333
-
334
- async update(id: string, data: any) {
335
- // Logique pour mettre à jour une entité existante
377
+ async getById(id: string): Promise<${entityNameCapitalized}Entity | null> {
378
+ return await this.getByIdUseCase.execute(id);
336
379
  }
337
-
338
- async delete(id: string) {
339
- // Logique pour supprimer une entité
380
+ async getAll(): Promise<${entityNameCapitalized}Entity[]> {
381
+ return await this.getAllUseCase.execute();
382
+ }
383
+ async delete(id: string): Promise<void> {
384
+ return await this.deleteUseCase.execute(id);
340
385
  }
341
386
  }
342
- `,
387
+ `.trim(),
343
388
  });
344
389
 
345
390
  // 📌 9. Adapter
@@ -397,14 +442,24 @@ export class ${entityNameCapitalized}Adapter {
397
442
  importsBlock.push(
398
443
  `TypeOrmModule.forFeature([${entityNameCapitalized}])`
399
444
  );
445
+ } else if (dbConfig.orm === "mongoose") {
446
+ extraImports = `import { MongooseModule } from '@nestjs/mongoose';
447
+ import { ${entityNameCapitalized}, ${entityNameCapitalized}Schema } from '${entityPath}/domain/entities/${entityNameLower}.schema';`;
448
+ importsBlock.push(
449
+ `MongooseModule.forFeature([{ name: ${entityNameCapitalized}.name, schema: ${entityNameCapitalized}Schema }])`
450
+ );
400
451
  }
401
452
 
453
+ // Ajoute l'import du service
454
+ extraImports += `\nimport { ${entityNameCapitalized}Service } from '${entityPath}/infrastructure/services/${entityNameLower}.service';`;
455
+
402
456
  // Always necessary providers
403
457
  providersBlock.push(
404
458
  `{
405
- provide: 'I${entityNameCapitalized}Repository',
406
- useClass: ${entityNameCapitalized}Repository,
407
- }`,
459
+ provide: 'I${entityNameCapitalized}Repository',
460
+ useClass: ${entityNameCapitalized}Repository,
461
+ }`,
462
+ `${entityNameCapitalized}Service`,
408
463
  `${entityNameCapitalized}Repository`,
409
464
  `Create${entityNameCapitalized}UseCase`,
410
465
  `Update${entityNameCapitalized}UseCase`,
@@ -424,6 +479,7 @@ export class ${entityNameCapitalized}Adapter {
424
479
  * - Repository
425
480
  * - Use Cases
426
481
  * - Mapper
482
+ * - Service
427
483
  */
428
484
  import { Module } from '@nestjs/common';
429
485
  ${extraImports}
@@ -446,6 +502,9 @@ import { ${entityNameCapitalized}Mapper } from '${entityPath}/domain/mappers/${e
446
502
  providers: [
447
503
  ${providersBlock.join(",\n ")}
448
504
  ],
505
+ exports: [
506
+ ${entityNameCapitalized}Service, 'I${entityNameCapitalized}Repository'
507
+ ]
449
508
  })
450
509
  export class ${entityNameCapitalized}Module {}
451
510
  `.trim(),
@@ -453,7 +512,8 @@ export class ${entityNameCapitalized}Module {}
453
512
 
454
513
  await safeUpdateAppModule(entityNameLower);
455
514
  }
456
- await generateMiddlewares();
515
+
516
+ await generateMiddlewares(dbConfig.orm);
457
517
 
458
518
  // modification de AppModule
459
519
  const appModulePath = "src/app.module.ts";
@@ -477,6 +537,8 @@ import { APP_INTERCEPTOR } from '@nestjs/core';`,
477
537
  useClass: ResponseInterceptor,
478
538
  },`,
479
539
  });
540
+
541
+ logSuccess(`structure generé avec succes !`);
480
542
  } catch (error) {
481
543
  logError(`process currency have error: ${error}`);
482
544
  }
@@ -39,7 +39,7 @@ DB_DATABASE=${dbConfig.POSTGRES_DB}
39
39
  TypeOrmModule.forRoot({
40
40
  type: 'postgres',
41
41
  host: process.env.DB_HOST,
42
- port: process.env.DB_PORT ? parseInt(process.env.DB_PORT, 10) : 3000,
42
+ port: process.env.DB_PORT ? parseInt(process.env.DB_PORT, 10) : 5432,
43
43
  username: process.env.DB_USERNAME,
44
44
  password: process.env.DB_PASSWORD,
45
45
  database: process.env.DB_DATABASE,
@@ -21,7 +21,7 @@ async function createProject(inputs) {
21
21
  // installation des dependances
22
22
  logInfo("Installation des dépendances...");
23
23
  await runCommand(
24
- `${inputs.packageManager} add @nestjs/config @nestjs/typeorm typeorm pg class-validator class-transformer`,
24
+ `${inputs.packageManager} add @nestjs/config class-validator class-transformer`,
25
25
  "Échec de l'installation des dépendances"
26
26
  );
27
27
  }
@@ -12,11 +12,11 @@ async function setupAuth(inputs) {
12
12
  const useSwagger = inputs.useSwagger;
13
13
 
14
14
  await runCommand(
15
- `npm install @nestjs/jwt @nestjs/passport passport passport-jwt bcrypt`,
15
+ `npm install @nestjs/jwt @nestjs/passport passport passport-jwt bcrypt uuid`,
16
16
  "Échec de l'installation des dépendances d'authentification"
17
17
  );
18
18
  await runCommand(
19
- `npm install -D @types/passport-jwt @types/bcrypt`,
19
+ `npm install -D @types/passport-jwt @types/bcrypt @types/uuid`,
20
20
  "Échec de l'installation des dépendances de dev"
21
21
  );
22
22
 
@@ -34,53 +34,65 @@ async function setupAuth(inputs) {
34
34
  await createDirectory(path);
35
35
  });
36
36
 
37
- const importsArray = [
38
- dbConfig.orm === "typeorm" ? `TypeOrmModule.forFeature([User])` : null,
39
- `PassportModule`,
40
- `JwtModule.register({ secret: 'your-secret-key', signOptions: { expiresIn: '1h' } })`,
41
- ]
42
- .filter(Boolean)
43
- .join(",\n ");
44
-
45
- const typeormImports =
46
- dbConfig.orm === "typeorm"
47
- ? `import { TypeOrmModule } from '@nestjs/typeorm';
48
- import { User } from 'src/entities/User.entity';`
49
- : "";
37
+ let ormImports = "";
38
+ let ormModuleImport = "";
39
+ let prismaProvider = ""; // Pour n'ajouter PrismaService que si besoin
40
+
41
+ if (dbConfig.orm === "typeorm") {
42
+ ormImports = `import { TypeOrmModule } from '@nestjs/typeorm';
43
+ import { User } from 'src/entities/User.entity';`;
44
+ ormModuleImport = `TypeOrmModule.forFeature([User])`;
45
+ } else if (dbConfig.orm === "mongoose") {
46
+ ormImports = `import { MongooseModule } from '@nestjs/mongoose';
47
+ import { User, UserSchema } from 'src/user/domain/entities/user.schema';`;
48
+ ormModuleImport = `MongooseModule.forFeature([{ name: User.name, schema: UserSchema }])`;
49
+ prismaProvider = ""; // Ne pas ajouter PrismaService
50
+ } else if (dbConfig.orm === "prisma") {
51
+ ormImports = "";
52
+ ormModuleImport = "";
53
+ prismaProvider = "PrismaService,";
54
+ }
50
55
 
51
56
  await createFile({
52
57
  path: `${authPath}/auth.module.ts`,
53
- contente: `import { Module } from '@nestjs/common';
54
- import { JwtModule } from '@nestjs/jwt';
58
+ contente: `
59
+ import { Module } from '@nestjs/common';
60
+ import { JwtModule, JwtService } from '@nestjs/jwt';
55
61
  import { PassportModule } from '@nestjs/passport';
56
- import { UserMapper } from 'src/user/domain/mappers/user.mapper';
57
- ${typeormImports}
62
+ // import { UserMapper } from 'src/user/domain/mappers/user.mapper';
63
+ ${ormImports}
58
64
  import { AuthService } from '${authPaths.authServicesPath}/auth.service';
59
- import { PrismaService } from 'src/prisma/prisma.service';
60
- import { AuthController } from '${authPaths.authControllersPath}/auth.controller';
65
+ ${
66
+ dbConfig.orm === "prisma"
67
+ ? "import { PrismaService } from 'src/prisma/prisma.service';"
68
+ : ""
69
+ }
70
+ import { AuthController } from '${
71
+ authPaths.authControllersPath
72
+ }/auth.controller';
73
+ import { UserModule } from 'src/user/user.module';
61
74
  import { JwtStrategy } from '${authPaths.authStrategyPath}/jwt.strategy';
62
75
  import { AuthGuard } from '${authPaths.authGuardsPath}/auth.guard';
63
- import { UserRepository } from 'src/user/infrastructure/repositories/user.repository';
64
76
 
65
77
  @Module({
66
78
  imports: [
67
- ${importsArray}
79
+ UserModule,
80
+ ${ormModuleImport},
81
+ PassportModule,
82
+ JwtModule.register({ secret: 'your-secret-key', signOptions: { expiresIn: '1h' } }),
68
83
  ],
69
84
  controllers: [AuthController],
70
85
  providers: [
71
- PrismaService,
72
- UserMapper,
73
- {
74
- provide: 'IUserRepository',
75
- useClass: UserRepository,
76
- },
86
+ ${prismaProvider}
77
87
  AuthService,
78
88
  JwtStrategy,
79
- AuthGuard
89
+ AuthGuard,
90
+ JwtService
80
91
  ],
81
92
  exports: [AuthService],
82
93
  })
83
- export class AuthModule {}`,
94
+ export class AuthModule {}
95
+ `.trim(),
84
96
  });
85
97
 
86
98
  // 📌 Auth Service
@@ -1,6 +1,7 @@
1
1
  const { logInfo } = require("../loggers/logInfo");
2
2
  const { runCommand } = require("../shell");
3
3
  const { setupTypeORM } = require("./orms/typeOrmSetup");
4
+ const { setupMongoose } = require("./setupMongoose");
4
5
  const { setupPrisma } = require("./setupPrisma");
5
6
 
6
7
  async function setupDatabase(inputs) {
@@ -36,8 +37,7 @@ async function setupDatabase(inputs) {
36
37
  }
37
38
  async function setupMongoDB(inputs) {
38
39
  logInfo("Configuration de MongoDB...");
39
- // Appelle un script spécifique à MongoDB
40
- // await setupMongoDBConfig(inputs);
40
+ await setupMongoose(inputs);
41
41
  }
42
42
  async function setupSQLite(inputs) {
43
43
  logInfo("Configuration de SQLite...");
@@ -0,0 +1,45 @@
1
+ const { execSync } = require("child_process");
2
+ const path = require("path");
3
+ const { createFile, updateFile } = require("../userInput");
4
+ const { logSuccess } = require("../loggers/logSuccess");
5
+ const { logInfo } = require("../loggers/logInfo");
6
+
7
+ async function setupMongoose(inputs) {
8
+ logInfo("📦 Installation de Mongoose et @nestjs/mongoose...");
9
+ execSync("npm install @nestjs/mongoose mongoose", { stdio: "inherit" });
10
+
11
+ // Génération du fichier .env
12
+ const envContent = `
13
+ MONGO_URI=${inputs.dbConfig.MONGO_URI}
14
+ MONGO_DB=${inputs.dbConfig.MONGO_DB}
15
+ `.trim();
16
+ await createFile({ path: ".env", contente: envContent });
17
+
18
+ // Ajout de l'import et de la configuration Mongoose dans app.module.ts
19
+ const appModulePath = path.join("src", "app.module.ts");
20
+ const mongooseImport = `import { MongooseModule } from '@nestjs/mongoose';`;
21
+
22
+ // Ajoute l'import si absent
23
+ await updateFile({
24
+ path: appModulePath,
25
+ pattern: /import {[\s\S]*?} from '@nestjs\/config';/,
26
+ replacement: (match) => `${match}\n${mongooseImport}`,
27
+ });
28
+
29
+ // Ajoute la configuration MongooseModule dans les imports
30
+ const importsPattern =
31
+ /imports:\s*\[[\s\S]*?ConfigModule\.forRoot\([\s\S]*?\),/;
32
+ await updateFile({
33
+ path: appModulePath,
34
+ pattern: importsPattern,
35
+ replacement: (match) =>
36
+ `${match}
37
+ MongooseModule.forRoot(process.env.MONGO_URI || " ", {
38
+ dbName: process.env.MONGO_DB,
39
+ }),`,
40
+ });
41
+
42
+ logSuccess("Mongoose configuré et injecté dans app.module.ts !");
43
+ }
44
+
45
+ module.exports = { setupMongoose };