- 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)
4.6 KiB
4.6 KiB
План упрощения — 2026-06-11
Проблема
AI усложнил код entries.js фоллбеками getOrCreateCompany, запутанной логикой ownCo,
ненужными редиректами ?company=. Пользователь указал что логика простая и не требует усложнений.
Исходные данные (что юзер знает после входа по Keycloak)
- email — из JWT (Keycloak claims)
- session.token — access_token от Keycloak
- IAM API (
fetchIamUser) даёт:emailprofiles[]— список компаний юзера:[{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: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)
Почему именно так
- AND а не OR: админ не должен видеть toggle в чужих компаниях — только в WZ01112
- Toggle а не checkbox: чекбокс = «прочитано/не прочитано», toggle = «режим ВКЛ/ВЫКЛ» — семантически верно
- JS fetch а не form submit: быстрее, без моргания страницы, без CSRF-проблем
- Никаких фоллбеков: компания либо есть в списке (из IAM), либо юзер к ней не относится — не надо «создавать если нет»