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:
@@ -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), либо юзер к ней не относится — не надо «создавать если нет»
|
||||
Reference in New Issue
Block a user