Files
ipwhitelist-app/docs/plan-simplify-2026-06-11.md
T
naeel 13466ebd37 simplify: toggle adminMode, canAdminMode flag, remove getOrCreateCompany fallback
- ui/index.js: canAdminMode = isAdmin AND WZ01112 (временно || WZ01112)
- views/index.ejs: checkbox → toggle с JS fetch, условие canAdminMode
- ui/routes/entries.js: убран getOrCreateCompany-фоллбек для админа
- Админ без ?company= видит список компаний, без автозагрузки
- isAdmin теперь чисто из IAM (без || WZ01112)
2026-06-11 13:15:37 +04:00

86 lines
4.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# План упрощения — 2026-06-11
## Проблема
AI усложнил код `entries.js` фоллбеками `getOrCreateCompany`, запутанной логикой `ownCo`,
ненужными редиректами `?company=`. Пользователь указал что логика простая и не требует усложнений.
## Исходные данные (что юзер знает после входа по Keycloak)
1. **email** — из JWT (Keycloak claims)
2. **session.token** — access_token от Keycloak
3. **IAM API** (`fetchIamUser`) даёт:
- `email`
- `profiles[]` — список компаний юзера: `[{id, client_id, company_name, is_active_profile}, ...]`
- `activeProfile` — текущая активная компания
- `isAdmin` — флаг администратора
## Базовые правила
- **Компания** = общий список IP. Все юзеры компании видят одни и те же записи и могут CRUD.
- **email** пишется в `audit_log.created_by` — кто сделал CRUD.
- **client_id** (WZ01112, WZ03709…) — идентификатор компании в БД (`companies.client_id`).
## Переключение компаний (мульти-компания)
Если у юзера `profiles.length > 1` — он выбирает активную компанию через переключатель.
CRUD идёт в активную компанию.
## Админ-режим (чекбокс → toggle)
### Правило (финальное):
> Toggle «Администратор» показывается **только** когда:
> `isAdmin === true` **И** `activeClientId === 'WZ01112'`
### Временное исключение (тесты):
Пока я (WZ01112 + ntazetdinov@nubes.ru) — тоже вижу toggle, даже без `isAdmin`.
Убрать когда перейдём на чистый IAM `isAdmin`.
### Поведение toggle:
- **ВЫКЛ** — обычный режим: юзер видит свою активную компанию, CRUD только в неё
- **ВКЛ** — admin-режим: выпадающий список ВСЕХ компаний, можно выбрать любую, ссылки «Аудит» и «Лимиты»
### Реализация toggle:
- Не `<input type="checkbox">` с `onchange="this.form.submit()"` (старый вариант, не работал)
- Замена на **toggle-переключатель** (как ползунок ВКЛ/ВЫКЛ)
- `onchange``fetch('/toggle-admin', {method:'POST'})``location.reload()`
- Никакой формы, никакого CSRF — просто JS fetch и перезагрузка страницы
## Что меняем (4 файла)
### 1. `ui/index.js` — resolveUser middleware
- Добавить `canAdminMode`:
```js
canAdminMode: (iamAdmin && activeClientId === 'WZ01112') || activeClientId === 'WZ01112' // временно
```
- Убрать `isAdmin: iamAdmin || activeClientId === ADMIN_CLIENT_ID` — заменить на чистое `isAdmin: iamAdmin`
- `adminMode` остаётся из сессии
### 2. `views/index.ejs` — header
- Условие показа toggle: `<% if (canAdminMode) { %>` вместо `<% if (isAdmin) { %>`
- Заменить checkbox на toggle
- Ссылки «Аудит»/«Лимиты» — по `adminMode` (уже так)
### 3. `ui/routes/entries.js` — GET /
- **Убрать** `getOrCreateCompany`-фоллбек (строки 89-96)
- **Упростить** admin-ветку: если нет `?company=` — показать свою компанию
- Обычный пользователь: без изменений (уже работает)
### 4. `ui/routes/auth.js` — POST /toggle-admin
- Без изменений (уже работает — переключает `req.session.adminMode`)
## Почему именно так
1. **AND а не OR**: админ не должен видеть toggle в чужих компаниях — только в WZ01112
2. **Toggle а не checkbox**: чекбокс = «прочитано/не прочитано», toggle = «режим ВКЛ/ВЫКЛ» — семантически верно
3. **JS fetch а не form submit**: быстрее, без моргания страницы, без CSRF-проблем
4. **Никаких фоллбеков**: компания либо есть в списке (из IAM), либо юзер к ней не относится — не надо «создавать если нет»