require("dotenv").config(); const path = require("path"); const express = require("express"); const { engine } = require("express-handlebars"); const session = require("express-session"); const connectDB = require("./src/config/db"); const seedData = require("./src/seed/seed"); const homeRoute = require("./src/routes/home.route"); const productRoute = require("./src/routes/product.route"); const cartRoute = require("./src/routes/cart.route"); const profileRoute = require("./src/routes/profile.route"); const renderRoute = require("./src/routes/render.route"); const authRoute = require("./src/routes/auth.route"); const adminRoute = require("./src/routes/admin.route"); const User = require("./src/models/User"); const app = express(); app.use(express.urlencoded({ extended: true, limit: "2mb" })); app.use(express.json({ limit: "2mb" })); app.use(express.static(path.join(__dirname, "public"))); app.use( session({ secret: "minishop-dev-secret", resave: false, saveUninitialized: false }) ); app.use(async (req, res, next) => { res.locals.currentUser = null; res.locals.isAdmin = false; if (req.session.userId) { const user = await User.findById(req.session.userId).lean(); if (user) { res.locals.currentUser = user; res.locals.isAdmin = user.role === "admin"; req.currentUser = user; } } next(); }); app.engine( "hbs", engine({ extname: ".hbs", defaultLayout: "main", layoutsDir: path.join(__dirname, "src/views/layouts"), partialsDir: path.join(__dirname, "src/views/partials") }) ); app.set("view engine", "hbs"); app.set("views", path.join(__dirname, "src/views")); app.use("/", homeRoute); app.use("/products", productRoute); app.use("/cart", cartRoute); app.use("/profile", profileRoute); app.use("/", renderRoute); app.use("/auth", authRoute); app.use("/admin", adminRoute); const PORT = process.env.PORT || 3000; async function bootstrap() { await connectDB(); await seedData(); app.listen(PORT, () => { console.log(`http://localhost:${PORT}`); }); } bootstrap().catch((err) => { console.error(err); process.exit(1); });