Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions db/db.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,17 @@ const mongoose = require("mongoose");
mongoose.set("strictQuery", false);
mongoose.set("strictPopulate", false);

let mongod = null;

const connectDB = async () => {
let dbURL = process.env.MONGO_URI;

if (process.env.NODE_ENV === "test") {
dbURL =
process.env.MONGO_URI_TEST || "mongodb://127.0.0.1:27017/bnodeapi_test";
if (!mongod) {
const { MongoMemoryServer } = require("mongodb-memory-server");
mongod = await MongoMemoryServer.create();
}
dbURL = mongod.getUri();
console.log(`Using Test Database: ${dbURL}`.yellow.bold);
}
try {
Expand Down
222 changes: 8 additions & 214 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
const dotenv = require("dotenv");
dotenv.config();

const path = require("path");
const express = require("express");
const dotenv = require("dotenv");
const morgan = require("morgan");
// const mongoSanitize = require("express-mongo-sanitize");
const helmet = require("helmet");
Expand All @@ -19,10 +21,6 @@ const cookieParser = require("cookie-parser");
const fileUpload = require("express-fileupload");
const connectDB = require("./db");

//Load env vars *******************************************************
// dotenv.config({path: "./config/config.env"});
dotenv.config();

//Connect To DB********************************************************
if (process.env.NODE_ENV !== "test") {
connectDB().then(() => {
Expand Down Expand Up @@ -93,15 +91,18 @@ app.use(cors());
// Set up session middleware
app.use(
session({
secret: process.env.SESSION_SECRET,
secret: process.env.SESSION_SECRET || "somesupersecret",
resave: false,
saveUninitialized: true,
cookie: { secure: process.env.NODE_ENV === "production" },
}),
);

// CSRF Protection *****************************************************
if (process.env.NODE_ENV !== "development") {
if (
process.env.NODE_ENV !== "development" &&
(process.env.NODE_ENV !== "test" || process.env.USE_CSRF === "true")
) {
app.use(lusca.csrf());
}

Expand Down Expand Up @@ -150,210 +151,3 @@ if (require.main === module) {
}

module.exports = app;

// const path = require("path");
// const express = require("express");
// const dotenv = require("dotenv");
// const morgan = require("morgan");
// const helmet = require("helmet");
// const expressRateLimit = require("express-rate-limit");
// const hpp = require("hpp");
// const cors = require("cors");
// const lusca = require("lusca");
// const cookieParser = require("cookie-parser");
// const fileUpload = require("express-fileupload");
// require("colors");
//
// // Internal Imports
// const logger = require("./middleware/logger");
// const errorHandler = require("./middleware/error");
// const connectDB = require("./db/db");
//
// // Router Files
// const bootcamps = require("./routes/bootcampsRoute");
// const courses = require("./routes/coursesRoute");
// const auth = require("./routes/authRoute");
// const users = require("./routes/usersRoute");
// const reviews = require("./routes/reviewsRoute");
//
// // Load env vars first
// dotenv.config();
//
// const app = express();
//
// // Trust proxy configuration
// app.set("trust proxy", 1);
//
// // Security middleware (applied early)
// app.use(helmet({
// contentSecurityPolicy: process.env.NODE_ENV === 'production' ? undefined : false,
// crossOriginEmbedderPolicy: false
// }));
//
// // CORS configuration
// const corsOptions = {
// origin: process.env.CORS_ORIGIN ? process.env.CORS_ORIGIN.split(',') : true,
// credentials: true,
// optionsSuccessStatus: 200
// };
// app.use(cors(corsOptions));
//
// // Rate limiting (applied early for security)
// const limiter = expressRateLimit({
// windowMs: 10 * 60 * 1000, // 10 minutes
// max: process.env.RATE_LIMIT_MAX || 100,
// trustProxy: true,
// standardHeaders: true,
// legacyHeaders: false,
// keyGenerator: (req) => req.ip,
// message: {
// error: "Too many requests from this IP, please try again later"
// }
// });
// app.use(limiter);
//
// // Body parsing middleware
// app.use(express.json({ limit: '10mb' }));
// app.use(express.urlencoded({ extended: true, limit: '10mb' }));
//
// // Cookie parser
// app.use(cookieParser());
//
// // HTTP parameter pollution prevention
// app.use(hpp({
// whitelist: ['sort', 'fields', 'page', 'limit'] // Allow common query params
// }));
//
// // CSRF Protection (conditional)
// if (process.env.NODE_ENV === 'production') {
// app.use(lusca.csrf({
// cookie: {
// name: '_csrf',
// httpOnly: true,
// secure: true,
// sameSite: 'strict'
// }
// }));
// }
//
// // Logging middleware
// if (process.env.NODE_ENV === 'development') {
// app.use(morgan('dev'));
// app.use(logger);
// } else {
// app.use(morgan('combined'));
// }
//
// // File upload middleware
// app.use(fileUpload({
// limits: { fileSize: 50 * 1024 * 1024 }, // 50MB max file size
// abortOnLimit: true,
// tempFileDir: path.join(__dirname, 'temp'),
// useTempFiles: true
// }));
//
// // Static files
// app.use(express.static(path.join(__dirname, "public"), {
// maxAge: process.env.NODE_ENV === 'production' ? '1d' : 0
// }));
//
// // Health check endpoint
// app.get('/health', (req, res) => {
// res.status(200).json({
// status: 'OK',
// timestamp: new Date().toISOString(),
// uptime: process.uptime(),
// environment: process.env.NODE_ENV
// });
// });
//
// // API routes
// const apiRouter = express.Router();
// apiRouter.use("/bootcamps", bootcamps);
// apiRouter.use("/courses", courses);
// apiRouter.use("/auth", auth);
// apiRouter.use("/users", users);
// apiRouter.use("/reviews", reviews);
//
// app.use("/api/v1", apiRouter);
//
// // Home route
// app.get("/", (req, res) => {
// res.json({
// name: "Bootcamp API",
// version: "1.0.0",
// description: "API for managing bootcamps and courses"
// });
// });
//
// // 404 handler
// app.use("*", (req, res) => {
// res.status(404).json({
// success: false,
// error: "Route not found"
// });
// });
//
// // Error handler (must be last)
// app.use(errorHandler);
//
// // Database connection
// const startServer = async () => {
// try {
// await connectDB();
// console.log(`Connected to MongoDB`.bgGreen.bold);
//
// const PORT = process.env.PORT || 5000;
// const server = app.listen(PORT, () => {
// console.log(
// `Server running in ${process.env.NODE_ENV} mode on port ${PORT}`.green.bold.inverse
// );
// });
//
// // Graceful shutdown handlers
// const gracefulShutdown = (signal) => {
// console.log(`${signal} received. Starting graceful shutdown...`.yellow);
//
// server.close((err) => {
// if (err) {
// console.error('Error during server shutdown:', err);
// process.exit(1);
// }
//
// console.log('Server closed successfully'.green);
// process.exit(0);
// });
//
// // Force close after 10 seconds
// setTimeout(() => {
// console.error('Could not close connections in time, forcefully shutting down');
// process.exit(1);
// }, 10000);
// };
//
// // Handle shutdown signals
// process.on('SIGTERM', () => gracefulShutdown('SIGTERM'));
// process.on('SIGINT', () => gracefulShutdown('SIGINT'));
//
// // Handle unhandled promise rejections
// process.on("unhandledRejection", (err) => {
// console.log(`Unhandled Promise Rejection: ${err.message}`.bgRed.bold);
// gracefulShutdown('unhandledRejection');
// });
//
// // Handle uncaught exceptions
// process.on('uncaughtException', (err) => {
// console.log(`Uncaught Exception: ${err.message}`.bgRed.bold);
// gracefulShutdown('uncaughtException');
// });
//
// } catch (error) {
// console.error(`Failed to start server: ${error.message}`.bgRed.bold);
// process.exit(1);
// }
// };
//
// // Start the server
// startServer();
//
// module.exports = app;
Loading