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

77 lines
2.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Баг: переключение компании — таблица IP не обновляется
## Симптом
GET /v2/app?switchTo=WZ30001 → таблица показывает записи старой компании.
## Найденная причина №1 (основная)
Порядок кода в `v2/src/user/index.js`:
```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 задан):
```js
u.activeClientId = MAIN_COMPANY; // ← затирает то что записал switchTo
```
Middleware запускается при КАЖДОМ запросе (включая редирект после switchTo)
и сбрасывает activeClientId обратно в IMPERSONATION_COMPANY.
## Что проверить
```bash
echo $IMPERSONATION_COMPANY
echo $IMPERSONATION_TARGET
echo $IMPERSONATION_ORIGINAL
```
Если заданы → причина №2 (middleware затирает сессию).
Если не заданы → причина №1 (но тогда второй запрос после редиректа должен работать).
## Фикс причины №1
В `v2/src/user/index.js` — переставить проверку switchTo ПЕРЕД crud.list():
```js
// Сначала 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 если он уже есть:
```js
// Вместо:
u.activeClientId = MAIN_COMPANY;
// Сделать:
u.activeClientId = u.activeClientId || MAIN_COMPANY;
```