# Админка — права, модерация, метрики

Источник: https://docs.novapoker.ru/dev/admin/
Дорожка: разработка
Сверено с кодом: Mon Aug 24
Код: repos/poker-admin/src, repos/poker-api/apps/server/src/admin, repos/poker-api/apps/server/src/auth/permissions.ts

---

Вход тот же, что везде — телефон и код. Дальше `AdminGate`: аккаунт **без**
`adminRole` видит экран «Нет доступа» и кнопку «Выйти».

Первый супер-админ бутстрапится из `PLATFORM_ADMIN_PHONES` на бэкенде и дальше
раздаёт роли остальным. Подробности гейта — в
[аутентификации и ролях](https://docs.novapoker.ru/dev/auth.md).

## Разделы и права

Навигация фильтруется дважды: компонентом `RequirePermission` и фильтром в
`Layout`. Источник истины всё равно серверный — интерфейс лишь прячет
недоступное.

| Раздел | Право |
|---|---|
| Дашборд | `metrics.view` |
| Организаторы | `organizers.manage` |
| Турниры | `content.manage` |
| Игроки | `moderation` |
| Рейтинг | `rating_config.manage` |
| Сезоны | `seasons.manage` |
| Города | `cities.manage` |
| Слайдеры | `content.manage` |
| Тиры | `content.manage` |
| Админы | `admins.manage` |
| Рассылка | `push.send` |

Матрица «роль → права» — в `apps/server/src/auth/permissions.ts`, она же
приведена в [статье про аутентификацию](https://docs.novapoker.ru/dev/auth.md).

## Модерация

| Метод и путь | Что делает |
|---|---|
| `GET /admin/users` | поиск |
| `PATCH /admin/users/{id}` | бан и разбан guarded-апдейтом |
| `POST /admin/users/{id}/merge` | слияние дублей |

**Слияние идёт в одной интерактивной транзакции:** регистрации дубля переезжают
на основной аккаунт — кроме турниров, где у основного уже есть своя запись.
Иначе нарушился бы уникальный индекс `(tournamentId, userId)`.

## Метрики

`GET /admin/metrics` считает:

- новых игроков за 30 дней;
- активных игроков за 30 дней;
- retention — долю сыгравших два турнира и больше;
- завершённые турниры за 30 дней;
- разбивку по 8 неделям.

**Недели считаются с понедельника, в UTC.** Это стоит помнить, сверяя цифры с
календарём клуба в другом часовом поясе.

## Рассылка

`POST /admin/push` с таргетом `all | tournament | city | users`; для `users`
принимаются идентификаторы и телефоны. Возвращает `{ targeted, pushed }` и
пишет аудит.

Два числа расходятся, когда у части адресатов нет активных токенов устройств.

## Управление турнирами со стороны платформы

Платформа может завести турнир **за любой клуб**: `POST /admin/organizers/{id}/tournaments`.
Ей же доступен пересчёт результатов — `POST /admin/tournaments/{id}/recount`,
описанный в [результатах и аудите](https://docs.novapoker.ru/dev/results.md).

## Аудит

`AuditLog` пишется на действия live (старт, пауза, смена уровня, вылеты,
подтверждение), на рассылки и на админские операции.

## Что рядом

- [Что ведёт платформа](https://docs.novapoker.ru/product/platform.md) — то же словами продукта.
- [poker-admin](https://docs.novapoker.ru/dev/poker-admin.md) — как запустить админку.
- [Рейтинг: пакет формул](https://docs.novapoker.ru/dev/rating.md) — что меняет раздел «Рейтинг».
