-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.js
135 lines (115 loc) · 3.37 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
132
133
134
135
const mongoose = require("mongoose");
const path = require("path");
const session = require("express-session");
const MongoDBStore = require("connect-mongodb-session")(session);
const express = require("express");
const dotenv = require("dotenv");
const bodyParser = require("body-parser");
const csrf = require("csurf");
const flash = require("connect-flash");
const multer = require("multer");
const { v4: uuidv4 } = require("uuid"); //FOR WINDOWS ONLY
dotenv.config();
const adminRoutes = require("./routes/admin");
const shopRoutes = require("./routes/shop");
const authRoutes = require("./routes/auth");
const ErrorController = require("./controllers/error");
const User = require("./models/user");
const app = express();
const store = new MongoDBStore({
uri: process.env.MONGO_URI,
collection: "sessions",
});
var csrfProtection = csrf();
const fileStorage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, "images");
},
filename: (req, file, cb) => {
// cb(null, new Date().toISOString() + "-" + file.originalname);
cb(null, uuidv4());
},
});
const fileFilter = (req, file, cb) => {
if (
file.mimetype === "image/png" ||
file.mimetype === "image/jpg" ||
file.mimetype === "image/jpeg"
) {
cb(null, true);
} else {
cb(null, false);
}
};
//for ejs
app.set("view engine", "ejs");
app.set("views", "views");
app.use(bodyParser.urlencoded({ extended: true }));
app.use(
multer({ storage: fileStorage, fileFilter: fileFilter }).single("image")
);
app.use(express.static(path.join(__dirname, "temp")));
app.use(express.static(path.join(__dirname, "public"))); //we can add multiple static folders
// the app will go through all the folders until it hits the first file which is needed
app.use("/images", express.static(path.join(__dirname, "images")));
app.use(
session({
secret: "my secret",
resave: false,
saveUninitialized: false,
store: store,
})
);
app.use(csrfProtection);
app.use(flash());
app.use((req, res, next) => {
res.locals.isAuthenticated = req.session.isLoggedIn;
res.locals.csrfToken = req.csrfToken();
next();
});
app.use((req, res, next) => {
if (!req.session.user) {
return next();
}
User.findById(req.session.user._id)
.then((user) => {
if (!user) {
return next();
}
req.user = user;
next();
})
.catch((err) => {
// throw new Error(err); //this will just throw an error and reloading sign will be on loop
//rather than this we can use next and wrap this error inside the next to avoid such situations
next(new Error(err));
//btw this is just for async. for sync it will directly work and go to /500
});
});
app.use("/admin", adminRoutes);
app.use(shopRoutes);
app.use(authRoutes);
app.get("/500", ErrorController.get505);
app.use(ErrorController.errorPage);
app.use((error, req, res, next) => {
console.log(error);
// res.status(error.httpStatusCode).render(...);
// res.redirect('/500');
// res.locals.csrfToken = req.csrfToken();
res.status(500).render("500", {
pageTitle: "ERROR!",
path: "/500",
isAuthenticated: req.session.isLoggedIn,
});
});
mongoose
.connect(process.env.MONGO_URI)
.then((result) => {
console.log("connected!");
app.listen(process.env.PORT || 3000);
})
.catch((err) => console.log(err));
// .catch((err) => {
// const error = new Error(err);
// next(error);
// });