v0.5.123: switchTo перед crud.list, activeClientId не затирается
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
# Баг: переключение компании — таблица 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;
|
||||
```
|
||||
Reference in New Issue
Block a user