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",
+30
View File
@@ -84,6 +84,7 @@
"language": "Langue",
"notifications": "Notifications",
"viewProfile": "Voir le profil",
"support": "Support",
"lightMode": "Mode clair",
"darkMode": "Mode sombre",
"systemMode": "Système"
@@ -450,6 +451,35 @@
"description": "Recevez des appels HTTP lorsque des événements se produisent sur votre compte Epicure."
}
},
"support": {
"title": "Support",
"subtitle": "Signalez un bug, partagez une suggestion ou posez une question — nous lisons chaque message.",
"typeLabel": "Type",
"typeBug": "Signalement de bug",
"typeSuggestion": "Suggestion",
"typeQuestion": "Question",
"titleLabel": "Titre",
"titlePlaceholder": "Résumé court du problème ou de l'idée",
"descriptionLabel": "Description",
"descriptionPlaceholder": "Ce qui s'est passé, ce que vous attendiez, et les étapes pour reproduire (si bug) — ou les détails de votre suggestion/question.",
"submitButton": "Envoyer",
"submitting": "Envoi…",
"submitSuccess": "Merci ! Nous avons reçu votre message.",
"submitFailed": "Échec de l'envoi — réessayez.",
"historyTitle": "Vos tickets",
"noTickets": "Vous n'avez encore rien soumis.",
"viewIssue": "Voir le ticket",
"status": {
"open": "Ouvert",
"triaged": "Trié",
"closed": "Fermé"
},
"type": {
"bug": "Bug",
"suggestion": "Suggestion",
"question": "Question"
}
},
"print": {
"footer": "Imprimé depuis Epicure",
"day": "Jour",