Untitled

 avatar
unknown
plain_text
3 years ago
2.8 kB
3
Indexable
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}`);
});