UNPKG

jsm-core

Version:
154 lines (153 loc) 8.53 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const jsm_exceptions_1 = __importDefault(require("jsm-exceptions")); const jsm_logger_1 = __importStar(require("jsm-logger")); const typedi_1 = require("typedi"); const cache_manager_class_1 = require("../managers/cache-manager/cache-manager.class"); const handle_jwt_middleware_1 = require("./handle-jwt.middleware"); const colors_1 = __importDefault(require("colors")); const context_1 = require("../../context"); colors_1.default.enable(); const logger = (0, jsm_logger_1.default)(jsm_logger_1.LoggerContext.MIDDLEWARE, "attachAuthData"); /** * @description Attach user to req.currentUser * @param {*} req Express req Object * @param {*} res Express res Object * @param {*} next Express next Function */ const getAttachAuthDataMiddleware = ({ usersService, }) => { const attachAuthData = (req, res, next) => __awaiter(void 0, void 0, void 0, function* () { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r; try { if (!req.attached_entities) req.attached_entities = {}; const cache = typedi_1.Container.get(cache_manager_class_1.CacheManager); const token = (0, handle_jwt_middleware_1.getTokenFromHeader)(req); req.current_token = token; logger.tree("headers", req.headers); logger.value("Token", token ? `${token.slice(0, 30)}...` : "Not sent"); req.attached_entities.token = token || undefined; let loadUser = true; let user; if (!token || req.jwt_expired) { if (!token) logger.warn("! JWT: No Token"); else logger.error("x JWT: Expired"); if (((_b = (_a = req.attached_entities) === null || _a === void 0 ? void 0 : _a.service) === null || _b === void 0 ? void 0 : _b.is_external) || !((_d = (_c = req.attached_entities) === null || _c === void 0 ? void 0 : _c.service) === null || _d === void 0 ? void 0 : _d.name)) return next(); else loadUser = false; } if (loadUser && ((_e = req.auth) === null || _e === void 0 ? void 0 : _e._id)) { /* -------------------------------------------------------------------------- */ /* USER */ /* -------------------------------------------------------------------------- */ logger.value("JWT Auth Object", req.auth); user = yield ((_g = (_f = (0, context_1.getRegistry)().cache) === null || _f === void 0 ? void 0 : _f.users) === null || _g === void 0 ? void 0 : _g.get((_h = req.auth) === null || _h === void 0 ? void 0 : _h._id)); if (user) { if (user.is_deleted || ((_j = user.attributes) === null || _j === void 0 ? void 0 : _j.is_suspended)) throw new jsm_exceptions_1.default.UnauthorizedException("User deleted or suspended"); req.attached_entities.user = user; logger.success("Attached CurrentUser from redis", (_k = req.auth) === null || _k === void 0 ? void 0 : _k._id); } else if (usersService) { try { const { data } = yield usersService.getById((_l = req.auth) === null || _l === void 0 ? void 0 : _l._id, usersService.internalAuthData); if (data) user = data; } catch (error) { logger.error(error.message, error); throw new jsm_exceptions_1.default.UnauthorizedException("Could not load user from db"); } } else { throw new jsm_exceptions_1.default.UnauthorizedException("Could not load user from redis cache and usersService not provided!"); } if (!user) throw new jsm_exceptions_1.default.UnauthorizedException("User not found"); } /* -------------------------------------------------------------------------- */ /* APP */ /* -------------------------------------------------------------------------- */ let app_id; if ((_m = req.attached_entities.user) === null || _m === void 0 ? void 0 : _m.app) app_id = req.attached_entities.user.app; else if (req.headers["x-app-id"]) app_id = req.headers["x-app-id"]; if (app_id) { const app = yield ((_p = (_o = (0, context_1.getRegistry)().cache) === null || _o === void 0 ? void 0 : _o.apps) === null || _p === void 0 ? void 0 : _p.get(app_id)); if (app) { if (app.is_deleted || ((_q = app.attributes) === null || _q === void 0 ? void 0 : _q.is_suspended)) throw new jsm_exceptions_1.default.UnauthorizedException("Company deleted or suspended"); req.attached_entities.app = app; } } req.attached_entities.service ? logger.success("✔️ service", req.attached_entities.service.is_external ? "external".red : "internal".blue, (_r = req.attached_entities.service.name) === null || _r === void 0 ? void 0 : _r.green) : logger.warn("x not a service call"); req.attached_entities.user ? logger.success("✔️ user", req.attached_entities.user._id, req.attached_entities.user.email) : logger.warn("x no user"); req.attached_entities.app ? logger.success("✔️ app", req.attached_entities.app._id, req.attached_entities.app.name) : logger.warn("x no app"); return next(); } catch (error) { logger.error("🔥 Error attaching user to req:", error); return next(error); } }); return attachAuthData; }; exports.default = getAttachAuthDataMiddleware;