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.
- package/package.json +1 -1
- package/unutils.txt +397 -216
- package/utils/configs/configureDocker.js +1 -1
- package/utils/configs/setupCleanArchitecture.js +181 -119
- package/utils/setups/orms/typeOrmSetup.js +1 -1
- package/utils/setups/projectSetup.js +1 -1
- package/utils/setups/setupAuth.js +43 -31
- package/utils/setups/setupDatabase.js +2 -2
- package/utils/setups/setupMongoose.js +45 -0
- package/utils/setups/setupPrisma.js +113 -21
- package/utils/userInput.js +128 -225
- package/utils/utils.js +571 -165
|
@@ -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 ${
|
|
132
|
+
* Use Case pour créer un ${entityName}.
|
|
124
133
|
*/
|
|
125
|
-
import { Inject } from '@nestjs/common';
|
|
126
|
-
import { Create${
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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${
|
|
136
|
-
private readonly ${
|
|
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${
|
|
142
|
-
|
|
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 ${
|
|
164
|
+
* Use Case pour récupérer un ${entityName} par son ID.
|
|
150
165
|
*/
|
|
151
|
-
import { Inject } from '@nestjs/common';
|
|
152
|
-
import { I${
|
|
153
|
-
|
|
154
|
-
|
|
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${
|
|
159
|
-
private readonly ${
|
|
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
|
-
|
|
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 ${
|
|
195
|
+
* Use Case pour récupérer tous les ${entityName}s.
|
|
173
196
|
*/
|
|
174
|
-
import { Inject } from '@nestjs/common';
|
|
175
|
-
import { I${
|
|
176
|
-
|
|
177
|
-
|
|
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${
|
|
182
|
-
private readonly ${
|
|
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
|
-
|
|
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 ${
|
|
226
|
+
* Use Case pour mettre à jour un ${entityName} existant.
|
|
196
227
|
*/
|
|
197
|
-
import { Inject } from '@nestjs/common';
|
|
198
|
-
import { Update${
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
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${
|
|
208
|
-
private readonly ${
|
|
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${
|
|
214
|
-
|
|
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 ${
|
|
265
|
+
* Use Case pour supprimer un ${entityName}.
|
|
222
266
|
*/
|
|
223
|
-
import { Inject } from '@nestjs/common';
|
|
224
|
-
import { I${
|
|
225
|
-
|
|
226
|
-
|
|
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${
|
|
231
|
-
private readonly ${
|
|
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
|
-
|
|
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/${
|
|
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
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
import {
|
|
300
|
-
import {
|
|
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
|
-
|
|
305
|
-
private readonly
|
|
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
|
-
|
|
309
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
339
|
-
|
|
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
|
-
|
|
406
|
-
|
|
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
|
-
|
|
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) :
|
|
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
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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: `
|
|
54
|
-
import {
|
|
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
|
-
${
|
|
62
|
+
// import { UserMapper } from 'src/user/domain/mappers/user.mapper';
|
|
63
|
+
${ormImports}
|
|
58
64
|
import { AuthService } from '${authPaths.authServicesPath}/auth.service';
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 };
|