Files
ipwhitelist-app/v2/src/router/index.js
T

58 lines
3.4 KiB
JavaScript

// ═══════════════════════════════════════════════════════════════════════════════
// V2 — resolveContext middleware
//
// ЭТО: Express middleware — извлекает контекст из сессии.
// НЕ: БД, бизнес-логика.
//
// ЗАЧЕМ:
// 1. Единственное место где сессия превращается в req.* поля.
// 2. user/ и admin/ не парсят сессию сами — получают готовые req.email, req.clientId.
// 3. Поддержка имперсонации (админ действует от имени компании).
//
// ПОРЯДОК:
// 1. Нет сессии → 302 /v2/login
// 2. Обычный юзер → req.email = session.user.email, req.clientId = activeClientId
// 3. Админ → req.isAdmin = true (если adminMode в сессии)
// 4. Имперсонация → req.email = originalUserEmail, req.impersonatedBy = админ
//
// ВЫХОД (поля на req):
// req.email — почта (при имперсонации — originalUserEmail)
// req.clientId — W-номер текущей компании
// req.companyName — название компании
// req.isAdmin — флаг админа
// req.isImpersonated — флаг имперсонации
// req.impersonatedBy — почта админа (null если нет имперсонации)
// req.allClientIds — все W-номера юзера
// req.profiles — профили из IAM
// ═══════════════════════════════════════════════════════════════════════════════
function resolveContext(req, res, next) {
const u = req.session && req.session.user;
// Нет сессии — нет доступа
if (!u) return res.redirect('/v2/login');
// Имперсонация: админ действует от имени компании
// u.originalUserEmail — реальный админ
// u.impersonatedCompanyId — W-номер компании
const isImpersonated = !!(u.originalUserEmail && u.impersonatedCompanyId);
req.email = isImpersonated ? u.originalUserEmail : (u.email || '');
req.clientId = isImpersonated ? u.impersonatedCompanyId : (u.activeClientId || u.clientId || '');
req.companyName = u.companyName || req.clientId;
// Админ: пользователь с WZ01112 + включён toggle «Администратор»
// По умолчанию adminMode=true для админов (не надо нажимать toggle)
const allCids = u.allClientIds || [u.clientId || ''];
req.canAdmin = allCids.includes('WZ01112') || u.clientId === 'WZ01112' || !!u.isAdmin;
req.adminMode = u.adminMode !== undefined ? !!u.adminMode : req.canAdmin;
req.isAdmin = req.canAdmin && req.adminMode;
req.isImpersonated = isImpersonated;
req.impersonatedBy = isImpersonated ? u.email : null;
req.allClientIds = allCids;
req.profiles = u.profiles || [];
next();
}
module.exports = { resolveContext };