12 KiB
EventHub Admin UI — Техническое задание (MVP)
1. Роли и права доступа
| Роль | Идентификатор | Права |
|---|---|---|
| Суперадмин | superadmin |
Полный доступ ко всем модулям, включая изменение ролей других админов, просмотр аудита, системные настройки. |
| Модератор | moderator |
Модерация событий и жалоб, блокировка/разблокировка пользователей, работа с баг-трекером. |
| Поддержка | support |
Просмотр пользователей и событий (read-only), обработка жалоб, создание и обновление багов. |
Примечание: До реализации backend-эндпоинтов для управления ролями подразумевается одна роль admin (синоним superadmin).
2. Модули панели
2.1. Дашборд (Dashboard)
Виджеты:
- Статистика по пользователям: всего, новых за сегодня, активных за неделю.
- Статистика по событиям: всего, ожидают модерации, опубликовано, отклонено.
- Статистика по жалобам: новых, в обработке.
- График регистраций/событий по дням (за последние 30 дней) — если API предоставляет агрегации; иначе заглушка.
- Последние действия модераторов (аудит) — последние 10 записей.
Источник данных: GET /api/stats/* (приоритетный) или агрегация из списков ресурсов через X-Total-Count.
2.2. Управление пользователями
Эндпоинты: GET /api/users, GET /api/users/:id, PUT /api/users/:id, DELETE /api/users/:id
Функциональность:
- Список пользователей (ID, username, email, роль, дата регистрации, статус, рейтинг).
- Фильтрация: по роли, статусу, поиск по username/email.
- Детальная карточка:
- Основная информация, аватар.
- Список событий пользователя.
- История жалоб на пользователя.
- Блокировка/разблокировка, смена роли (только суперадмин).
- Причина блокировки (поле ввода).
- Массовые действия: блокировка/удаление выбранных пользователей.
Особые требования: Подтверждение деструктивных действий через модальное окно.
2.3. Управление событиями
Эндпоинты: GET /api/events, GET /api/events/:id, PUT /api/events/:id, DELETE /api/events/:id, а также эндпоинт модерации (например, PATCH /api/events/:id/approve)
Функциональность:
- Список событий (название, организатор, календарь, статус, количество записей).
- Фильтрация: по статусу, календарю, дате.
- Детальный просмотр:
- Полная информация о событии (описание, дата-время, локация, тип).
- Список записей участников с возможностью ручного подтверждения/отклонения.
- Кнопки «Одобрить» / «Отклонить» (изменение статуса с
pendingнаapproved/rejected). - При отклонении — обязательное указание причины.
- Редактирование любого поля события.
- Удаление с подтверждением.
2.4. Управление календарями
Эндпоинты: GET /api/calendars, POST /api/calendars, PUT /api/calendars/:id, DELETE /api/calendars/:id
Функциональность:
- Список календарей (название, владелец, тип, количество подписчиков).
- Детальный просмотр: информация, возможность деактивации календаря.
- Создание коммерческого календаря (опционально, если требуется админам).
- Просмотр списка подписчиков (только чтение).
2.5. Модерация жалоб
Эндпоинты: GET /api/complaints, GET /api/complaints/:id, PUT /api/complaints/:id
Функциональность:
- Список жалоб (ID, тип, подавший, объект жалобы, статус).
- Фильтрация: по статусу, типу.
- Детальный просмотр:
- Текст жалобы, прикреплённые файлы/ссылки.
- Информация о нарушителе/событии.
- Кнопки «Рассмотрено» и «Отклонить».
- Возможность перехода к блокировке пользователя/события прямо из карточки жалобы.
2.6. Баг-трекер
Эндпоинты: GET /api/bugs, POST /api/bugs, PUT /api/bugs/:id, DELETE /api/bugs/:id
Функциональность:
- Список багов (ID, заголовок, статус, приоритет, назначенный, дата создания).
- Детальный просмотр: описание, шаги воспроизведения, скриншоты.
- Смена статуса, назначение ответственного из числа админов.
- Комментарии к багу (если поддержано API).
- Создание новых багов (только внутренние, не от пользователей).
3. Интеграция с API и аутентификация
- JWT-аутентификация, аналогичная основному приложению.
- Эндпоинт входа:
/api/auth/login(или/api/admin/login). - Токен сохраняется в
localStorageи добавляется ко всем запросам (Authorization: Bearer ...). - При получении HTTP 401 — редирект на страницу входа.
- Для дашборда использовать специальные эндпоинты
/api/stats/*; если их нет — собирать статистику через заголовокX-Total-Countи множественные запросы (временно).
4. Требования к UX/UI
- Material Design (React-Admin + MUI).
- Адаптивная верстка (планшеты).
- Пагинация (серверная предпочтительна, клиентская допустима для малых объемов).
- Сортировка по любому полю.
- Поиск с debounce 300 мс.
- Подтверждение деструктивных действий (удаление, блокировка).
- Уведомления об успехе/ошибке через Snackbar.
- Тёмная тема (опционально, переключатель).
5. Технологический стек
- Язык: TypeScript
- Сборщик: Vite
- UI-фреймворк: React-Admin v5 + Material UI v5
- Провайдер данных:
ra-data-simple-restс кастомизацией для JWT - Аутентификация: кастомный
authProvider - Контейнеризация: Docker, Nginx
6. Этапы реализации (MVP)
- Неделя 1: Инициализация проекта (Vite + React-Admin), простой dataProvider, страница входа.
- Неделя 2: Модуль пользователей (список, детали, блокировка).
- Неделя 3: Модуль событий (список, модерация).
- Неделя 4: Модули жалоб, баг-трекера, календарей (базовый просмотр/изменение статусов).
- Неделя 5: Дашборд (если API готово), финальные штрихи, тестирование, деплой в staging.
7. Что потребуется от бэкенда (EventHubBack)
7.1 Роли и права доступа
Описать три административные роли: superadmin, moderator, support.
В JWT-токене после аутентификации передавать поле role с одним из этих значений. Оставить поддержку "role": "admin" как синоним superadmin для обратной совместимости.
Middleware авторизации для админских эндпоинтов (/admin/* или порты 8445/8446) должен:
- Проверять валидность JWT.
- Извлекать роль.
- Сопоставлять с требуемыми правами для каждого действия.
Эндпоинт получения текущей роли:
GET /admin/me(илиGET /api/auth/me) — возвращает{ id, username, role, permissions }.
Эндпоинты управления ролями (только для superadmin):
GET /admin/admins— список администраторов.PUT /admin/admins/:id— изменить роль.POST /admin/admins— пригласить нового администратора.
Логирование действий (аудит):
- Таблица
admin_audit(admin_id, username, роль, действие, тип объекта, ID объекта, timestamp, IP, причина). - Эндпоинт
GET /admin/auditс фильтрами (доступен толькоsuperadmin).
При блокировке пользователя / отклонении события обязательно принимать поле reason в теле запроса и сохранять в БД.
Разграничение прав на уровне API:
support: read-only пользователи и события; может обновлять статусы жалоб и багов, создавать баги.moderator: всё, кроме управления админами и просмотра аудита.superadmin: полный доступ.
Ответ при недостаточности прав: 403 Forbidden, тело:
{ "error": "insufficient_permissions", "message": "Требуется роль moderator или выше" }
## 7.2 Статистика для дашборда с учётом ролей
| Роль | Предоставляемые метрики |
|------|--------------------------|
| `superadmin` | Системные метрики (все пользователи, события, жалобы, баги за период, графики регистраций/событий по дням, активность администраторов). |
| `moderator` | Собственные обработанные жалобы/события (количество, статусы, время реакции), общая статистика по модерации. |
| `support` | Количество открытых багов и жалоб, назначенных на текущего сотрудника, персональные задачи. |
Эндпоинт `GET /api/stats` должен возвращать JSON с секциями, доступными согласно роли вызывающего.