feat(tradein/admin): audit + activity dashboards (Feature 2/3 UI) #2521

Merged
lekss361 merged 1 commit from feat/tradein-admin-dashboards into main 2026-07-13 20:45:35 +00:00
Owner

Что

Admin-дашборды поверх read-API (#2520) — визуализация фич 2 (учёт входов/IP + что ищут) и 3 (поведенческая аналитика).

Страницы (admin-only)

  • /admin/audit («Аудит доступа») — таблица аккаунтов (last/first seen, #IP, #устройств, logins/requests/searches); клик по аккаунту → аккордеон-drilldown: IP-адреса (first/last/count), устройства (user-agent), недавние поиски (адрес + когда + с какого IP), недавняя активность.
  • /admin/analytics («Активность» — намеренно не «Аналитика», чтобы не путать с рыночной) — селектор 7/30/90 дней, 4 KPI-карточки (события/юзеры/24ч), recharts line-chart событий по дням, топ-поиски / топ-пути / по-аккаунтам.

Гейтинг (безопасность)

  • Topbar NAV_ITEMS с admin scopePath /trade-in/api/v1/admin/{audit,analytics} — по образцу /scrapers (НЕ /cache, который открыт pilot). pilot.deny: /trade-in/api/v1/admin/** в roles.yaml уже покрывает — конфиг не меняется.
  • Реальная защита — на API-слое: backend отдаёт 403 не-админам (централь _ADMIN_API_RE). Страницы ловят 403 → NoAccessScreen, не крашатся. retry: false — 403 не ретраит.

Детали

  • Типы lib/admin-audit-api.ts — hand-written (у tradein-mvp/frontend нет codegen-скрипта), зеркалят app/schemas/audit.py. Без новых зависимостей (recharts уже был) → lockfile не тронут.
  • tradein-mvp/frontend без Tailwind — стили в trade-in.css по конвенции проекта (переиспользованы .scraper-*/.runs-table, добавлены .admin-*). TanStack Query (не legacy fetch-in-useEffect).

Проверки

  • tsc --noEmit — 0 ошибок; eslint по новым файлам — 0 ворнингов; без drift package.json/lock.
  • Backend read-API уже проверен на проде (200, реальные адреса в top_searches).

Post-deploy: playwright-проверка рендера под admin.

## Что Admin-дашборды поверх read-API (#2520) — визуализация фич 2 (учёт входов/IP + что ищут) и 3 (поведенческая аналитика). ## Страницы (admin-only) - **`/admin/audit`** («Аудит доступа») — таблица аккаунтов (last/first seen, #IP, #устройств, logins/requests/searches); клик по аккаунту → аккордеон-drilldown: IP-адреса (first/last/count), устройства (user-agent), недавние поиски (адрес + когда + с какого IP), недавняя активность. - **`/admin/analytics`** («Активность» — намеренно не «Аналитика», чтобы не путать с рыночной) — селектор 7/30/90 дней, 4 KPI-карточки (события/юзеры/24ч), recharts line-chart событий по дням, топ-поиски / топ-пути / по-аккаунтам. ## Гейтинг (безопасность) - Topbar NAV_ITEMS с admin `scopePath` `/trade-in/api/v1/admin/{audit,analytics}` — по образцу `/scrapers` (НЕ `/cache`, который открыт `pilot`). `pilot.deny: /trade-in/api/v1/admin/**` в `roles.yaml` уже покрывает — **конфиг не меняется**. - Реальная защита — на API-слое: backend отдаёт 403 не-админам (централь `_ADMIN_API_RE`). Страницы ловят 403 → `NoAccessScreen`, не крашатся. `retry: false` — 403 не ретраит. ## Детали - Типы `lib/admin-audit-api.ts` — hand-written (у tradein-mvp/frontend нет codegen-скрипта), зеркалят `app/schemas/audit.py`. **Без новых зависимостей** (recharts уже был) → lockfile не тронут. - tradein-mvp/frontend без Tailwind — стили в `trade-in.css` по конвенции проекта (переиспользованы `.scraper-*`/`.runs-table`, добавлены `.admin-*`). TanStack Query (не legacy fetch-in-useEffect). ## Проверки - `tsc --noEmit` — 0 ошибок; eslint по новым файлам — 0 ворнингов; без drift package.json/lock. - Backend read-API уже проверен на проде (200, реальные адреса в top_searches). Post-deploy: playwright-проверка рендера под admin.
lekss361 added 1 commit 2026-07-13 20:44:08 +00:00
feat(tradein/admin): audit + activity dashboards (Feature 2/3 UI)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Successful in 1m1s
d0e29ce914
Admin-only read dashboards over the merged user_events audit API (#2520):
- /admin/audit — accounts table (IP/device/login/search counts) with a
  click-to-expand drilldown per account (IPs, devices, recent searches,
  recent raw activity).
- /admin/analytics — "Активность" (user-behavior analytics, distinct from
  the market-analytics overlay label): summary KPI cards, a 7/30/90-day
  events/users line chart (recharts), top-searches/top-paths/by-account
  tables.

Both pages are admin-only via the existing Topbar NAV_ITEMS admin-scopePath
convention (mirrors /scrapers) so non-admin roles never see the nav entries;
a direct-URL 403 from the API is caught and rendered as NoAccessScreen
instead of crashing, matching the RouteGuard "user" variant.
lekss361 merged commit c904fbf94e into main 2026-07-13 20:45:35 +00:00
lekss361 deleted branch feat/tradein-admin-dashboards 2026-07-13 20:45:35 +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#2521
No description provided.