-
Notifications
You must be signed in to change notification settings - Fork 0
/
app.js
138 lines (112 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
136
137
138
/** @format */
// environment variables
if (process.env.NODE_ENV !== "production") {
require("dotenv").config();
}
// Require portion
const express = require("express");
const app = express();
const path = require("path");
// Npm packages
const mongoose = require("mongoose");
const session = require("express-session");
const flash = require("connect-flash");
const passport = require("passport");
const LocalStrategy = require("passport-local");
const db_url = process.env.ATLASDB_URL;
// Error
const ExpressError = require("./utils/ExpressError.js");
// Models
const User = require("./models/user.js");
// Router
const userRouter = require("./routes/user.js");
const listingsRouter = require("./routes/listing.js");
const reviewsRouter = require("./routes/review.js");
// ejs-mate
const ejsMate = require("ejs-mate");
app.engine("ejs", ejsMate);
// method override
const methodOverride = require("method-override");
const MongoStore = require("connect-mongo");
app.use(methodOverride("_method"));
// Express settings
app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "views"));
app.use(express.urlencoded({ extended: true })); // to read the data or parsing the data
app.use(express.static(path.join(__dirname, "/public")));
const store = MongoStore.create({
mongoUrl: db_url,
crypto: {
secret: process.env.SECRET,
},
touchAfter: 24 * 60 * 60,
});
store.on("error", () => {
console.log("Error in mongo session store: ");
})
const sessionOpt = {
store,
secret: process.env.SECRET,
resave: false,
saveUninitialized: true,
cookie: {
expires: Date.now() + 7 * 24 * 60 * 60 * 1000, //7 days 24hr 60min 60sec 1000msec
maxAge: 7 * 24 * 60 * 60 * 1000,
httpOnly: true,
},
};
// database setup
async function main() {
// await mongoose.connect("mongodb://127.0.0.1:27017/Airbnb");
await mongoose.connect(db_url);
}
// Server start
app.listen(3000, () => {
console.log("Server started at port 3000");
});
// home route
app.get("/", (req, res) => {
res.redirect("/listings");
});
// session and flash
app.use(session(sessionOpt));
app.use(flash());
// implementing passport , passport locals
app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
// implementing flash
app.use((req, res, next) => {
res.locals.success = req.flash("success");
res.locals.error = req.flash("error");
res.locals.currUser = req.user;
next();
});
// Routes which start from "/listings/..." when it render in url then it call to its path which is written inside review.js
app.use("/listings", listingsRouter);
// Routes which start from "/listings/:id/reviews/..." when it render in url then it call to its path which is written inside review.js
app.use("/listings/:id/reviews", reviewsRouter);
// user
app.use("/", userRouter);
main()
.then(() => {
console.log("Database connect successfully");
})
.catch((err) => {
console.log("Error in database connection");
});
// Error handling to client side
app.all("*", (req, res, next) => {
next(new ExpressError("NOT FOUND!", "404"));
});
app.use((err, req, res, next) => {
let { statusCode = 500, message = "Something went wring!" } = err;
let error = {
statusCode: statusCode,
message: message,
};
// res.status(statusCode).send(message);
res.render("./listings/error.ejs", { error });
});