import express from 'express'; import cors from 'cors'; import helmet from 'helmet'; import morgan from 'morgan'; import rateLimit from 'express-rate-limit'; import path from 'path'; import config from './config'; import logger from './config/logger'; import routes from './routes'; import { errorHandler, notFoundHandler } from './middleware/errorHandler'; const app = express(); // Crear directorio de logs si no existe const fs = require('fs'); const logsDir = path.join(__dirname, '../logs'); if (!fs.existsSync(logsDir)) { fs.mkdirSync(logsDir); } // Middleware de seguridad app.use(helmet()); // CORS app.use(cors({ origin: config.FRONTEND_URL, credentials: true, })); // Rate limiting const limiter = rateLimit({ windowMs: config.RATE_LIMIT.WINDOW_MS, max: config.RATE_LIMIT.MAX_REQUESTS, message: { success: false, message: 'Demasiadas peticiones, por favor intenta más tarde', }, }); app.use('/api/', limiter); // Logging HTTP app.use(morgan('combined', { stream: { write: (message: string) => logger.info(message.trim()), }, })); // Parsing de body app.use(express.json({ limit: '10mb' })); app.use(express.urlencoded({ extended: true })); // Rutas API app.use('/api/v1', routes); // Ruta raíz app.get('/', (_req, res) => { res.json({ success: true, message: '🎾 API de Canchas de Pádel', version: '1.0.0', docs: '/api/v1/health', }); }); // Handler de rutas no encontradas app.use(notFoundHandler); // Handler de errores global app.use(errorHandler); export default app;