@@ -832,3 +832,83 @@ express HTTP
| 1 | Интеграция в основной код | ✅ 0.5.98 |
| 2 | Auth (KC callback) | ⏸ заблокирован облаком |
| 3 | Убрать старые v2_* таблицы из БД | ⏸ после деплоя |
---
## Интеграция v2 в основной проект (0.6.0– 0.6.8, 2026-06-15)
### Что сделано
| Версия | Что |
|--------|-----|
| 0.5.98 | Таблицы `v2_*` → `companies` , `whitelist_entries` , `audit_log` |
| 0.5.98 | `impersonation/` модуль — добавление компаний через ENV |
| 0.5.99 | V2 как основной UI: `app.use('/', createV2Router())` , старый UI закомментирован |
| 0.6.0 | Дизайн Nubes: лого, header, стили из `views/index.ejs` |
| 0.6.1 | Фикс: email в header |
| 0.6.2 | `displayEmail` справа от статистики |
| 0.6.3 | Жёлтый баннер имперсонации вместо метки `(имперсонация)` |
| 0.6.4 | Авто-имперсонация: `IMPERSONATION_ORIGINAL → TARGET` |
| 0.6.4 | `ADMIN_EMAIL` в `resolveContext` |
| 0.6.5 | `loginEmail` из `originalUserEmail` |
| 0.6.6 | `req.displayEmail` — разделение экран/аудит |
| 0.6.7 | **Перепутаны местами ** : `req.email` и `req.impersonatedBy` |
| 0.6.8 | «Выйти» — только реальный KC-юзер |
### Ключевая ошибка: перепутаны `req.email` и `req.impersonatedBy`
**Что было неправильно (0.6.6 и ранее): **
``` js
req . email = реальный → created _by = ntazetdinov @ nubes . ru ❌
req . impersonatedBy = имперсонированный → impersonated _by = tazet @ narod . ru ❌
```
**Почему ошибался: ** AI думал что `req.email` должно хранить реального юзера «для аудита»,
а имперсонированного — для показа. Это неверно. Везде должен использоваться ТЕКУЩИЙ
юзер (имперсонированный если есть имперсонация), а реальный — ТОЛЬКО в колонке
`impersonated_by` таблицы аудита.
**Как правильно (0.6.7+): **
``` js
req . email = ТЕКУЩИЙ → created _by = tazet @ narod . ru ✅
req . impersonatedBy = РЕАЛЬНЫЙ → impersonated _by = ntazetdinov @ ... ✅
```
**Урок: ** `req.email` — это ВСЕГДА текущий юзер. Имперсонация не меняет его смысл —
она меняет значение `session.user.email` , и `req.email` просто берёт его.
### Правильная логика (0.6.8)
```
KC логин: ntazetdinov@nubes.ru
↓
session.user.email = ntazetdinov@nubes.ru
↓
enhanceImpersonation: ORIGINAL совпал → авто-имперсонация
session.user.originalUserEmail = ntazetdinov@nubes.ru (реальный)
session.user.email = tazet@narod.ru (текущий)
↓
resolveContext:
req.email = u.email = tazet@narod.ru (текущий — created_by, экран)
req.impersonatedBy = u.originalUserEmail (реальный — только аудит)
req.isImpersonated = true
↓
user/index.js → шаблон:
loginEmail = ntazetdinov@nubes.ru → «Выйти»
email = tazet@narod.ru → контент, статистика
```
### Переменные ENV для авто-имперсонации
| Переменная | Значение | Роль |
|-----------|---------|------|
| `IMPERSONATION_ORIGINAL` | `ntazetdinov@nubes.ru` | Условие: чей email сравнить |
| `IMPERSONATION_TARGET` | `tazet@narod.ru` | Цель: в кого имперсонировать |
| `IMPERSONATION_COMPANY` | `WZ01325` | Компания: какая компания |
| `IMPERSONATION_EXTRA_COMPANIES` | `WZ01112` | Доп. компании |
| `ADMIN_EMAIL` | `tazet@narod.ru` | Псевдо-админ |
Все три (`ORIGINAL` , `TARGET` , `COMPANY` ) должны быть заданы — иначе авто-имперсонация не включается.