Files
ipwhitelist-app/docs/plan-simplify-2026-06-11.md
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

4.6 KiB
Raw Permalink Blame History

План упрощения — 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-переключатель (как ползунок ВКЛ/ВЫКЛ)
  • onchangefetch('/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)

Почему именно так

  1. AND а не OR: админ не должен видеть toggle в чужих компаниях — только в WZ01112
  2. Toggle а не checkbox: чекбокс = «прочитано/не прочитано», toggle = «режим ВКЛ/ВЫКЛ» — семантически верно
  3. JS fetch а не form submit: быстрее, без моргания страницы, без CSRF-проблем
  4. Никаких фоллбеков: компания либо есть в списке (из IAM), либо юзер к ней не относится — не надо «создавать если нет»