# web-admin Next.js 15 App Router + shadcn/ui (стиль `new-york`, base `neutral`) + Recharts + TanStack Query. Порт: **3001** (3000 занят `hr_v2_next`). ## Запуск ```bash pnpm --filter=@reception/web-admin dev # → http://localhost:3001 ``` Логин: dev-юзеры из `packages/db/prisma/seed.ts`: - `senior@local / senior123` — Старший администратор (видит Enrollment, Пациенты) - `manager@local / manager123` — Управляющий (Дашборд, Пациенты) - `admin@local / admin123` — Админ системы (Аудит, Пациенты) - `security@local / security123` — Безопасность (Инциденты) ## Структура ``` src/ app/ layout.tsx # root layout с ThemeProvider + Toaster page.tsx # redirect по роли login/page.tsx # вход (authed)/ layout.tsx # серверный гард + AppShell dashboard/page.tsx # Управляющий enrollment/page.tsx # Старший администратор (M10) patients/ # M11 incidents/page.tsx # Безопасность (заглушка) audit/page.tsx # Админ системы (M11) components/ app-shell.tsx # сайдбар + топбар (фильтр nav по роли) login-form.tsx # форма входа theme-provider.tsx # next-themes ui/ # shadcn компоненты lib/ auth.ts # серверные actions: login/logout/getCurrentUser api.ts # серверный fetch с проксированием cookies utils.ts # cn, formatDateTime, formatDuration middleware.ts # редирект на /login если нет access_token ``` ## Эндпоинты apps/api, используемые в web-admin | Метод | Путь | Где | |---|---|---| | `POST` | `/auth/login` | login form (server action) | | `POST` | `/auth/logout` | header logout (server action) | | `GET` | `/auth/me` | `getCurrentUser()` | | `GET` | `/tracks?status=UNMATCHED` | /enrollment (M10) | | `GET` | `/polimed/appointments?date=...` | /enrollment (M10) | | `POST` | `/enrollment` | /enrollment submit (M10) | | `GET` | `/patients` | /patients (M11) | | `GET` | `/patients/:id/visits` | /patients/:id (M11) | | `POST` | `/consents/:patientId/revoke` | /patients revoke (M11) | | `GET` | `/audit/biometry` | /audit (M11) |