172 lines
6.1 KiB
Markdown
172 lines
6.1 KiB
Markdown
# CarPass Admin Control Center
|
||
|
||
Admin Control Center дает администраторам закрытого пилота безопасный доступ к событиям сервиса, модерации СТО, просмотру данных и экспорту без прямого SQL.
|
||
|
||
## Доступ
|
||
|
||
Админка открывается в Mini App по `/admin.html` или командой бота `/admin`.
|
||
|
||
Роли:
|
||
|
||
- `super_admin`: полный доступ к пользователям, СТО, заявкам, заказ-нарядам, расходам, audit, export и системным настройкам.
|
||
- `admin`: пользователи, СТО, модерация, заказ-наряды, базовая аналитика и экспорт без секретов.
|
||
- `moderator`: заявки СТО, отзывы, блокировки и комментарии модерации.
|
||
- `support`: поиск пользователя, авто, история действий и помощь без расширенных финансовых агрегатов.
|
||
- `analyst`: агрегированная аналитика и обезличенные выгрузки без персональных данных.
|
||
|
||
Все чувствительные admin actions пишутся в `AuditLog`.
|
||
|
||
## Уведомления
|
||
|
||
Система создает `AdminNotification` в БД и best-effort отправляет Telegram-сообщение администраторам. Ошибка Telegram не ломает бизнес-flow.
|
||
|
||
Поддержанные события:
|
||
|
||
- новый пользователь;
|
||
- первое авто пользователя;
|
||
- новая заявка СТО;
|
||
- изменение статуса заявки СТО;
|
||
- одобрение, блокировка и разблокировка СТО;
|
||
- security/system события через общий admin notification service.
|
||
|
||
Idempotency key защищает от дублей.
|
||
|
||
Env:
|
||
|
||
```env
|
||
ADMIN_TELEGRAM_IDS=123,456
|
||
ADMIN_NOTIFICATION_CHAT_ID=
|
||
ADMIN_NOTIFY_NEW_USERS=true
|
||
ADMIN_NOTIFY_STO_APPLICATIONS=true
|
||
ADMIN_NOTIFY_SECURITY_EVENTS=true
|
||
ADMIN_NOTIFY_SYSTEM_ERRORS=true
|
||
```
|
||
|
||
## Admin API
|
||
|
||
Dashboard:
|
||
|
||
- `GET /api/admin/dashboard`
|
||
|
||
Notifications:
|
||
|
||
- `GET /api/admin/notifications`
|
||
- `POST /api/admin/notifications/{id}/read`
|
||
- `POST /api/admin/notifications/read-all`
|
||
- `POST /api/admin/notifications/retry`
|
||
- `POST /api/admin/notifications/{id}/dismiss`
|
||
|
||
Data Explorer:
|
||
|
||
- `GET /api/admin/data/sources`
|
||
- `POST /api/admin/data/query`
|
||
- `POST /api/admin/data/export`
|
||
|
||
Users:
|
||
|
||
- `GET /api/admin/users`
|
||
- `GET /api/admin/users/{id}`
|
||
- `GET /api/admin/users/{id}/activity`
|
||
- `POST /api/admin/users/{id}/note`
|
||
- `POST /api/admin/users/{id}/block`
|
||
- `POST /api/admin/users/{id}/unblock`
|
||
|
||
СТО:
|
||
|
||
- `GET /api/admin/sto`
|
||
- `GET /api/admin/sto/{id}`
|
||
- `GET /api/admin/sto-applications`
|
||
- `POST /api/admin/sto-applications/{id}/approve`
|
||
- `POST /api/admin/sto-applications/{id}/reject`
|
||
- `POST /api/admin/sto-applications/{id}/request-changes`
|
||
- `POST /api/admin/sto/{id}/suspend`
|
||
- `POST /api/admin/sto/{id}/unsuspend`
|
||
|
||
Audit and exports:
|
||
|
||
- `GET /api/admin/audit-log`
|
||
- `GET /api/admin/exports`
|
||
- `GET /api/admin/exports/{id}`
|
||
|
||
## Data Explorer
|
||
|
||
Data Explorer работает только по whitelist источников и полей. Произвольный SQL из UI не принимается.
|
||
|
||
Источники:
|
||
|
||
- `users`
|
||
- `vehicles`
|
||
- `fuel_entries`
|
||
- `service_entries`
|
||
- `expense_entries`
|
||
- `sto_profiles`
|
||
- `sto_applications`
|
||
- `sto_employees`
|
||
- `vehicle_sto_links`
|
||
- `appointments`
|
||
- `work_orders`
|
||
- `work_order_items`
|
||
- `work_order_products`
|
||
- `reviews`
|
||
- `notifications`
|
||
- `admin_notifications`
|
||
- `audit_logs`
|
||
- `imports_exports`
|
||
|
||
Поддержаны фильтры по дате, статусу, пользователю, Telegram ID, авто, СТО, городу, роли, категории, сумме, ошибкам и текстовому поиску. Каждый запрос ограничен `limit` до 500 строк и пишет audit log.
|
||
|
||
## Privacy
|
||
|
||
По умолчанию маскируются Telegram ID, VIN, госномер, телефон и регистрационные данные СТО.
|
||
|
||
Полный просмотр sensitive data:
|
||
|
||
- доступен только `admin` и `super_admin`;
|
||
- требует `reason`;
|
||
- пишет audit log;
|
||
- не раскрывает bot token, env, internal token, secret fields.
|
||
|
||
`analyst` видит только обезличенные или замаскированные персональные данные.
|
||
|
||
## Модерация СТО
|
||
|
||
Очередь заявок доступна в `/admin.html?section=sto-applications`.
|
||
|
||
Действия:
|
||
|
||
- approve;
|
||
- reject with reason;
|
||
- request changes with reason;
|
||
- suspend;
|
||
- unsuspend.
|
||
|
||
При изменении статуса создаются audit log, admin notification и уведомление владельцу СТО.
|
||
|
||
## Bot Commands
|
||
|
||
Админские команды бота:
|
||
|
||
- `/admin`
|
||
- `/admin_stats`
|
||
- `/admin_users`
|
||
- `/admin_sto`
|
||
- `/admin_pending_sto`
|
||
- `/admin_alerts`
|
||
|
||
API дополнительно проверяет роль пользователя, поэтому команда не дает доступа без admin-role в БД.
|
||
|
||
## Deploy Reports
|
||
|
||
Для временного rsync-деплоя есть `scripts/rsync_deploy.sh`. Скрипт:
|
||
|
||
- запускает локальные `ruff` и `pytest`;
|
||
- отправляет Telegram progress/failure/success отчеты;
|
||
- делает remote code backup без `.env`;
|
||
- синхронизирует код через `rsync`;
|
||
- собирает Docker images;
|
||
- применяет Alembic migrations;
|
||
- поднимает `api` и `bot`;
|
||
- проверяет `/health`, `/ready`, `/metrics`, `/admin.html`, `/sto.html`, `/work_order.html`.
|
||
|
||
Утилита `scripts/send_telegram_report.py` берет получателей из `ADMIN_NOTIFICATION_CHAT_ID`, `ADMIN_TELEGRAM_IDS` и, если env пустой, из пользователей БД с ролями `admin`, `super_admin`, `moderator`, `support`.
|