feat: in-app support form with email + Gitea issue integration (v0.49.0)

Users can now report bugs, suggestions, or questions from a new /support
page. Each submission sends a confirmation email and, when GITEA_URL/
GITEA_TOKEN/GITEA_REPO are configured in admin Settings, opens a labeled
issue on that repo automatically (best-effort — failure doesn't block the
ticket). Admins get a Support section to triage status and retry failed
Gitea issue creation.

New support_tickets table, gitea.ts client, site-settings entries for the
three new secrets, and OpenAPI docs for the two user-facing endpoints.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Arnaud
2026-07-18 11:23:02 +02:00
parent 9ea1f90ec4
commit 811d4cad42
27 changed files with 6136 additions and 6 deletions
+30
View File
@@ -84,6 +84,7 @@
"language": "Language",
"notifications": "Notifications",
"viewProfile": "View profile",
"support": "Support",
"lightMode": "Light mode",
"darkMode": "Dark mode",
"systemMode": "System"
@@ -450,6 +451,35 @@
"description": "Receive HTTP callbacks when events happen in your Epicure account."
}
},
"support": {
"title": "Support",
"subtitle": "Report a bug, share a suggestion, or ask a question — we read every message.",
"typeLabel": "Type",
"typeBug": "Bug report",
"typeSuggestion": "Suggestion",
"typeQuestion": "Question",
"titleLabel": "Title",
"titlePlaceholder": "Short summary of the issue or idea",
"descriptionLabel": "Description",
"descriptionPlaceholder": "What happened, what you expected, and steps to reproduce (if a bug) — or details on your suggestion/question.",
"submitButton": "Submit",
"submitting": "Submitting…",
"submitSuccess": "Thanks! We received your message.",
"submitFailed": "Failed to submit — try again.",
"historyTitle": "Your tickets",
"noTickets": "You haven't submitted anything yet.",
"viewIssue": "View issue",
"status": {
"open": "Open",
"triaged": "Triaged",
"closed": "Closed"
},
"type": {
"bug": "Bug",
"suggestion": "Suggestion",
"question": "Question"
}
},
"print": {
"footer": "Printed from Epicure",
"day": "Day",