diff --git a/package.json b/package.json index 21b18b0..9eb1f80 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ipwhitelist", - "version": "0.5.93", + "version": "0.5.94", "description": "IP WhiteList microservice for cloud provider", "main": "server.js", "scripts": { diff --git a/v2/history/2026-06-12.md b/v2/history/2026-06-12.md index fabca54..a29dfb5 100644 --- a/v2/history/2026-06-12.md +++ b/v2/history/2026-06-12.md @@ -369,3 +369,186 @@ remove(entryId, clientId, email, impBy) → void 1. **Тестирование**: crud тестируется без Express, user тестируется с моком crud 2. **Переиспользование**: admin, test, export — все через crud 3. **Независимость**: фронтенд не знает про deviceId, БД-схему, транзакции + + +--- + +## Текущее состояние (0.5.93) — полная архитектура + +### Слои приложения + +``` +┌─────────────────────────────────────────────────────┐ +│ Express HTTP │ +├────────────┬────────────────┬───────────────────────┤ +│ user/ │ admin/ │ test/ │ +│ (юзер) │ (админ) │ (тестовый слой) │ +│ HTML+POST │ HTML+POST │ JSON, no session │ +├────────────┴────────────────┴───────────────────────┤ +│ router/ │ +│ resolveContext middleware │ +│ сессия → req.clientId, email, isAdmin │ +├─────────────────────────────────────────────────────┤ +│ crud/ │ +│ API БД (чистые функции) │ +│ list(clientId) / add / edit / remove │ +│ validate() вызывается здесь │ +├─────────────────────────────────────────────────────┤ +│ db/ │ +│ queries.js (SQL) + schema.js (DDL) │ +│ чистый SQL: createEntry, updateEntry, ... │ +├─────────────────────────────────────────────────────┤ +│ validators/ │ +│ validate(cidr), overlaps(), BLOCKED_RANGES │ +├─────────────────────────────────────────────────────┤ +│ auth/ + config/ │ +│ OIDC: login, exchangeCode, fetchIamUser │ +└─────────────────────────────────────────────────────┘ +``` + +### Слои — внутренние API (не HTTP) + +Каждый слой — модуль Node.js с контрактом: + +| Слой | Экспорт | Вход | Выход | +|------|---------|------|-------| +| **validators/** | `validate(raw)` | строка CIDR | `{ cidr, wasNormalized }` или throw | +| **crud/** | `add(clientId, cidr, ...)` | W-номер + параметры | `{ entry, wasNormalized }` или throw | +| **crud/** | `list(clientId)` | W-номер | `{ entries, used, limit }` | +| **crud/** | `edit(entryId, clientId, cidr, ...)` | ID + W-номер | `{ entry, wasNormalized }` | +| **crud/** | `remove(entryId, clientId, ...)` | ID + W-номер | void | +| **db/** | `createEntry(companyId, cidr, ...)` | внутренний ID + чистый CIDR | `{ entry }` | +| **db/** | `getAllCompanies()` | — | массив компаний | +| **db/** | `getAudit(companyId)` | companyId или null | массив записей аудита | +| **db/** | `setLimit(companyId, limit)` | ID + число | void | + +### Структура файлов + +``` +v2/ +├── server.js # createV2Router() — монтаж всех роутеров +├── history/ +│ └── 2026-06-12.md # этот файл +└── src/ + ├── auth/index.js # OIDC: login, exchangeCode, fetchIamUser, buildAuthUrl + ├── config/index.js # V2_* env, version, умолчания + ├── router/index.js # resolveContext — сессия → req.* + ├── validators/ + │ └── index.js # validate, overlaps, BLOCKED_RANGES (14 диапазонов ТЗ) + ├── crud/ + │ └── index.js # list, add, edit, remove — API БД, вызывает validate() + ├── db/ + │ ├── index.js # pg pool + │ ├── queries.js # SQL: CRUD + admin (getAllCompanies, setLimit, getAudit) + │ └── schema.js # ensureSchema — автосоздание v2_companies, v2_entries, v2_audit + ├── user/ + │ └── index.js # createUserRouter — фронт юзера: HTML + POST /add /edit /delete + ├── admin/ + │ └── index.js # createAdminRouter — дашборд, аудит, лимиты, записи + └── test/ + ├── index.js # createTestRouter — тестовый API + chaos + userFlow + └── test.sh # 54 curl-теста +``` + +### Маршруты /v2 + +| Маршрут | Слой | Авторизация | Что | +|---------|------|------------|-----| +| `/v2/login` | server.js | Нет | Редирект на `/login?returnTo=/v2/app` | +| `/v2/iam` | server.js | Сессия | IAM-данные (отладка) | +| `/v2/app` | user/ | resolveContext | CRUD юзера: список, добавить, изменить, удалить | +| `/v2/admin` | admin/ | isAdmin | Дашборд компаний | +| `/v2/admin/audit` | admin/ | isAdmin | Аудит по компании | +| `/v2/admin/limit` | admin/ | isAdmin | POST — установить лимит | +| `/v2/admin/entries` | admin/ | isAdmin | Записи любой компании | +| `/v2/test` | test/ | Нет (флаг) | Тестовый API: `?action=add/list/edit/delete/audit/limit/switch/cleanup/userFlow` | +| `/v2/test/chaos` | test/ | Нет (флаг) | Параллельный хаос-тест (40 операций) | +| `/v2/logout` | server.js | Нет | Редирект на `/logout` | + +### Цепочка вызовов (юзер добавляет CIDR) + +``` +Браузер: форма