// ═══════════════════════════════════════════════════════════════════════════════ // V2 — Имперсонация (IAM + тестовый режим через ENV) // // ЭТО: middleware — имитирует IAM-имперсонацию для тестов. // НЕ: жёсткая логика в resolveContext или user/index.js. // // ТЕСТОВЫЙ РЕЖИМ (если задан IMPERSONATION_TARGET): // При входе IMPERSONATION_ORIGINAL все данные сессии заменяются на TARGET. // Полная имитация IAM-имперсонации: email, profiles, clientId — всё от таргета. // // ENV: // IMPERSONATION_ORIGINAL — email админа (кто имперсонирует) // IMPERSONATION_TARGET — email юзера (кого имперсонируют) ← тест // IMPERSONATION_COMPANY — W-номер основной компании таргета // IMPERSONATION_EXTRA_COMPANIES — доп. W-номера через запятую // ═══════════════════════════════════════════════════════════════════════════════ const ORIGINAL_EMAIL = process.env.IMPERSONATION_ORIGINAL || ''; const TARGET_EMAIL = process.env.IMPERSONATION_TARGET || ''; const MAIN_COMPANY = process.env.IMPERSONATION_COMPANY || ''; const EXTRA_COMPANIES = (process.env.IMPERSONATION_EXTRA_COMPANIES || '') .split(',').map(s => s.trim()).filter(Boolean); const ALL_TARGET_CIDS = [...new Set([MAIN_COMPANY, ...EXTRA_COMPANIES].filter(Boolean))]; function enhanceImpersonation(req, res, next) { const u = req.session && req.session.user; if (!u) return next(); // ── IAM-имперсонация (уже есть в сессии) — просто добавляем компании ── if (u.isImpersonated && u.originalUserEmail === ORIGINAL_EMAIL) { addExtraCompanies(u); return next(); } // ── Тестовый режим: нужны все три — ORIGINAL, TARGET, COMPANY ──────── if (ORIGINAL_EMAIL && TARGET_EMAIL && MAIN_COMPANY && u.email === ORIGINAL_EMAIL) { // Сохраняем isAdmin от оригинала const wasAdmin = u.isAdmin || (u.allClientIds || []).includes('WZ01112') || u.clientId === 'WZ01112'; // Подменяем ВСЕ данные на таргета (как делает IAM) u.email = TARGET_EMAIL; u.clientId = MAIN_COMPANY; u.activeClientId = u.activeClientId || MAIN_COMPANY; u.allClientIds = ALL_TARGET_CIDS; u.companyName = MAIN_COMPANY; u.isAdmin = wasAdmin; u.isImpersonated = true; u.impersonatedCompanyId = MAIN_COMPANY; u.originalUserEmail = ORIGINAL_EMAIL; u.originalUserFullName = u.fio ? (u.fio.fullName || '') : ''; u.fio = null; u.profiles = ALL_TARGET_CIDS.map(cid => ({ client_id: cid, company_name: cid, is_active_profile: cid === MAIN_COMPANY, })); return next(); } // ── Не имперсонация — ничего не делаем ────────────────────────────── next(); } function addExtraCompanies(u) { if (!ALL_TARGET_CIDS.length) return; const current = u.allClientIds || []; u.allClientIds = [...new Set([...current, ...ALL_TARGET_CIDS])].filter(Boolean); if (!u.profiles) u.profiles = []; for (const cid of ALL_TARGET_CIDS) { if (!u.profiles.find(p => p.client_id === cid)) u.profiles.push({ client_id: cid, company_name: cid, is_active_profile: false }); } } module.exports = { enhanceImpersonation };