From a2526ffb252a0215c8abe4bb8e028cab48d7354f Mon Sep 17 00:00:00 2001 From: Aleksey Sabilin Date: Tue, 7 Jul 2026 21:02:49 +0300 Subject: [PATCH] Align specs with implementation. Refs EventHub/EventHubSpec#2 --- EventHubBackSpec.md | 9 +++++---- EventHubFrontAdminSpec.md | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/EventHubBackSpec.md b/EventHubBackSpec.md index 32c123f..f9f834f 100644 --- a/EventHubBackSpec.md +++ b/EventHubBackSpec.md @@ -262,15 +262,15 @@ src/ - `GET /v1/calendars/:calendar_id/view?month=YYYY-MM` — HTML-календарь (владелец), включая архив. ### Административные (порт 8445) -- `GET /v1/admin/health` — состояние сервера. -- `GET /v1/admin/stats` — статистика. +- `GET /admin/health` — состояние сервера (без префикса `/v1`; используется в CT и Traefik healthcheck). +- `GET /v1/admin/stats` — агрегированная статистика дашборда. - `POST /v1/admin/login` — вход администратора. - `POST /v1/admin/refresh` — обновление пары access/refresh JWT администратора. - `GET /v1/admin/users`, `GET /v1/admin/users/:id` — пользователи. - `GET /v1/admin/reports`, `GET /v1/admin/reports/:id` — жалобы. - `DELETE /v1/admin/reviews/:id` — удалить отзыв. - `GET /v1/admin/banned-words`, `POST /v1/admin/banned-words` — запрещённые слова. -- `GET /v1/admin/tickets/stats` — статистика тикетов. +- `GET /v1/admin/tickets/stats` — статистика тикетов: `total_tickets`, `open`, `in_progress`, `resolved`, `closed`, `total_errors`. - `GET /v1/admin/tickets`, `GET /v1/admin/tickets/:id` — управление тикетами. - `GET /v1/admin/subscriptions`, `POST /v1/admin/subscriptions/:id` — подписки. - `PUT /v1/admin/:target_type/:id` — модерация. @@ -282,9 +282,10 @@ src/ ### Общие принципы - Пользователи и администраторы используют разные эндпоинты и JWT-секреты. -- Access-токен — короткоживущий stateless JWT (HS256). +- Access-токен — короткоживущий stateless JWT (HS256), **TTL 86400 с (24 ч)** — `eventhub_auth:generate_token/4`. - Refresh-токен — 30 дней; подписанный JWT в единой session-модели (`auth_session`). - Все защищённые эндпоинты требуют заголовок `Authorization: Bearer `. +- **Source of truth:** `EventHubSpec` (этот документ); Swagger в репозитории — вторичная справка, синхронизируется по факту кода. ### Единая session-модель (`auth_session`) diff --git a/EventHubFrontAdminSpec.md b/EventHubFrontAdminSpec.md index c66330d..bb0dc54 100644 --- a/EventHubFrontAdminSpec.md +++ b/EventHubFrontAdminSpec.md @@ -9,7 +9,7 @@ | Модератор | `moderator` | Работа с жалобами и отзывами. Остальные разделы недоступны. | | Поддержка | `support` | Работа с тикетами (баг-трекер). Остальные разделы недоступны. | -Права проверяются на уровне фронтенда: пункты меню и маршруты отображаются или скрываются в зависимости от роли, полученной из `GET /v1/admin/me`. +Права проверяются на уровне фронтенда: пункты меню и маршруты (`RoleGuard` в `App.tsx`, конфиг `src/config/adminAccess.ts`) ограничены по роли из `GET /v1/admin/me`; при прямом URL без прав — страница 403. ## 2. Аутентификация и авторизация @@ -184,7 +184,7 @@ Эндпоинт: `wss://<домен>/admin/ws?token=` Функциональность: -- При входе устанавливается WebSocket-соединение. +- При входе устанавливается WebSocket-соединение; при logout или смене `accessToken` сокет явно закрывается, reconnect отменяется, метрики в store сбрасываются. - Подписка на каналы `reports` и `tickets`. - При получении сообщения `{ type: "report_created" }` или `{ type: "ticket_created" }` показывается уведомление со ссылкой на соответствующую страницу. - Автоматическое переподключение при разрыве соединения.