5.6 KiB
5.6 KiB
V2 — история 2026-06-12 (финал)
V2 — это тестовый стенд для модулей
Код в v2/ — НЕ production. Это полигон для отладки модулей.
Каждый модуль тестируется изолированно, затем будет интегрирован в основной код.
Текущее состояние (0.5.73)
v2/
├── server.js # createV2Router() → /v2/login, /v2/iam, /v2/logout
├── src/
│ ├── auth/index.js # fetchIamUser(), login(), exchangeCode(), buildAuthUrl()
│ ├── config/index.js # iamUrl, appUrl, version (без KC — пока не нужен)
│ ├── crud/index.js # createCrudRouter() — НЕ монтирован (будет позже)
│ ├── db/
│ │ ├── index.js # pg pool
│ │ ├── queries.js # CRUD SQL
│ │ └── schema.js # ensureSchema(pool) — автосоздание v2_* таблиц
│ └── validators/index.js # CIDR validate, overlaps, BLOCKED_RANGES
└── history/
└── 2026-06-12.md
Как работает сейчас
/v2/login→ редирект на/login?returnTo=/v2/iam- Основной OIDC: production-KC →
/callback→ сессия → редирект на/v2/iam /v2/iam→ показывает IAM-данные изreq.session.user
V2 НЕ делает свой OIDC. Использует готовую сессию основного приложения.
Никаких своих KC-настроек. Никакого /v2/callback.
Модуль auth/index.js — готов, но не используется
Функции готовы к production:
buildAuthUrl(config)— URL редиректа на KCexchangeCode(code, config)— обмен code → токенfetchIamUser(token, iamUrl)— IAM → профильgenerateState()— CSRFlogin(code, oidcConfig, iamUrl)— оркестратор
Не тестировались: нужен /v2/callback в redirect URIs production-KC.
Модуль crud/ — готов, не монтирован
Функции:
createCrudRouter()— роутер с выбором компании (всегда список, даже если одна)- CRUD через
db/queries.js
Таблицы: v2_companies, v2_entries, v2_audit (автосоздание через schema.js).
Модуль db/ — готов
db/index.js— pg pooldb/queries.js— getOrCreateCompany, listEntries, createEntry, updateEntry, deleteEntry, getAudit, ...db/schema.js— ensureSchema(pool) — CREATE TABLE IF NOT EXISTS
Модуль validators/ — готов
CIDR validate, overlaps, cidrToRange, aggregateCIDRs, BLOCKED_RANGES.
Что дальше
- fio в fetchIamUser — возвращать строку (сейчас объект)
- Добавить
/v2/callbackв redirect URIs production-KC - Протестировать auth/login() с production-KC
- Подключить crud модуль
- Админка, экспорт
Ключевые решения
- V2 НЕ трогает основной код (server.js — только app.use('/v2', ...))
- Каждый модуль — отдельная папка в 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 тестов, все пройдены ✅:
- нет сессии → /v2/login
- нет v2_user → /v2/login
- обычный юзер 1 компания
- юзер 2 компании → activeClientId
- админ adminMode=true
- админ adminMode=false
- имперсонация с originalUserEmail
- имперсонация без originalUserEmail
- без 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