feat(feedback): обратная связь от пользователей с разбором в админке и ролями #64
Reference in New Issue
Block a user
Delete Branch "feature/feedback"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Сквозная фича обратной связи: экран Settings → Info → «Обратная связь» (сообщение ≤1024 символов + один опциональный аттач), разбор в server-rendered админке (
/_gm/feedback), ответ оператора с доставкой в приложение и бейджем, и первая ролевая модель (account_roles;feedback_bannedзапрещает только отправку фидбека).Слои
00004_feedback(feedback_messages+account_roles) + go-jet.internal/feedback, ролиinternal/account/roles.go, REST-эндпоинты, раздел админки + панель ролей в/users, push-под-видadmin_reply.feedback.submit/get/unread; гейт гостя на gateway (Op.NonGuest+is_guestчерез резолв) →guest_forbiddenдо backend./feedback+ экран, пикер файла с гейтом по расширению, бейдж (общий ⚙️ + «1» на Инфо), детект канала, i18n en/ru.Проверки локально (всё зелёное): Go build/vet/gofmt, все unit-тесты backend/gateway/pkg, полный интеграционный набор (
-tags=integration), гейт гостя вconnectsrv; UIpnpm check/unit (217)/build/e2e (132, Chromium+WebKit).Каветы
ios/android— feature-detectionwindow.Capacitor; на реальной native-сборке проверить вживую (фоллбэкweb).attachment_type(тип из расширения) — залогировано вPLAN.md(Stage 19).Документация обновлена в этом же PR:
PLAN.md(Stage 19 + трекер + refinements),ARCHITECTURE.md(§15 + §12),FUNCTIONAL.md(+_ru),TESTING.md,UI_DESIGN.md, README.- style the About feedback button and the form's Send/attach/remove buttons with the accent/border tokens used by the New Game CTA, so they follow light/dark theme (the previous .btn/.ghost classes were not defined globally); the attach button is a neutral 📎 icon button with an aria-label - show a round badge on the About 'Feedback' button when a reply is waiting - admin: one 'ban from feedback' checkbox shared by Delete and Delete-all (via button formaction); hide Mark read when already read and Archive when archived - e2e: match the About button by substring (its name gains the badge)