import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; import { ValidationPipe } from '@nestjs/common'; import { TransformInterceptor } from './presentation/interceptors/transform.interceptor'; import { PrismaService } from './infrastructure/database/prisma.service'; import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger'; //import { RedocModule } from 'nestjs-redoc'; import { FastifyAdapter, NestFastifyApplication, } from '@nestjs/platform-fastify'; async function bootstrap() { const app = await NestFactory.create( AppModule, new FastifyAdapter({ logger: true, }), ); // swagger document const config = new DocumentBuilder() .setTitle('DabidjanApp') .setDescription('DabidjanApp API description') .setVersion('1.0') .addTag('Transport') .addServer('/api') .addBearerAuth( { type: 'http', scheme: 'bearer', bearerFormat: 'JWT', name: 'JWT', description: 'Entrez votre token JWT', in: 'header', }, 'access-token', ) .build(); const document = SwaggerModule.createDocument(app, config, { ignoreGlobalPrefix: false, }); SwaggerModule.setup('api-docs', app, document); // Get Prisma Service const prismaService = app.get(PrismaService); app.useGlobalPipes( new ValidationPipe({ whitelist: true, // Cette option filtre automatiquement les propriétés qui n'ont pas de décorateurs de validation dans votre DTO transform: true, // Cette option transforme automatiquement les données entrantes en les convertissant en types appropriés forbidNonWhitelisted: true, // Cette option empêche l'utilisation de propriétés non autorisées dans la requête }), ); app.enableCors({ origin: '*', // ou '*' en développement methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization'], credentials: true, // si tu utilises les cookies ou des sessions }); app.useGlobalInterceptors(new TransformInterceptor()); app.setGlobalPrefix('api'); // Try to connect to database with retries let retries = 5; while (retries > 0) { try { // eslint-disable-next-line @typescript-eslint/no-unsafe-call await prismaService.$connect(); console.log('Successfully connected to database'); break; // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (error) { console.log(`Failed to connect to database. Retries left: ${retries}`); retries -= 1; await new Promise((resolve) => setTimeout(resolve, 5000)); // Wait 5 seconds before retry } } await app.listen(3000, '0.0.0.0'); console.log(`Application is running on: ${await app.getUrl()}`); } void bootstrap();