Files
ipwhitelist-app/docs/history/2026-06-12.md
T
naeel 5c09844002 v2: модуль аутентификации Keycloak + IAM, роутер /v2
- v2/src/auth/index.js — login(), fetchIamUser(), exchangeCode(), buildAuthUrl()
- v2/src/config/index.js — приоритет V2_* → KC_* → умолчания
- v2/server.js — createV2Router(), монтируется в server.js как /v2
- server.js — app.use('/v2', createV2Router()) перед UI-роутером
- bump 0.5.57 → 0.5.58
2026-06-12 15:47:32 +04:00

2.7 KiB

Сессия 2026-06-12

Архитектурный анализ

Вердикт: модульный монолит (modular monolith)

Не чистый монолит, не микросервисы. Осмысленная архитектура с DI и разделением на слои.

Слои

UI (EJS)  →  HTTP  →  API (JSON)  →  Queries  →  PostgreSQL
                      ↑
                 DI через фабрики:
                 createApiRouter({ auth, q })

UI не ходит в БД напрямую — всегда через ui/api-client.js → HTTP → /api/v1/*. Разделение по протоколу.

Степень связанности

Модуль Связанность Почему
validators.js Ноль Только net, чистые функции
config.js Ноль Чистые данные
api-client.js Ноль Только http/https
bearerAuth.js Ноль Standalone middleware
queries.jsdb.js Tight Data-access — иначе быть не может
server.js → всё Tight Оркестратор — нормально

Что хорошо

  • DI-паттерн: роутеры получают зависимости через фабрики
  • Нет циклических зависимостей — граф чистый DAG
  • Большинство модулей тестируемы изолированно
  • Лёгкий вынос API в микросервис: поменять API_BASE в api-client.js

Что не очень

  • server.js знает про все модули (15 импортов) — но для монолита норма
  • src/auth.js делает и JWT, и IAM, и bearer — можно разделить
  • Дублирование buildSessionUser в oidc.js и auth.js

Граф зависимостей

server.js
├── src/db.js → pg
├── src/middleware/session.js → express-session, connect-pg-simple
├── src/middleware/csp.js
├── src/middleware/rateLimit.js
├── src/auth.js → src/config.js
├── src/queries.js → src/db.js, src/validators.js
├── src/validators.js → net
├── src/config.js (ноль зависимостей)
├── src/api/index.js → src/api/routes/* → src/validators.js
│   └── src/api/middleware/bearerAuth.js (ноль зависимостей)
├── ui/index.js → ui/routes/* → ui/api-client.js (только http/https)
│   └── ui/routes/auth.js → src/auth.js (только safeReturn)
└── src/routes/oidc.js