adminRequired.js 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import async from "async";
  2. import DBModule from "../../db";
  3. import CacheModule from "../../cache";
  4. import UtilsModule from "../../utils";
  5. export default destination => async (session, ...args) => {
  6. const userModel = await DBModule.runJob("GET_MODEL", { modelName: "user" });
  7. const cb = args[args.length - 1];
  8. async.waterfall(
  9. [
  10. next => {
  11. CacheModule.runJob("HGET", {
  12. table: "sessions",
  13. key: session.sessionId
  14. })
  15. .then(session => {
  16. next(null, session);
  17. })
  18. .catch(next);
  19. },
  20. (session, next) => {
  21. if (!session || !session.userId) return next("Login required.");
  22. return userModel.findOne({ _id: session.userId }, next);
  23. },
  24. (user, next) => {
  25. if (!user) return next("Login required.");
  26. if (user.role !== "admin") return next("Insufficient permissions.");
  27. return next();
  28. }
  29. ],
  30. async err => {
  31. if (err) {
  32. err = await UtilsModule.runJob("GET_ERROR", { error: err });
  33. console.log("INFO", "ADMIN_REQUIRED", `User failed to pass admin required check. "${err}"`);
  34. return cb({ status: "failure", message: err });
  35. }
  36. console.log("INFO", "ADMIN_REQUIRED", `User "${session.userId}" passed admin required check.`, false);
  37. return destination(session, ...args);
  38. }
  39. );
  40. };