// ═══════════════════════════════════════════════════════════════════════════════ // 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 };