image_tagger/src/server.js
2025-11-03 13:22:29 +05:30

84 lines
2.5 KiB
JavaScript

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;