Files
oldvine_cms/index.js
yotakii 13a004fa40 edit
2026-01-13 16:08:18 +03:00

155 lines
4.4 KiB
JavaScript

require("dotenv").config();
const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');
const helmet = require('helmet');
const rateLimit = require('express-rate-limit');
const compression = require('compression');
const morgan = require('morgan');
const path = require('path');
require('dotenv').config();
// Import routes
const authRoutes = require('./routes/auth');
const roomRoutes = require('./routes/rooms');
const bookingRoutes = require('./routes/bookings');
const guestRoutes = require('./routes/guests');
const paymentRoutes = require('./routes/payments');
const adminRoutes = require('./routes/admin');
const integrationRoutes = require('./routes/integrations');
const contactRoutes = require('./routes/contact');
const galleryRoutes = require('./routes/gallery');
const contentRoutes = require('./routes/content');
const blogRoutes = require('./routes/blog');
const mediaRoutes = require('./routes/media');
const settingsRoutes = require('./routes/settings');
const uploadRoutes = require('./routes/upload');
const roomCategoryRoutes = require('./routes/roomCategories');
const galleryCategoryRoutes = require('./routes/galleryCategories');
// Import middleware
const errorHandler = require('./middleware/errorHandler');
const logger = require('./utils/logger');
const app = express();
const PORT = process.env.PORT || 5080;
app.set('trust proxy', 1);
// Security middleware
app.use(helmet());
app.use(compression());
// Rate limiting
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100, // limit each IP to 100 requests per windowMs
message: 'Too many requests from this IP, please try again later.',
});
app.use('/api/', limiter);
// CORS configuration
app.use(cors({
origin: process.env.CLIENT_URL || 'http://localhost:3060',
credentials: true,
}));
// Body parsing middleware
app.use(express.json({ limit: '10mb' }));
app.use(express.urlencoded({ extended: true, limit: '10mb' }));
// Logging
if (process.env.NODE_ENV !== 'test') {
app.use(morgan('combined', { stream: { write: message => logger.info(message.trim()) } }));
}
app.use('/uploads', express.static(path.join(__dirname, 'uploads')));
// Database connection
console.log('MONGODB_URI:', process.env.MONGODB_URI);
mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost:27017/oldvinehotel', {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then(() => {
logger.info('Connected to MongoDB');
})
.catch((error) => {
logger.error('MongoDB connection error:', error);
});
// Health check endpoint
app.get('/health', (req, res) => {
res.status(200).json({
status: 'OK',
timestamp: new Date().toISOString(),
uptime: process.uptime(),
version: process.env.npm_package_version || '1.0.0'
});
});
// API routes
app.use('/api/auth', authRoutes);
app.use('/api/rooms', roomRoutes);
app.use('/api/room-categories', roomCategoryRoutes);
app.use('/api/gallery-categories', galleryCategoryRoutes);
app.use('/api/bookings', bookingRoutes);
app.use('/api/guests', guestRoutes);
app.use('/api/payments', paymentRoutes);
app.use('/api/admin', adminRoutes);
app.use('/api/integrations', integrationRoutes);
app.use('/api/contact', contactRoutes);
app.use('/api/gallery', galleryRoutes);
app.use('/api/content', contentRoutes);
app.use('/api/blog', blogRoutes);
app.use('/api/media', mediaRoutes);
app.use('/api/settings', settingsRoutes);
app.use('/api/upload', uploadRoutes);
// Welcome route
app.get('/', (req, res) => {
res.json({
message: 'Welcome to The Old Vine Hotel API',
version: '1.0.0',
documentation: '/api/docs',
endpoints: {
rooms: '/api/rooms',
bookings: '/api/bookings',
auth: '/api/auth',
payments: '/api/payments',
integrations: '/api/integrations'
}
});
});
// Error handling middleware
app.use(errorHandler);
// 404 handler
app.use('*', (req, res) => {
res.status(404).json({
success: false,
message: 'Route not found',
path: req.originalUrl
});
});
// Graceful shutdown
process.on('SIGTERM', () => {
logger.info('SIGTERM received, shutting down gracefully');
mongoose.connection.close(() => {
logger.info('Database connection closed');
process.exit(0);
});
});
if (process.env.NODE_ENV !== 'test') {
app.listen(PORT, () => {
logger.info(`Server running on port ${PORT}`);
logger.info(`Environment: ${process.env.NODE_ENV || 'development'}`);
});
}
module.exports = app;