v2: user CRUD + schema автозапуск + router тесты — модуль пользователя готов

This commit is contained in:
2026-06-12 21:09:30 +04:00
parent df72fa2fe1
commit a835cf0f16
6 changed files with 253 additions and 12 deletions
+52
View File
@@ -75,3 +75,55 @@ CIDR validate, overlaps, cidrToRange, aggregateCIDRs, BLOCKED_RANGES.
- Каждый модуль — отдельная папка в src/
- env-переменные — через process.env, без .env/dotenv
- Умолчания — хардкод, переопределяются через V2_* env
---
## Модуль router/ (0.5.75)
`resolveContext` middleware — определяет контекст из `req.session.v2_user`:
```
нет сессии / нет v2_user → 302 /v2/login
обычный юзер → req.v2_email, req.v2_clientId (activeClientId)
юзер с несколькими компаниями → activeClientId из сессии
админ + adminMode → req.v2_isAdmin = true
админ без adminMode → req.v2_isAdmin = false (видит как юзер)
имперсонация → email подменён на originalUserEmail
clientId подменён на impersonatedCompanyId
req.v2_impersonatedBy = реальный админ
```
### Тесты (v2/src/router/test.js)
9 тестов, все пройдены ✅:
1. нет сессии → /v2/login
2. нет v2_user → /v2/login
3. обычный юзер 1 компания
4. юзер 2 компании → activeClientId
5. админ adminMode=true
6. админ adminMode=false
7. имперсонация с originalUserEmail
8. имперсонация без originalUserEmail
9. без activeClientId → fallback на clientId
### Ошибки при тестировании
- Причина: спешка. null вместо undefined, двойной префикс v2_v2_ в ключах.
- Урок: сначала думать, потом писать.
## Текущая структура (0.5.75)
```
v2/src/
├── auth/index.js # fetchIamUser(), login(), exchangeCode()
├── config/index.js # iamUrl, appUrl, version
├── router/
│ ├── index.js # resolveContext middleware
│ └── test.js # 9 тестов
├── user/index.js # createUserRouter (пустышка)
├── admin/index.js # createAdminRouter (пустышка)
├── crud/index.js # createCrudRouter (не монтирован)
├── db/ # pool, queries, schema
└── validators/index.js # CIDR validate
```