import { NestFactory } from '@nestjs/core'; import { ValidationPipe, Logger } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger'; import * as cookieParser from 'cookie-parser'; import helmet from 'helmet'; import { AppModule } from './app.module'; async function bootstrap() { const logger = new Logger('Bootstrap'); const app = await NestFactory.create(AppModule); const configService = app.get(ConfigService); const port = configService.get('app.port') || 3000; const frontendUrl = configService.get('app.frontendUrl') || 'http://localhost:5173'; const corsOrigins = configService.get('app.corsOrigins') || [frontendUrl]; // Security app.use(helmet()); app.use(cookieParser()); // CORS app.enableCors({ origin: corsOrigins, credentials: true, methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'], allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With'], }); // Global Validation Pipe app.useGlobalPipes( new ValidationPipe({ whitelist: true, forbidNonWhitelisted: true, transform: true, transformOptions: { enableImplicitConversion: true, }, }), ); // API Prefix app.setGlobalPrefix('api/v1'); // Swagger Documentation const swaggerConfig = new DocumentBuilder() .setTitle('Finance App API') .setDescription(` ## API для управления личными финансами ### Основные возможности: - **Аутентификация**: Регистрация, вход, JWT токены в HTTP-only cookies - **Транзакции**: CRUD операции, фильтрация, аналитика - **Категории**: Стандартные и пользовательские категории - **Бюджеты**: Правило 50/30/20, отслеживание расходов - **AI рекомендации**: Персонализированные советы (Phase 2) ### Безопасность: - JWT токены в HTTP-only cookies - Rate limiting - Защита от XSS и CSRF ### Локализация: - Все сообщения об ошибках на русском языке - Поддержка рублей (RUB) - Московский часовой пояс (UTC+3) `) .setVersion('1.0') .addTag('Аутентификация', 'Регистрация, вход, управление сессиями') .addTag('Транзакции', 'Управление доходами и расходами') .addTag('Категории', 'Категории транзакций') .addTag('Бюджеты (50/30/20)', 'Планирование бюджета по правилу 50/30/20') .addBearerAuth() .addCookieAuth('access_token') .build(); const document = SwaggerModule.createDocument(app, swaggerConfig); SwaggerModule.setup('api/docs', app, document, { swaggerOptions: { persistAuthorization: true, tagsSorter: 'alpha', operationsSorter: 'alpha', }, customSiteTitle: 'Finance App API - Документация', }); // Health check endpoint app.getHttpAdapter().get('/health', (req, res) => { res.status(200).json({ status: 'ok', timestamp: new Date().toISOString(), }); }); await app.listen(port); logger.log(`🚀 Application is running on: http://localhost:${port}`); logger.log(`📚 Swagger documentation: http://localhost:${port}/api/docs`); logger.log(`🏥 Health check: http://localhost:${port}/health`); } bootstrap();