import 'reflect-metadata'; import { Logger, ValidationPipe } from '@nestjs/common'; import { NestFactory } from '@nestjs/core'; import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { json, urlencoded } from 'express'; import { AppModule } from './app.module'; import { validateAppEnv } from './infra/config/env'; import { loadEnv } from './infra/config/load-env'; async function bootstrap() { loadEnv(); validateAppEnv(); const app = await NestFactory.create(AppModule, { bodyParser: false }); const frontendUrl = process.env.FRONTEND_URL || 'http://localhost:3000'; const allowedOrigins = new Set( frontendUrl .split(',') .map((origin) => origin.trim()) .filter(Boolean), ); allowedOrigins.add('http://localhost:3000'); allowedOrigins.add('http://localhost:5173'); const port = Number(process.env.PORT || process.env.BACKEND_PORT || 3001); const requestBodyLimit = process.env.REQUEST_BODY_LIMIT || '25mb'; app.use(json({ limit: requestBodyLimit })); app.use(urlencoded({ extended: true, limit: requestBodyLimit })); app.useGlobalPipes( new ValidationPipe({ forbidNonWhitelisted: true, transform: true, whitelist: true, }), ); app.enableCors({ origin(origin, callback) { if (!origin || allowedOrigins.has(origin)) { callback(null, true); return; } Logger.warn(`Origem CORS bloqueada: ${origin}`, 'Cors'); callback(null, false); }, credentials: true, }); const swaggerConfig = new DocumentBuilder() .setTitle('Omnichannel Backend API') .setDescription('Documentacao das rotas da API do Omnichannel Sothis.') .setVersion('1.0.0') .addBearerAuth() .build(); const swaggerDocument = SwaggerModule.createDocument(app, swaggerConfig); SwaggerModule.setup('docs', app, swaggerDocument, { jsonDocumentUrl: 'docs/openapi.json', }); await app.listen(port); Logger.log(`Backend ouvindo na porta ${port}`, 'Bootstrap'); Logger.log(`Swagger disponivel em /docs`, 'Bootstrap'); } bootstrap();