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": "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",