- 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)
86 lines
4.6 KiB
Markdown
86 lines
4.6 KiB
Markdown
# План упрощения — 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), либо юзер к ней не относится — не надо «создавать если нет»
|