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)
This commit is contained in:
2026-06-11 13:15:37 +04:00
parent 1794610f77
commit 13466ebd37
5 changed files with 111 additions and 32 deletions
+85
View File
@@ -0,0 +1,85 @@
# План упрощения — 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), либо юзер к ней не относится — не надо «создавать если нет»