-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
131 lines (105 loc) · 3.76 KB
/
app.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
if(process.env.NODE_ENV!="production") { //not to deploy .env file while uploading to git
require('dotenv').config();
}
const express=require("express");
const app = express();
const mongoose=require("mongoose");
const Product = require("./models/products.js");
//JOI serverside schema validation
const { productSchema } = require("./schema.js");
// update product
const methodOverride = require("method-override");
const ejsMate = require("ejs-Mate");
// error handling
const wrapAsync = require("./utils/wrapAsync.js");
const expressError = require("./utils/expressError.js");
const Cart = require("./models/cart.js");
//for ejs rendering
const listingRouter = require("./routes/listing.js");
const adminRouter = require("./routes/admin_panel.js");
const userRouter = require("./routes/user.js");
const cartRoutes = require("./routes/cart.js");
const passport = require("passport");
const LocalStrategy = require("passport-local");
const User = require("./models/user.js");
//SESSIONS MANAGEMENt
const session= require("express-session");
//FLash after adding
const flash = require("connect-flash");
const sessionOptions ={
secret: process.env.SESSION_SECRET || "secretkey",
resave: false,
saveUninitialized: true,
cookie: {
expires: Date.now() + 1000 * 60 * 60 * 24 * 7, // 7 days
maxAge: 1000 * 60 * 60 * 24 * 7, // 7 days
httpOnly: true,
}
};
const MONGO_DB_URL = process.env.DATABASE_URL;
// Use environment variables
const PORT = process.env.PORT || 3000;
// Test API
app.get('/', (req, res) => {
res.send('API is running...');
});
app.use(session(sessionOptions));
//use flash
app.use(flash());
app.use(passport.initialize());
app.use(passport.session());
// use static authenticate method of model in LocalStrategy
passport.use(new LocalStrategy(User.authenticate()));
// use static serialize and deserialize of model for passport session support
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
app.use(async (req, res, next) => {
res.locals.success = req.flash("success");
res.locals.error = req.flash("error");
res.locals.currentUser = req.user || null; //currentUser is available in all templates
if (req.user) {
const cart = await Cart.findOne({ user: req.user._id });
res.locals.cartCount = cart
? cart.items.reduce((sum, item) => sum + item.quantity, 0)
: 0;
} else {
res.locals.cartCount = 0;
}
// console.log(req.user);
next();
});
//for ejs rendering
const path = require("path");
app.set("view engine", "ejs");
// Set up template engine for EJS
app.set("views", path.join(__dirname,"views"));
// for body parsing means that body is parsed as JSON instead of a string
app.use(express.urlencoded({extended:true}));
// for static files
app.use(express.static(path.join(__dirname, "public")));
app.use(methodOverride("_method"));
app.engine('ejs',ejsMate);
async function main(){
await mongoose.connect(MONGO_DB_URL);
console.log("Connected to MongoDB");
};
main().catch(err => console.log(err));
// ROUTES
app.use("/products",listingRouter);
app.use("/adminDashboard",adminRouter);
app.use("/",userRouter);
app.use("/cart", cartRoutes);
// (err, req, res, next) — with the error object (err) being the first parameter.
// General error-handling middleware
// Middleware for handling errors
app.use((err, req, res, next) => {
const status = err.status || 500;
const msg = err.message || 'Internal Server Error';
res.status(status).render('products/error', { msg, status });
});
// Catch-all route for undefined routes (404 error handler)
app.use((req, res) => {
res.status(404).render("products/nopage.ejs");
});
// Start server
app.listen(PORT, () => console.log(`Server running on port ${PORT}`));