Сделать доработки запрошенные фронтом #2

Closed
opened 2026-04-26 11:44:01 +03:00 by aleksey · 0 comments
Owner

Задачи бэкенда EventHubBack для поддержки Admin UI (актуально)

Критические исправления (MVP)

  • Перенести все админские эндпоинты на порт 8445 и добавить отдельную авторизацию для админов

    • Все обработчики административной панели должны обслуживаться исключительно на порту 8445 (HTTPS/WSS).
    • Реализовать отдельный механизм JWT-аутентификации для админского API: использовать или отдельный секретный ключ, или поле role с дополнительной проверкой aud (audience). Пользовательские токены не должны давать доступ к админским ресурсам.
    • Единый префикс: все эндпоинты админки должны быть доступны по пути /admin/... (например, https://admin.eventhub.local:8445/admin/users).
      Это устранит дублирование между портами 8445 и 8080 и повысит безопасность.
  • Добавить версионность в API админки
    Привести все админские эндпоинты к единому версионному префиксу /v1/admin/... на порту 8445 (аналогично пользовательскому API).
    Пример: GET /v1/admin/users, PUT /v1/admin/events/:id/freeze.
    Поддержка обратной совместимости на период миграции (редирект со старых путей или временный прокси).

  • Добавить недостающие админские эндпоинты
    Сейчас из всех ресурсов Admin UI работает только /admin/users (порт 8445). Требуется реализовать CRUD (хотя бы GET list) для:

    • GET /v1/admin/events (список событий с фильтрацией)
    • GET /v1/admin/calendars
    • GET /v1/admin/tickets (уже частично работает на порту 8080, перенести на 8445)
    • GET /v1/admin/reports
    • GET /v1/admin/reviews
    • GET /v1/admin/banned-words
    • и соответствующие действия модерации (approve/reject, freeze/unfreeze).
      Приоритет: сначала events и calendars, затем остальные.

Ролевая модель и аудит

  • Автосоздание суперадмина при первой инициализации базы
    При старте приложения проверять, есть ли в таблице users хотя бы одна запись. Если пользователей нет — автоматически создавать учётную запись с ролью superadmin, используя параметры из .env:

    • ADMIN_EMAIL
    • ADMIN_PASSWORD
    • (опционально) ADMIN_USERNAME (по умолчанию admin).
      Никогда не перезаписывать существующего пользователя.
  • Добавить миграцию для поля role в таблице users
    Сейчас роль хранится как <<"admin">>. Нужно зарезервировать значения superadmin, moderator, support и обновить существующих пользователей.

  • Реализовать middleware проверки ролей
    В каждом админском обработчике проверять JWT и извлекать роль. Возвращать 403 при недостаточности прав (например, support не может менять роли).

  • Эндпоинт GET /v1/admin/me
    Возвращает { id, email, role, permissions } для текущего администратора. Нужен для динамического скрытия элементов в UI.

  • Управление ролями (только для superadmin)

    • GET /v1/admin/admins – список всех админов с ролями.
    • PUT /v1/admin/admins/:id – изменение роли.
    • POST /v1/admin/admins – приглашение нового админа (с отправкой email).
  • Аудит действий администраторов

    • Таблица admin_audit (admin_id, email, role, action, entity_type, entity_id, timestamp, ip, reason).
    • Запись при каждом изменении (блокировка, модерация, смена роли).
    • GET /v1/admin/audit с фильтрами (по дате, админу, действию) – доступен только superadmin.

Статистика для дашборда

  • Эндпоинт GET /v1/admin/stats
    Возвращает агрегированные данные в зависимости от роли:
    • superadmin: общее количество пользователей, событий, жалоб, багов; график регистраций/событий по дням.
    • moderator: свои обработанные жалобы/события (количество, статусы).
    • support: количество открытых багов и жалоб, назначенных на текущего.

Улучшение безопасности и обработки ошибок

  • При блокировке/отклонении принимать и сохранять reason
    Во все методы, изменяющие статус (блокировка пользователя, отклонение события, жалобы), добавить обязательное поле reason и сохранять в БД.

  • CORS-заголовки для админского сервера
    Убедиться, что порт 8445 отдаёт Access-Control-Expose-Headers: Content-Range . Если нужно, добавить.

  • Валидация входных данных
    Особенно для создания/редактирования сущностей (email, обязательные поля).

Инициализация и инфраструктура

  • Переделать связь нод в кластере на автоматическое обнаружение
    Убрать статический JOIN_NODES. Вместо него реализовать механизм автоматического поиска узлов через DNS-лукап или библиотеку libcluster (стратегия Cluster.Strategy.DNSPoll), используя общее DNS-имя сервиса (например, eventhub-node). Ноды должны самостоятельно находить друг друга и формировать кластер без ручного указания имён.
# Задачи бэкенда EventHubBack для поддержки Admin UI (актуально) ## Критические исправления (MVP) - [x] **Перенести все админские эндпоинты на порт 8445 и добавить отдельную авторизацию для админов** - Все обработчики административной панели должны обслуживаться исключительно на порту 8445 (HTTPS/WSS). - Реализовать отдельный механизм JWT-аутентификации для админского API: использовать или отдельный секретный ключ, или поле `role` с дополнительной проверкой `aud` (audience). Пользовательские токены не должны давать доступ к админским ресурсам. - Единый префикс: все эндпоинты админки должны быть доступны по пути `/admin/...` (например, `https://admin.eventhub.local:8445/admin/users`). *Это устранит дублирование между портами 8445 и 8080 и повысит безопасность.* - [x] **Добавить версионность в API админки** Привести все админские эндпоинты к единому версионному префиксу `/v1/admin/...` на порту 8445 (аналогично пользовательскому API). Пример: `GET /v1/admin/users`, `PUT /v1/admin/events/:id/freeze`. Поддержка обратной совместимости на период миграции (редирект со старых путей или временный прокси). - [x] **Добавить недостающие админские эндпоинты** Сейчас из всех ресурсов Admin UI работает только `/admin/users` (порт 8445). Требуется реализовать CRUD (хотя бы GET list) для: - `GET /v1/admin/events` (список событий с фильтрацией) - `GET /v1/admin/calendars` - `GET /v1/admin/tickets` (уже частично работает на порту 8080, перенести на 8445) - `GET /v1/admin/reports` - `GET /v1/admin/reviews` - `GET /v1/admin/banned-words` - и соответствующие действия модерации (approve/reject, freeze/unfreeze). *Приоритет:* сначала `events` и `calendars`, затем остальные. ## Ролевая модель и аудит - [x] **Автосоздание суперадмина при первой инициализации базы** При старте приложения проверять, есть ли в таблице `users` хотя бы одна запись. Если пользователей нет — автоматически создавать учётную запись с ролью `superadmin`, используя параметры из `.env`: - `ADMIN_EMAIL` - `ADMIN_PASSWORD` - (опционально) `ADMIN_USERNAME` (по умолчанию `admin`). Никогда не перезаписывать существующего пользователя. - [x] **Добавить миграцию для поля `role` в таблице `users`** Сейчас роль хранится как `<<"admin">>`. Нужно зарезервировать значения `superadmin`, `moderator`, `support` и обновить существующих пользователей. - [x] **Реализовать middleware проверки ролей** В каждом админском обработчике проверять JWT и извлекать роль. Возвращать `403` при недостаточности прав (например, `support` не может менять роли). - [x] **Эндпоинт `GET /v1/admin/me`** Возвращает `{ id, email, role, permissions }` для текущего администратора. Нужен для динамического скрытия элементов в UI. - [x] **Управление ролями (только для `superadmin`)** - `GET /v1/admin/admins` – список всех админов с ролями. - `PUT /v1/admin/admins/:id` – изменение роли. - `POST /v1/admin/admins` – приглашение нового админа (с отправкой email). - [x] **Аудит действий администраторов** - Таблица `admin_audit` (admin_id, email, role, action, entity_type, entity_id, timestamp, ip, reason). - Запись при каждом изменении (блокировка, модерация, смена роли). - `GET /v1/admin/audit` с фильтрами (по дате, админу, действию) – доступен только `superadmin`. ## Статистика для дашборда - [x] **Эндпоинт `GET /v1/admin/stats`** Возвращает агрегированные данные в зависимости от роли: - `superadmin`: общее количество пользователей, событий, жалоб, багов; график регистраций/событий по дням. - `moderator`: свои обработанные жалобы/события (количество, статусы). - `support`: количество открытых багов и жалоб, назначенных на текущего. ## Улучшение безопасности и обработки ошибок - [x] **При блокировке/отклонении принимать и сохранять `reason`** Во все методы, изменяющие статус (блокировка пользователя, отклонение события, жалобы), добавить обязательное поле `reason` и сохранять в БД. - [x] **CORS-заголовки для админского сервера** Убедиться, что порт 8445 отдаёт `Access-Control-Expose-Headers: Content-Range` . Если нужно, добавить. - [x] **Валидация входных данных** Особенно для создания/редактирования сущностей (email, обязательные поля). ## Инициализация и инфраструктура - [x] **Переделать связь нод в кластере на автоматическое обнаружение** Убрать статический `JOIN_NODES`. Вместо него реализовать механизм автоматического поиска узлов через DNS-лукап или библиотеку `libcluster` (стратегия `Cluster.Strategy.DNSPoll`), используя общее DNS-имя сервиса (например, `eventhub-node`). Ноды должны самостоятельно находить друг друга и формировать кластер без ручного указания имён.
aleksey self-assigned this 2026-04-26 11:44:01 +03:00
aleksey added the Story label 2026-04-26 11:49:46 +03:00
aleksey added reference master 2026-04-26 22:28:32 +03:00
aleksey added a new dependency 2026-04-26 22:43:40 +03:00
aleksey added a new dependency 2026-04-26 22:43:50 +03:00
aleksey added a new dependency 2026-04-26 22:44:14 +03:00
Sign in to join this conversation.