2.9 KiB
Баг: переключение компании — таблица IP не обновляется
Симптом
GET /v2/app?switchTo=WZ30001 → таблица показывает записи старой компании.
Найденная причина №1 (основная)
Порядок кода в v2/src/user/index.js:
// 1. clId = req.clientId ← resolveContext выставил СТАРЫЙ activeClientId
const clId = req.clientId;
// 2. crud.list() по СТАРОМУ clId — ещё до switchTo
const { entries, used, limit } = await crud.list(clId, includeDeleted);
// 3. Потом switchTo обновляет сессию и делает redirect
if (req.query.switchTo) {
req.session.user.activeClientId = targetId;
return req.session.save(() => res.redirect('/v2/app'));
}
Итог: первый запрос с ?switchTo загружает записи СТАРОЙ компании. Второй запрос (редирект /v2/app) должен уже использовать новый activeClientId — если ничто его не затирает.
Найденная причина №2 (если ENV заданы)
v2/src/impersonation/index.js — при тестовом режиме (IMPERSONATION_TARGET задан):
u.activeClientId = MAIN_COMPANY; // ← затирает то что записал switchTo
Middleware запускается при КАЖДОМ запросе (включая редирект после switchTo) и сбрасывает activeClientId обратно в IMPERSONATION_COMPANY.
Что проверить
echo $IMPERSONATION_COMPANY
echo $IMPERSONATION_TARGET
echo $IMPERSONATION_ORIGINAL
Если заданы → причина №2 (middleware затирает сессию). Если не заданы → причина №1 (но тогда второй запрос после редиректа должен работать).
Фикс причины №1
В v2/src/user/index.js — переставить проверку switchTo ПЕРЕД crud.list():
// Сначала switchTo
if (req.query.switchTo) {
const targetId = req.query.switchTo;
const allowed = isAdmin || (req.profiles || []).find(p => p.client_id === targetId);
if (allowed) {
req.session.user.activeClientId = targetId;
return req.session.save(err => {
if (err) console.error('[switchTo] save error:', err.message);
res.redirect('/v2/app');
});
}
}
// Потом загружать записи
const { entries, used, limit } = await crud.list(clId, includeDeleted);
Фикс причины №2
В v2/src/impersonation/index.js — не перезаписывать activeClientId если он уже есть:
// Вместо:
u.activeClientId = MAIN_COMPANY;
// Сделать:
u.activeClientId = u.activeClientId || MAIN_COMPANY;