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;