feat(tickets): suivi bidirectionnel des tickets utilisateur via Gitea
CI - Intégration continue / quality-and-tests (pull_request) Successful in 3m27s

Le formulaire 'fire-and-forget' devient un vrai systeme de suivi :
- table locale tickets (user <-> numero d'issue Gitea)
- liste 'Mes tickets' avec etat (En cours / Resolu) et jalon
- page de suivi : etat, labels, jalon, fil de discussion (commentaires)
- reponse depuis le web (ajoute un commentaire sur l'issue Gitea)
- controle d'acces : un utilisateur ne voit que ses propres tickets
- GiteaIssueService etendu (getIssue, getComments, addComment)
- remplace l'ancien SuggestionController ; 5 tests de bout en bout

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-08 23:38:42 +02:00
parent 69da55b292
commit 7d52c1e440
14 changed files with 568 additions and 194 deletions
+7 -4
View File
@@ -7,7 +7,7 @@ use App\Http\Controllers\Web\EmotionController;
use App\Http\Controllers\Web\InformationController;
use App\Http\Controllers\Web\ProfileController;
use App\Http\Controllers\Web\RelaxationController;
use App\Http\Controllers\Web\SuggestionController;
use App\Http\Controllers\Web\TicketController;
use Illuminate\Support\Facades\Route;
// Public Routes
@@ -43,7 +43,10 @@ Route::middleware('auth')->group(function () {
// Pages Relaxation
Route::post('/relaxation/{id}/favorite', [RelaxationController::class, 'toggleFavorite'])->name('relaxation.favorite');
// Suggestions / signalements (créent un ticket dans Gitea)
Route::get('/suggestions/nouveau', [SuggestionController::class, 'create'])->name('suggestions.create');
Route::post('/suggestions', [SuggestionController::class, 'store'])->name('suggestions.store');
// Système de tickets (connecté à Gitea) : création, suivi, réponses
Route::get('/tickets', [TicketController::class, 'index'])->name('tickets.index');
Route::get('/tickets/nouveau', [TicketController::class, 'create'])->name('tickets.create');
Route::post('/tickets', [TicketController::class, 'store'])->name('tickets.store');
Route::get('/tickets/{number}', [TicketController::class, 'show'])->whereNumber('number')->name('tickets.show');
Route::post('/tickets/{number}/reponse', [TicketController::class, 'reply'])->whereNumber('number')->name('tickets.reply');
});