require('dotenv').config(); const express = require('express'); const cors = require('cors'); const helmet = require('helmet'); const compression = require('compression'); const morgan = require('morgan'); // Import middleware and routes const corsConfig = require('./infrastructure/config/corsConfig'); const container = require('./infrastructure/config/dependencyContainer'); const createImageRoutes = require('./presentation/routes/imageRoutes'); const ImageTaggingController = require('./presentation/controllers/ImageTaggingController'); const ApiKeyAuthMiddleware = require('./presentation/middleware/apiKeyAuth'); const errorHandler = require('./presentation/middleware/errorHandler'); const requestIdMiddleware = require('./presentation/middleware/requestId'); const logger = require('./shared/utils/logger'); const app = express(); const PORT = process.env.PORT || 3000; // Middleware app.use(helmet()); app.use(compression()); app.use(cors(corsConfig)); app.use(express.json({ limit: '10mb' })); app.use(express.urlencoded({ extended: true, limit: '10mb' })); app.use(requestIdMiddleware); app.use(morgan('combined')); // Root app.get('/', (req, res) => { res.json({ service: 'Property Image Tagging API', version: '1.0.0', authentication: 'Simple API Key' }); }); // Dependency injection const tagImageUseCase = container.get('tagImageUseCase'); const tagBase64ImageUseCase = container.get('tagBase64ImageUseCase'); const tagBatchImagesUseCase = container.get('tagBatchImagesUseCase'); const tagBatchBase64ImagesUseCase = container.get('tagBatchBase64ImagesUseCase'); const imageRepository = container.get('imageRepository'); const apiKeyRepository = container.get('apiKeyRepository'); const imageController = new ImageTaggingController( tagImageUseCase, tagBase64ImageUseCase, tagBatchImagesUseCase, tagBatchBase64ImagesUseCase, imageRepository, logger ); const authMiddleware = new ApiKeyAuthMiddleware(apiKeyRepository, logger); // Routes const imageRoutes = createImageRoutes(imageController, authMiddleware); app.use('/api/images', imageRoutes); // Error handler (last) app.use(errorHandler); // Graceful shutdown const gracefulShutdown = async (signal) => { logger.info(`${signal} received, shutting down`); await container.close(); process.exit(0); }; process.on('SIGTERM', () => gracefulShutdown('SIGTERM')); process.on('SIGINT', () => gracefulShutdown('SIGINT')); // Start if (process.env.NODE_ENV !== 'test') { app.listen(PORT, () => { logger.info(`Server running on port ${PORT}`); }); } module.exports = app;