import express from 'express'; import helmet from 'helmet'; import cors from 'cors'; import compression from 'compression'; import cookieParser from 'cookie-parser'; import morgan from 'morgan'; import swaggerUi from 'swagger-ui-express'; import swaggerSpec from './src/shared/config/swagger.config.js'; import { errorMiddleware } from './src/shared/middleware/error.middleware.js'; import registerRoutes from './src/features/index.js'; import { buildContext } from './src/shared/middleware/context.middleware.js'; const app = express(); // Middlewares app.use(helmet({ crossOriginResourcePolicy: { policy: 'cross-origin' }, })); app.use(cors({ origin: process.env.CORS_ORIGIN ? (process.env.CORS_ORIGIN.includes(',') ? process.env.CORS_ORIGIN.split(',') : process.env.CORS_ORIGIN) : '*', methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'PATCH'], allowedHeaders: ['Content-Type', 'Authorization', 'Accept', 'X-Requested-With'] })); app.use(compression()); app.use(cookieParser()); app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use(buildContext); if (process.env.NODE_ENV !== 'test') { app.use(morgan('dev')); } // Swagger setup app.use('/api/docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec)); // Base Health Check app.get('/health', (req, res) => { res.status(200).json({ status: 'OK', timestamp: new Date() }); }); // Centralized Feature Router Loader app.use('/uploads', express.static('uploads', { setHeaders: (res) => { res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin'); res.setHeader('Access-Control-Allow-Origin', '*'); } })); registerRoutes(app); // Global Error Handler app.use(errorMiddleware); export default app;