adminRequired.js 1.3 KB

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