Files
ipwhitelist-app/docs/switch-company-bug.md
T

2.9 KiB
Raw Blame History

Баг: переключение компании — таблица 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;