fix(tradein/ui): вход в «Команду» из v2-навигации + понятный 401 (#2556) #2570

Merged
lekss361 merged 1 commit from fix/tradein-team-nav-and-401 into main 2026-07-30 21:16:24 +00:00
Owner

Два дефекта, найденные live-проверкой прода после мержа #2565.

1. В раздел «Команда» нельзя было попасть кликом. Пункт добавили в Topbar.tsx, а /trade-in/ редиректит на /v2, где используется другой навигационный компонент — v2/TopNav.tsx. Проверено живьём: в навигации v2 только Оценка / Продажи в доме / Аналоги / Аналитика / Предыдущие оценки. Дашборд существовал, но был достижим лишь по прямому URL.

Фикс: пункт «Команда» в user-меню рядом с «Выйти», не таб. Обоснование: табы v2 переключают секции одной страницы (SectionOverlay), а /team — отдельный роут; таб потребовал бы ломать модель «число табов = число секций». Гейт двойной, как в Topbar: isPathAllowed(..., "/api/v1/team") и role === admin|manager — иначе legacy analyst (paths: ["/**"]) прошёл бы path-фильтр.

2. На /team без сессии — «Не удалось выполнить запрос». Пользователь, прошедший только Caddy basic_auth, получает /me 200 (legacy-роль) → RouteGuard пропускает → team-API отдаёт 401 valid session required → невнятная красная плашка. Поведение бэкенда корректное (team-API намеренно принимает только сессию), чинился UI.

Фикс: 401 обрабатывается отдельно от 403 — в prod авто-редирект на /login?next=/team (паттерн RouteGuard: эффект вне рендера, return null пока не сработал), в dev — экран «Войдите в систему» с кнопкой (авто-редирект мешал бы локальной разработке). Петли нет: /login не гейтится RouteGuard, sanitizeNext принимает /team.

tsc --noEmit + lint + build чисто. Post-deploy: проверить пункт в дропдаунe под admin/manager и редирект на /login без сессии.

Два дефекта, найденные live-проверкой прода после мержа #2565. **1. В раздел «Команда» нельзя было попасть кликом.** Пункт добавили в `Topbar.tsx`, а `/trade-in/` редиректит на `/v2`, где используется другой навигационный компонент — `v2/TopNav.tsx`. Проверено живьём: в навигации v2 только Оценка / Продажи в доме / Аналоги / Аналитика / Предыдущие оценки. Дашборд существовал, но был достижим лишь по прямому URL. Фикс: пункт «Команда» в **user-меню рядом с «Выйти»**, не таб. Обоснование: табы v2 переключают секции одной страницы (`SectionOverlay`), а `/team` — отдельный роут; таб потребовал бы ломать модель «число табов = число секций». Гейт двойной, как в `Topbar`: `isPathAllowed(..., "/api/v1/team")` **и** `role === admin|manager` — иначе legacy `analyst` (`paths: ["/**"]`) прошёл бы path-фильтр. **2. На `/team` без сессии — «Не удалось выполнить запрос».** Пользователь, прошедший только Caddy basic_auth, получает `/me` 200 (legacy-роль) → RouteGuard пропускает → team-API отдаёт 401 `valid session required` → невнятная красная плашка. Поведение бэкенда корректное (team-API намеренно принимает только сессию), чинился UI. Фикс: 401 обрабатывается отдельно от 403 — в prod авто-редирект на `/login?next=/team` (паттерн RouteGuard: эффект вне рендера, `return null` пока не сработал), в dev — экран «Войдите в систему» с кнопкой (авто-редирект мешал бы локальной разработке). Петли нет: `/login` не гейтится RouteGuard, `sanitizeNext` принимает `/team`. `tsc --noEmit` + lint + build чисто. Post-deploy: проверить пункт в дропдаунe под admin/manager и редирект на `/login` без сессии.
lekss361 added 1 commit 2026-07-30 21:14:40 +00:00
fix(tradein/ui): вход в «Команду» из v2-навигации + понятный 401 (#2556)
All checks were successful
CI / changes (pull_request) Successful in 10s
CI Trade-In / changes (pull_request) Successful in 10s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 1m11s
a3628843c3
`/trade-in/` редиректит на `/trade-in/v2`, а v2-навигация (TopNav.tsx)
не знала про team-дашборд вообще — пункт «Команда» был только в legacy
Topbar.tsx (NAV_ITEMS), который на v2-страницах не рендерится. Дашборд
существовал, но был недостижим кликом.

- app/v2/page.tsx: showTeamNavItem — тот же двойной гейт, что и
  Topbar.NAV_ITEMS "team" (isPathAllowed(/api/v1/team) + роль
  admin/manager), передаётся в TopNav.
- v2/TopNav.tsx: пункт «Команда» в user-меню рядом с «Выйти» (не таб
  SectionOverlay — /team отдельный роут, а не секция текущей страницы).

Второй дефект: team-API требует session-cookie, легаси Caddy-роль
(/me 200) через него не проходит → GET /api/v1/team/employees отдаёт
401, UI показывал невнятную красную плашку. app/team/page.tsx теперь
ловит 401 отдельно от 403 и уводит на /login?next=/team (тот же
redirect-паттерн, что RouteGuard.tsx для 401 от /me; в dev — сообщение
с кнопкой «Войти» вместо авто-редиректа, тот же NODE_ENV-гейт что и в
RouteGuard).
lekss361 merged commit 69fd0ba260 into main 2026-07-30 21:16:24 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2570
No description provided.