Implement support ticket system with role request and bug report functionalities
CI / Backend (build + test) (push) Successful in 1m18s
CI / Frontend (lint + typecheck + build) (push) Successful in 31s

- Introduced a new support ticket system allowing users to submit bug reports and role requests.
- Implemented endpoints for creating, updating, and managing support tickets, including file attachments.
- Enhanced Telegram bot integration to handle role requests directly within the bot, enabling admins to approve or reject requests without accessing the website.
- Updated database schema to include support ticket entities and their relationships.
- Improved API documentation to reflect new support ticket endpoints and their usage.
- Added necessary localization for support ticket features in both Russian and English.
This commit is contained in:
Leonid Pershin
2026-07-14 06:49:05 +03:00
parent 14b64a3140
commit b5630b2685
98 changed files with 4463 additions and 6 deletions
+37
View File
@@ -33,6 +33,12 @@ Telegram-бот — **второй канал доставки** (presentation-
Зарегистрироваться»; плюс кнопка «🌐 Сайт панели» со ссылкой на сайт, если задан `Telegram__PublicSiteUrl`
(пусто — кнопки нет). Слэш-команды `/configs`/`/unlink` продолжают работать как раньше — кнопки лишь
вызывают те же обработчики через callback (`menu:configs`/`menu:unlink`/`menu:back`).
8. **Админ: обработка заявок на роль поддержки** — при новой заявке (`SupportTicket.Type ==
RoleRequest`) админ получает сообщение с описанием (существующая роль либо параметры новой) и
обоснованием, жмёт «✅ Одобрить / ❌ Отклонить» **прямо в Telegram, без захода на сайт** — одобрение
создаёт роль (если новая) и назначает её пользователю той же командой, что и на сайте. Баг-репорты/
предложения — только уведомление с кнопкой-ссылкой на сайт, без инлайн-действий (переписка и
вложения удобнее там).
**Не реализовано:**
- QR-картинкой и агрегированная подписка в самом боте (только текстовая ссылка на конфиг по кнопке).
@@ -41,6 +47,8 @@ Telegram-бот — **второй канал доставки** (presentation-
- Webhook-транспорт — только long polling, конфигурации режима/URL в коде нет.
- Полное самообслуживание (создание/ротация/отзыв конфигов) — бот **read-only** по конфигам (только
просмотр списка и показ существующей ссылки по кнопке).
- Баг-репорты/предложения тикетов поддержки **не решаются из бота** (только уведомление-ссылка) —
ответы, вложения, resolve/close только на сайте.
## Размещение в архитектуре
@@ -162,6 +170,33 @@ Telegram ──updates──► TelegramBotHostedService → PnvBotUpdateHandl
`/requests` — тот же список запросов по требованию (до 10 штук, `Pending`), с теми же кнопками; для
кого он доступен — та же проверка админ-id.
## Флоу 6 — Обращения в поддержку
Два разных сценария в зависимости от типа тикета (`SupportTicket.Type`):
**Баг-репорт/предложение** — только уведомление, без действий в боте:
1. `CreateBugReportTicketCommandHandler` вызывает
`ITelegramNotifier.NotifyAdminsBugReportCreatedAsync(ticketId, userName, message, ct)`.
2. Каждому админу уходит сообщение с превью текста (обрезано до ~300 символов) и, если задан
`Telegram__PublicSiteUrl`, **кнопкой-ссылкой** `🌐 Открыть на сайте` на `/admin/support/{ticketId}`
(`InlineKeyboardButton.WithUrl`, не callback) — тап открывает страницу тикета в браузере.
3. Дальше — только на сайте: переписка, вложения, resolve/close.
**Заявка на роль** — полностью решается в Telegram:
1. `CreateRoleRequestTicketCommandHandler` вызывает
`ITelegramNotifier.NotifyAdminsRoleRequestCreatedAsync(ticketId, userName, roleDescription, justification, ct)`
— `roleDescription` уже готовая строка (имя существующей роли либо «новая роль «X» (конфигов: N, IP: M)»).
2. Сообщение с кнопками **«✅ Одобрить» / «❌ Отклонить»** (callback `rrq:approve:{id}`/`rrq:reject:{id}`
— тот же 3-частный формат `prefix:action:guid`, что и `act:*` для активации).
3. Нажатие → проверка прав (`TrySetAdminCurrentUserAsync`, тот же, что для активации) →
`ApproveRoleRequestCommand`/`RejectRoleRequestCommand` (те же команды, что дёргает
`POST /api/admin/support/tickets/{id}/approve|reject` на сайте). При одобрении — если роль новая,
сперва создаётся `AppRole`, затем в любом случае назначается пользователю; тикет переходит в
`Resolved`/`Closed`. Нажавшему админу — короткое подтверждение, исходное сообщение редактируется
(дописывается статус), как и у `act:*`.
4. Пользователю (если Telegram привязан) — DM «✅ Ваша заявка на роль одобрена.» / «❌ Ваша заявка на
роль отклонена.».
## Команды и клавиатуры
| Команда / кнопка | Действие | Требует привязки |
@@ -177,6 +212,8 @@ Telegram ──updates──► TelegramBotHostedService → PnvBotUpdateHandl
| «📝 Зарегистрироваться» (`reg:new`) | Регистрация нового аккаунта прямо из бота (Флоу 3) | нет (нужно, чтобы **не** был привязан) |
| «✅ Активировать»/«❌ Отклонить» | (admin) решение по конкретному запросу активации | админ по env |
| `/requests` | (admin) список ожидающих запросов активации (до 10) | админ по env |
| «✅ Одобрить»/«❌ Отклонить» (`rrq:*`) | (admin) решение по заявке на роль — создаёт/назначает роль | админ по env |
| «🌐 Открыть на сайте» | Ссылка на баг-репорт на сайте (только если задан `Telegram__PublicSiteUrl`) | админ по env |
Главное меню (`/start`/`/help`) — см. пункт 7 в «Возможности» выше.