adminRequired.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. const async = require("async");
  2. const db = require("../../db");
  3. const cache = require("../../cache");
  4. const utils = require("../../utils");
  5. module.exports = function(next) {
  6. return async function(session) {
  7. const userModel = await db.runJob("GET_MODEL", { modelName: "user" });
  8. let args = [];
  9. for (let prop in arguments) args.push(arguments[prop]);
  10. let cb = args[args.length - 1];
  11. async.waterfall(
  12. [
  13. (next) => {
  14. cache
  15. .runJob("HGET", {
  16. table: "sessions",
  17. key: session.sessionId,
  18. })
  19. .then((session) => {
  20. next(null, session);
  21. })
  22. .catch(next);
  23. },
  24. (session, next) => {
  25. if (!session || !session.userId)
  26. return next("Login required.");
  27. this.session = session;
  28. userModel.findOne({ _id: session.userId }, next);
  29. },
  30. (user, next) => {
  31. if (!user) return next("Login required.");
  32. if (user.role !== "admin")
  33. return next("Insufficient permissions.");
  34. next();
  35. },
  36. ],
  37. async (err) => {
  38. if (err) {
  39. err = await utils.runJob("GET_ERROR", { error: err });
  40. console.log(
  41. "INFO",
  42. "ADMIN_REQUIRED",
  43. `User failed to pass admin required check. "${err}"`
  44. );
  45. return cb({ status: "failure", message: err });
  46. }
  47. console.log(
  48. "INFO",
  49. "ADMIN_REQUIRED",
  50. `User "${session.userId}" passed admin required check.`,
  51. false
  52. );
  53. next.apply(null, args);
  54. }
  55. );
  56. };
  57. };