jsm-core
Version: 
Core library for JSM project
154 lines (153 loc) • 8.53 kB
JavaScript
;
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;