72 lines
2.5 KiB
JavaScript
72 lines
2.5 KiB
JavaScript
const status = require("../util/statuses");
|
|
const session = require("express-session");
|
|
const ObjectId = require("mongodb").ObjectId;
|
|
|
|
// Get all names of user routes
|
|
let userRouter = require("../router/user")((req, res, next) => next(), null, null, null);
|
|
userRouter.stack.shift();
|
|
const userRoutes = userRouter.stack.map((layer) => layer.route.path.split("/")[1]);
|
|
|
|
/**
|
|
* @param {MongoClient.collection} users db collection
|
|
* @returns {async function} middleware handler function
|
|
*/
|
|
const createMiddleware = (users) => {
|
|
return async (req, res, next) => {
|
|
// Check if incoming request route exists in user routes
|
|
// redirect to 404 if not
|
|
if (!userRoutes.includes(req.url.split("/")[1].split("?")[0])) {
|
|
return res.status(status.NotFound).redirect("/notFound");
|
|
}
|
|
|
|
if (!req.session.authenticated || !req.session.userId) {
|
|
req.session.errMessage = "Please login to view that resource";
|
|
res.redirect("/login");
|
|
return res.status(status.Unauthorized);
|
|
}
|
|
|
|
if (!req.session.user) {
|
|
let user = await users.findOne({ _id: new ObjectId(req.session.userId) }).then((user) => user);
|
|
|
|
if (!user) {
|
|
return req.session.destroy((err) => {
|
|
if (err) {
|
|
console.error("Failed to destroy session: ", err);
|
|
req.session.errMessage = "Failed to logout. Please try again";
|
|
res.status(status.InternalServerError);
|
|
return res.redirect("/home");
|
|
}
|
|
|
|
req.session.errMessage = "User not found";
|
|
res.status(status.NotFound);
|
|
res.redirect("/login");
|
|
});
|
|
}
|
|
|
|
req.session.user = user;
|
|
return req.session.save((err) => {
|
|
if (err) {
|
|
console.error("Failed to save session: ", err);
|
|
|
|
return req.session.destroy((err) => {
|
|
req.session.errMessage = "An error occured, please login again.";
|
|
|
|
if (err) {
|
|
console.error("Failed to destroy session: ", err);
|
|
}
|
|
|
|
res.status(status.InternalServerError);
|
|
res.redirect("/login");
|
|
});
|
|
}
|
|
|
|
next();
|
|
});
|
|
}
|
|
|
|
next();
|
|
};
|
|
};
|
|
|
|
module.exports = createMiddleware;
|