main.ts 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import { NestFactory } from '@nestjs/core';
  2. import { AppModule } from './app.module';
  3. import { ValidationPipe } from '@nestjs/common';
  4. import { TransformInterceptor } from './presentation/interceptors/transform.interceptor';
  5. import { PrismaService } from './infrastructure/database/prisma.service';
  6. import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
  7. //import { RedocModule } from 'nestjs-redoc';
  8. import {
  9. FastifyAdapter,
  10. NestFastifyApplication,
  11. } from '@nestjs/platform-fastify';
  12. async function bootstrap() {
  13. const app = await NestFactory.create<NestFastifyApplication>(
  14. AppModule,
  15. new FastifyAdapter({
  16. logger: true,
  17. }),
  18. );
  19. // swagger document
  20. const config = new DocumentBuilder()
  21. .setTitle('DabidjanApp')
  22. .setDescription('DabidjanApp API description')
  23. .setVersion('1.0')
  24. .addTag('Transport')
  25. .addServer('/api')
  26. .addBearerAuth(
  27. {
  28. type: 'http',
  29. scheme: 'bearer',
  30. bearerFormat: 'JWT',
  31. name: 'JWT',
  32. description: 'Entrez votre token JWT',
  33. in: 'header',
  34. },
  35. 'access-token',
  36. )
  37. .build();
  38. const document = SwaggerModule.createDocument(app, config, {
  39. ignoreGlobalPrefix: false,
  40. });
  41. SwaggerModule.setup('api-docs', app, document);
  42. // Get Prisma Service
  43. const prismaService = app.get(PrismaService);
  44. app.useGlobalPipes(
  45. new ValidationPipe({
  46. whitelist: true, // Cette option filtre automatiquement les propriétés qui n'ont pas de décorateurs de validation dans votre DTO
  47. transform: true, // Cette option transforme automatiquement les données entrantes en les convertissant en types appropriés
  48. forbidNonWhitelisted: true, // Cette option empêche l'utilisation de propriétés non autorisées dans la requête
  49. }),
  50. );
  51. app.enableCors({
  52. origin: '*', // ou '*' en développement
  53. methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'],
  54. allowedHeaders: ['Content-Type', 'Authorization'],
  55. credentials: true, // si tu utilises les cookies ou des sessions
  56. });
  57. app.useGlobalInterceptors(new TransformInterceptor());
  58. app.setGlobalPrefix('api');
  59. // Try to connect to database with retries
  60. let retries = 5;
  61. while (retries > 0) {
  62. try {
  63. // eslint-disable-next-line @typescript-eslint/no-unsafe-call
  64. await prismaService.$connect();
  65. console.log('Successfully connected to database');
  66. break;
  67. // eslint-disable-next-line @typescript-eslint/no-unused-vars
  68. } catch (error) {
  69. console.log(`Failed to connect to database. Retries left: ${retries}`);
  70. retries -= 1;
  71. await new Promise((resolve) => setTimeout(resolve, 5000)); // Wait 5 seconds before retry
  72. }
  73. }
  74. await app.listen(3000, '0.0.0.0');
  75. console.log(`Application is running on: ${await app.getUrl()}`);
  76. }
  77. void bootstrap();