import path from "path"; import express from "express"; import cookieParser from "cookie-parser"; import passport from "passport"; import mongoose from "mongoose"; import flash from "connect-flash"; import session from "express-session"; import MongoStore from "connect-mongo"; import passportConfig from "./libs/passport"; import config, { env, mongoDbUri, secret } from "./config"; import { isXhr } from "./helpers"; import indexRouter from "./routes"; import maCollectionRouter from "./routes/ma-collection"; import monCompteRouter from "./routes/mon-compte"; import collectionRouter from "./routes/collection"; import importJobsRouter from "./routes/jobs"; import importAlbumRouterApiV1 from "./routes/api/v1/albums"; import importSearchRouterApiV1 from "./routes/api/v1/search"; import importMastodonRouterApiV1 from "./routes/api/v1/mastodon"; import importMeRouterApiV1 from "./routes/api/v1/me"; import importContactRouterApiV1 from "./routes/api/v1/contact"; passportConfig(passport); mongoose.set("strictQuery", false); mongoose .connect(mongoDbUri, { useNewUrlParser: true, useUnifiedTopology: true }) .catch(() => { process.exit(); }); const sess = { cookie: { maxAge: 86400000, }, secret, saveUninitialized: false, resave: false, store: MongoStore.create({ mongoUrl: mongoDbUri, mongoOptions: { useNewUrlParser: true, useUnifiedTopology: true }, }), }; const app = express(); app.use(cookieParser()); app.use(flash()); app.use(express.json({ limit: "50mb" })); app.use(express.urlencoded({ extended: false, limit: "50mb" })); app.use(session(sess)); if (["production"].indexOf(env) !== -1) { app.enable("trust proxy", 1); sess.cookie.secure = true; /* eslint-disable func-names */ app.use((req, res, next) => { if (req.secure) { next(); } else { res.redirect(`https://${req.headers.host}${req.url}`); } }); } app.use(passport.initialize()); app.use(passport.session()); app.set("views", path.join(__dirname, "../views")); app.set("view engine", "ejs"); app.use(express.static(path.join(__dirname, "../public"))); app.use("/", indexRouter); app.use("/mon-compte", monCompteRouter); app.use("/ma-collection", maCollectionRouter); app.use("/collection", collectionRouter); app.use("/jobs", importJobsRouter); app.use("/api/v1/albums", importAlbumRouterApiV1); app.use("/api/v1/search", importSearchRouterApiV1); app.use("/api/v1/mastodon", importMastodonRouterApiV1); app.use("/api/v1/me", importMeRouterApiV1); app.use("/api/v1/contact", importContactRouterApiV1); // Handle 404 app.use((req, res) => { if (isXhr(req)) { res.status(404).send({ message: "404: Not found" }); } else { res.status(404).render("index", { page: { title: `404: Cette page n'existe pas.` }, viewname: "error", session: req.session || null, flash: { info: req.flash("info"), error: [ ...req.flash("error"), ...(req.session?.flash?.error || []), ], success: req.flash("success"), }, query: req.query, params: req.params, user: req.user, config, getBaseUrl: null, errorCode: 404, }); } }); // Handle 500 app.use((error, req, res, next) => { if (isXhr(req)) { const { message, errorCode, date } = error; res.status(error.errorCode || 500).send({ message, errorCode, date }); } else { res.status(error.errorCode || 500); res.render("index", { page: { title: error.title || "500: Oups… le serveur a crashé !", error, }, viewname: "error", session: req.session || null, flash: { info: req.flash("info"), error: [ ...req.flash("error"), ...(req.session?.flash?.error || []), ], success: req.flash("success"), }, query: req.query, params: req.params, user: req.user, config, getBaseUrl: null, errorCode: error.errorCode || 500, }); next(); } }); export default app;