84 lines
2.5 KiB
JavaScript
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;
|
|
|