diff --git a/src/server.js b/src/server.js index e1c7078..3271976 100644 --- a/src/server.js +++ b/src/server.js @@ -1,149 +1,366 @@ -require('dotenv').config(); -// import uploadRoutes from "./routes/upload.routes"; -const uploadRoutes = require('./routes/upload.routes'); +// require('dotenv').config(); +// // import uploadRoutes from "./routes/upload.routes"; +// const uploadRoutes = require('./routes/upload.routes'); -const express = require('express'); -const cors = require('cors'); -const helmet = require('helmet'); -const morgan = require('morgan'); -const cookieParser = require('cookie-parser'); +// const express = require('express'); +// const cors = require('cors'); +// const helmet = require('helmet'); +// const morgan = require('morgan'); +// const cookieParser = require('cookie-parser'); +// const { +// initializeDatabases, +// closeDatabaseConnections, +// } = require('./config/database'); +// const { errorHandler, notFound } = require('./middleware/errorHandler'); + +// const app = express(); +// const PORT = process.env.PORT || 3000; + +// // Security middleware +// app.use( +// helmet({ +// contentSecurityPolicy: false, // Disable for API +// crossOriginEmbedderPolicy: false, +// }) +// ); + +// const allowedOrigins = process.env.CORS_ORIGIN +// ? process.env.CORS_ORIGIN.split(',').map(origin => origin.trim()) +// : []; + +// const corsOptions = { +// origin: function (origin, callback) { +// // Allow requests with no origin (like Postman, mobile apps) +// if (!origin) return callback(null, true); + +// if (allowedOrigins.includes(origin)) { +// callback(null, true); +// } else { +// callback(new Error('Not allowed by CORS')); +// } +// }, +// credentials: true, +// methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'], +// allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With'], +// }; + + +// app.use(cors(corsOptions)); + +// // Body parsing middleware +// app.use(express.json({ limit: '10mb' })); +// app.use(express.urlencoded({ extended: true, limit: '10mb' })); +// app.use(cookieParser()); + +// // Logging middleware +// if (process.env.NODE_ENV !== 'test') { +// app.use(morgan('combined')); +// } + +// // Health check endpoint +// app.get('/health', async (req, res) => { +// try { +// res.status(200).json({ +// status: 'SUCCESS', +// message: 'Vaishnavi Creation API is running successfully 🚀', +// service: 'vaishnavi-backend', +// version: '1.0.0', +// environment: process.env.NODE_ENV, +// timestamp: new Date().toISOString(), +// uptime_seconds: process.uptime(), +// memory_usage: process.memoryUsage().rss, // RAM usage +// }); +// } catch (error) { +// res.status(500).json({ +// status: 'ERROR', +// message: 'Health check failed', +// error: error.message, +// }); +// } +// }); + +// // API Routes +// app.use('/api/auth', require('./routes/auth')); +// app.use('/api/users', require('./routes/users')); +// app.use('/api/products', require('./routes/products')); +// app.use('/api/orders', require('./routes/orders')); +// app.use('/api/wardrobe', require('./routes/wardrobe')); +// app.use('/api/delivery', require('./routes/deliveryRoutes')); +// app.use('/api/coupons', require('./routes/couponRoutes')); +// app.use('/api/admin', require('./routes/admin')); + +// app.use('/api/admin/reports', require('./routes/reports')); +// app.use('/api/payments', require('./routes/paymentRoutes')); +// // Upload route +// app.use('/api', uploadRoutes); + +// // Root endpoint +// app.get('/', (req, res) => { +// res.json({ +// message: 'Vaishnavi Creation API', +// version: '1.0.0', +// documentation: '/api/docs', +// health: '/health', +// }); +// }); + +// // Error handling middleware (must be last) +// app.use(notFound); +// app.use(errorHandler); + +// // Graceful shutdown +// process.on('SIGTERM', async () => { +// console.log('SIGTERM received, shutting down gracefully'); +// await closeDatabaseConnections(); +// process.exit(0); +// }); + +// process.on('SIGINT', async () => { +// console.log('SIGINT received, shutting down gracefully'); +// await closeDatabaseConnections(); +// process.exit(0); +// }); + +// // Start server +// const startServer = async () => { +// try { +// // Initialize database connections +// await initializeDatabases(); + +// // Start the server +// app.listen(PORT, () => { +// console.log(`🚀 Server running on port ${PORT}`); +// console.log(`📚 API Documentation: http://localhost:${PORT}/api/docs`); +// console.log(`🏥 Health Check: http://localhost:${PORT}/health`); +// console.log(`🌍 Environment: ${process.env.NODE_ENV}`); +// }); +// } catch (error) { +// console.error('❌ Failed to start server:', error); +// process.exit(1); +// } +// }; + +// // Only start server if this file is run directly +// if (require.main === module) { +// startServer(); +// } + +// module.exports = app; + + + + + + +require("dotenv").config({ + path: require("path").resolve(__dirname, "../.env"), +}); + +const path = require("path"); +const express = require("express"); +const cors = require("cors"); +const helmet = require("helmet"); +const morgan = require("morgan"); +const cookieParser = require("cookie-parser"); + +// Routes +const uploadRoutes = require(path.join(__dirname, "routes/upload.routes")); + +// Database const { initializeDatabases, closeDatabaseConnections, -} = require('./config/database'); -const { errorHandler, notFound } = require('./middleware/errorHandler'); +} = require(path.join(__dirname, "config/database")); + +// Middleware +const { + errorHandler, + notFound, +} = require(path.join(__dirname, "middleware/errorHandler")); const app = express(); const PORT = process.env.PORT || 3000; -// Security middleware +/* +|-------------------------------------------------------------------------- +| Security Middleware +|-------------------------------------------------------------------------- +*/ + app.use( helmet({ - contentSecurityPolicy: false, // Disable for API + contentSecurityPolicy: false, crossOriginEmbedderPolicy: false, }) ); +/* +|-------------------------------------------------------------------------- +| CORS Configuration +|-------------------------------------------------------------------------- +*/ + const allowedOrigins = process.env.CORS_ORIGIN - ? process.env.CORS_ORIGIN.split(',').map(origin => origin.trim()) + ? process.env.CORS_ORIGIN.split(",").map((origin) => origin.trim()) : []; const corsOptions = { origin: function (origin, callback) { - // Allow requests with no origin (like Postman, mobile apps) if (!origin) return callback(null, true); - if (allowedOrigins.includes(origin)) { + if (allowedOrigins.length === 0 || allowedOrigins.includes(origin)) { callback(null, true); } else { - callback(new Error('Not allowed by CORS')); + callback(new Error("Not allowed by CORS")); } }, credentials: true, - methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'], - allowedHeaders: ['Content-Type', 'Authorization', 'X-Requested-With'], + methods: ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"], + allowedHeaders: ["Content-Type", "Authorization", "X-Requested-With"], }; - app.use(cors(corsOptions)); -// Body parsing middleware -app.use(express.json({ limit: '10mb' })); -app.use(express.urlencoded({ extended: true, limit: '10mb' })); +/* +|-------------------------------------------------------------------------- +| Body Parsers +|-------------------------------------------------------------------------- +*/ + +app.use(express.json({ limit: "10mb" })); +app.use(express.urlencoded({ extended: true, limit: "10mb" })); app.use(cookieParser()); -// Logging middleware -if (process.env.NODE_ENV !== 'test') { - app.use(morgan('combined')); +/* +|-------------------------------------------------------------------------- +| Logging +|-------------------------------------------------------------------------- +*/ + +if (process.env.NODE_ENV !== "test") { + app.use(morgan("combined")); } -// Health check endpoint -app.get('/health', async (req, res) => { +/* +|-------------------------------------------------------------------------- +| Health Check +|-------------------------------------------------------------------------- +*/ + +app.get("/health", async (req, res) => { try { res.status(200).json({ - status: 'SUCCESS', - message: 'Vaishnavi Creation API is running successfully 🚀', - service: 'vaishnavi-backend', - version: '1.0.0', + status: "SUCCESS", + message: "Vaishnavi Creation API is running successfully 🚀", + service: "vaishnavi-backend", + version: "1.0.0", environment: process.env.NODE_ENV, timestamp: new Date().toISOString(), uptime_seconds: process.uptime(), - memory_usage: process.memoryUsage().rss, // RAM usage + memory_usage: process.memoryUsage().rss, }); } catch (error) { res.status(500).json({ - status: 'ERROR', - message: 'Health check failed', + status: "ERROR", + message: "Health check failed", error: error.message, }); } }); -// API Routes -app.use('/api/auth', require('./routes/auth')); -app.use('/api/users', require('./routes/users')); -app.use('/api/products', require('./routes/products')); -app.use('/api/orders', require('./routes/orders')); -app.use('/api/wardrobe', require('./routes/wardrobe')); -app.use('/api/delivery', require('./routes/deliveryRoutes')); -app.use('/api/coupons', require('./routes/couponRoutes')); -app.use('/api/admin', require('./routes/admin')); +/* +|-------------------------------------------------------------------------- +| API Routes +|-------------------------------------------------------------------------- +*/ -app.use('/api/admin/reports', require('./routes/reports')); -app.use('/api/payments', require('./routes/paymentRoutes')); -// Upload route -app.use('/api', uploadRoutes); +app.use("/api/auth", require(path.join(__dirname, "routes/auth"))); +app.use("/api/users", require(path.join(__dirname, "routes/users"))); +app.use("/api/products", require(path.join(__dirname, "routes/products"))); +app.use("/api/orders", require(path.join(__dirname, "routes/orders"))); +app.use("/api/wardrobe", require(path.join(__dirname, "routes/wardrobe"))); +app.use("/api/delivery", require(path.join(__dirname, "routes/deliveryRoutes"))); +app.use("/api/coupons", require(path.join(__dirname, "routes/couponRoutes"))); +app.use("/api/admin", require(path.join(__dirname, "routes/admin"))); +app.use("/api/admin/reports", require(path.join(__dirname, "routes/reports"))); +app.use("/api/payments", require(path.join(__dirname, "routes/paymentRoutes"))); -// Root endpoint -app.get('/', (req, res) => { +// Upload Routes +app.use("/api", uploadRoutes); + +/* +|-------------------------------------------------------------------------- +| Root Endpoint +|-------------------------------------------------------------------------- +*/ + +app.get("/", (req, res) => { res.json({ - message: 'Vaishnavi Creation API', - version: '1.0.0', - documentation: '/api/docs', - health: '/health', + message: "Vaishnavi Creation API", + version: "1.0.0", + documentation: "/api/docs", + health: "/health", }); }); -// Error handling middleware (must be last) +/* +|-------------------------------------------------------------------------- +| Error Handling +|-------------------------------------------------------------------------- +*/ + app.use(notFound); app.use(errorHandler); -// Graceful shutdown -process.on('SIGTERM', async () => { - console.log('SIGTERM received, shutting down gracefully'); +/* +|-------------------------------------------------------------------------- +| Graceful Shutdown +|-------------------------------------------------------------------------- +*/ + +process.on("SIGTERM", async () => { + console.log("SIGTERM received, shutting down gracefully"); await closeDatabaseConnections(); process.exit(0); }); -process.on('SIGINT', async () => { - console.log('SIGINT received, shutting down gracefully'); +process.on("SIGINT", async () => { + console.log("SIGINT received, shutting down gracefully"); await closeDatabaseConnections(); process.exit(0); }); -// Start server +/* +|-------------------------------------------------------------------------- +| Start Server +|-------------------------------------------------------------------------- +*/ + const startServer = async () => { try { - // Initialize database connections await initializeDatabases(); - // Start the server - app.listen(PORT, () => { + app.listen(PORT, "0.0.0.0", () => { console.log(`🚀 Server running on port ${PORT}`); - console.log(`📚 API Documentation: http://localhost:${PORT}/api/docs`); + console.log(`📚 API Docs: http://localhost:${PORT}/api/docs`); console.log(`🏥 Health Check: http://localhost:${PORT}/health`); console.log(`🌍 Environment: ${process.env.NODE_ENV}`); }); } catch (error) { - console.error('❌ Failed to start server:', error); + console.error("❌ Failed to start server:", error); process.exit(1); } }; -// Only start server if this file is run directly +/* +|-------------------------------------------------------------------------- +| Start App +|-------------------------------------------------------------------------- +*/ + if (require.main === module) { startServer(); } -module.exports = app; +module.exports = app; \ No newline at end of file