if (process.env.NODE_ENV !== "production") {
require("dotenv").config();
}
const express = require("express");
const path = require("path");
const ejsMate = require("ejs-mate");
const ExpressError = require("./utils/ExpressError");
const methodOverride = require("method-override");
const session = require("express-session");
const mongoose = require("mongoose");
const axios = require("axios");
const db_url = `mongodb://${process.env.MONGO_HOST}/${process.env.MONGO_DATABASE}`;
const MongoDBStore = require("connect-mongo");
mongoose
.connect(db_url)
.then((response) => {
console.log(
`Connected to MongoDB. Database name: "${response.connections[0].name}"`
);
})
.catch((error) => console.error("Error connecting to MongoDB", error));
const store = MongoDBStore.create({
mongoUrl: db_url,
touchAfter: 24 * 3600,
crypto: {
secret: process.env.SECRET,
},
});
store.on("error", (e) => {
console.log("Session store error!", e);
});
const hotelRoutes = require("./routes/hotels");
const reviewRoutes = require("./routes/reviews");
const app = express();
app.engine("ejs", ejsMate);
app.set("view engine", "ejs");
app.set("views", path.join(__dirname, "views"));
app.use(express.urlencoded({ extended: true }));
app.use(methodOverride("_method"));
app.use(express.static(path.join(__dirname, "public")));
const sessionConfig = {
store,
name: "session",
secret: process.env.SECRET,
resave: false,
saveUninitialized: true,
cookie: {
httpOnly: true,
expires: Date.now() + 1000 * 60 * 60 * 24 * 7,
maxAge: 1000 * 60 * 60 * 24 * 7,
},
};
app.use(session(sessionConfig));
const { generateAuthRequest, isAuthenticated } = require("./middleware");
app.use("/hotels", isAuthenticated, hotelRoutes);
app.use("/hotels/:id/reviews", reviewRoutes);
app.get("/", generateAuthRequest, (req, res) => {
res.render("home");
});
app.get("/logout", async (req, res, next) => {
try {
const params = new URLSearchParams();
params.append("client_id", process.env.CLIENT_ID);
params.append("client_secret", process.env.CLIENT_SECRET);
params.append("refresh_token", req.session.refreshToken);
await axios.post(process.env.LOGOUT_URL, params);
req.session.destroy();
res.redirect("/");
} catch (err) {
next(new ExpressError("Error while logging out"));
}
});
app.all("*", (req, res, next) => {
next(new ExpressError("Page Not Found", 404));
});
app.use((err, req, res, next) => {
const { statusCode = 500 } = err;
if (!err.message) {
err.message = "Oh No, Something Went Wrong!";
}
res.status(statusCode).render("error", { err });
});
const port = process.env.PORT || 3000;
app.listen(port, () => {
console.log(`Serving on port ${port}`);
});