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