-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.js
145 lines (121 loc) · 4.5 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
136
137
138
139
140
141
142
143
144
145
if (process.env.NODE_ENV !== "production") {
require("dotenv").config();
}
const express = require("express");
const { default: mongoose } = require("mongoose");
const path = require("path");
const User = require("./models/User");
const methodOverride = require("method-override");
const ejsMate = require("ejs-mate");
const ExpressError = require("./utils/ExpressError");
const session = require("express-session");
const flash = require("connect-flash");
const passport = require("passport");
const LocalStrategy = require("passport-local");
const MongoStore = require("connect-mongo");
// app security
const mongoSanitize = require("express-mongo-sanitize");
// our own middleware to verify logged in
const { ifLoggedIn } = require("./middleware/ifLoggedIn");
// routes
const brandRoutes = require("./routes/brands");
const contactRoutes = require("./routes/contacts");
const leadershipRoutes = require("./routes/leaderships");
const userRoutes = require("./routes/users");
const clientRoutes = require("./routes/client");
const internalRoutes = require("./routes/internal");
const historyRoutes = require("./routes/history");
const PORT = process.env.PORT || 3080;
const secret = process.env.SECRET;
// keep the local connection here in case the server won't connect, we can still test
const dbUrl = process.env.DB_URL || "mongodb://localhost:27017/brandInSight";
mongoose.connect(dbUrl, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
const db = mongoose.connection;
db.on("error", console.error.bind(console, "Connection error:"));
db.once("open", () => {
console.log("Database connected");
});
const app = express();
app.use(express.static(path.join(__dirname, "public")));
app.use(express.urlencoded({ extended: true }));
app.use(methodOverride("_method"));
app.use(mongoSanitize());
app.engine("ejs", ejsMate);
app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "views"));
// setting up the option config for connect-mongo
// Storing session data on mongo instead of in memory
const store = new MongoStore({
mongoUrl: dbUrl,
secret,
touchAfter: 24 * 3600, // in total number of seconds
});
store.on("error", function (e) {
console.log("Session store error", e);
});
const sessionConfig = {
store,
name: "session", // use sth so it is not the default connect.sid
secret,
resave: false,
saveUninitialized: true,
cookie: {
httpOnly: true,
// secure: true, // with this, only https is allowed
expires: Date.now() + 1000 * 60 * 60 * 24 * 7, //a week's time in millieseconds
maxAge: 1000 * 60 * 60 * 24 * 7,
},
};
app.use(session(sessionConfig));
// -------------- passport -------------
app.use(passport.initialize());
app.use(passport.session());
// In an Express-based application, passport.initialize() middleware
// is required to initialize Passport. If the application uses persistent login sessions,
// passport.session() middleware must also be used.
passport.use(new LocalStrategy(User.authenticate()));
// We did not specify a method called authenticate for the User model
// This is coming from the mongoose plugin that added from passport methods
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
// These are also coming from the plugin
app.use(flash());
// ------ middleware for handling flash ----------
// need to define before routes
app.use((req, res, next) => {
res.locals.currentUser = req.user;
res.locals.success = req.flash("success");
res.locals.error = req.flash("error");
next();
});
// ---------- main paga, if user logged in then home page --------------
// the middle ifLoggedIn will redirect to home if user is logged in
// otherwise, next() middleware will trigger and move to landing page
app.get("/", ifLoggedIn, landingPage);
// ------------ Routes Handles--------------
app.use("/brands", brandRoutes);
app.use("/brands/:id/contact", contactRoutes);
app.use("/brands/:id/leadership", leadershipRoutes);
app.use("/", userRoutes);
app.use("/", clientRoutes);
app.use("/internal", internalRoutes);
app.use("/history", historyRoutes);
async function landingPage(req, res) {
res.render("client/landing");
}
app.all("*", (req, res, next) => {
next(new ExpressError("Page not found", 404));
});
app.use((err, req, res, next) => {
const { statusCode = 500 } = err;
console.log("Express error----");
console.log(err);
if (!err.message) err.message = "Something went super wrong!";
res.status(statusCode).render("client/error", { error: err });
});
app.listen(PORT, () => {
console.log(`Serving on port ${PORT}`);
});