From dede70f70f7fc9dd1eade24b18d0c5e41f7dd37e Mon Sep 17 00:00:00 2001 From: Sam DEPARDIEU Date: Tue, 7 Jul 2026 20:00:12 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20formulaire=20de=20suggestions=20cr?= =?UTF-8?q?=C3=A9ant=20un=20ticket=20Gitea?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Les utilisateurs connectés peuvent proposer une modification / un ajout / une correction via un formulaire. La soumission crée automatiquement une issue dans le dépôt Gitea via son API (GiteaIssueService), avec le titre préfixé par le type et l'auteur dans le corps. - config/services.php + .env.example : GITEA_URL/TOKEN/REPO (token secret) - SuggestionController (create/store) + validation - vue suggestions/create + lien dans le header (utilisateurs connectés) - tests: auth requise, création OK, validation, échec API Co-Authored-By: Claude Opus 4.8 --- .env.example | 7 ++ app/Http/Controllers/SuggestionController.php | 58 ++++++++++ app/Services/GiteaIssueService.php | 53 +++++++++ config/services.php | 8 ++ resources/views/layout/header.blade.php | 3 + resources/views/suggestions/create.blade.php | 107 ++++++++++++++++++ routes/web.php | 5 + tests/Feature/SuggestionTest.php | 95 ++++++++++++++++ 8 files changed, 336 insertions(+) create mode 100644 app/Http/Controllers/SuggestionController.php create mode 100644 app/Services/GiteaIssueService.php create mode 100644 resources/views/suggestions/create.blade.php create mode 100644 tests/Feature/SuggestionTest.php diff --git a/.env.example b/.env.example index f076da4..2d93b2e 100644 --- a/.env.example +++ b/.env.example @@ -69,4 +69,11 @@ AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= AWS_USE_PATH_STYLE_ENDPOINT=false +# --- Gitea (tickets de suggestion créés depuis le site) --- +# Token d'accès Gitea avec le scope "write:issue" (Paramètres > Applications > Générer un token). +# À garder secret (ne jamais committer la vraie valeur). +GITEA_URL=https://gitea.sam-coffre.duckdns.org +GITEA_TOKEN= +GITEA_REPO=Groupe1/Ressources-relationnel + VITE_APP_NAME="${APP_NAME}" diff --git a/app/Http/Controllers/SuggestionController.php b/app/Http/Controllers/SuggestionController.php new file mode 100644 index 0000000..861a51a --- /dev/null +++ b/app/Http/Controllers/SuggestionController.php @@ -0,0 +1,58 @@ +validate([ + 'type' => ['required', Rule::in(['Modification', 'Ajout', 'Correction'])], + 'titre' => ['required', 'string', 'min:5', 'max:120'], + 'description' => ['required', 'string', 'min:10', 'max:5000'], + ], [ + 'type.required' => 'Veuillez choisir un type de demande.', + 'type.in' => 'Type de demande invalide.', + 'titre.required' => 'Le titre est requis.', + 'titre.min' => 'Le titre doit contenir au moins 5 caractères.', + 'titre.max' => 'Le titre ne peut pas dépasser 120 caractères.', + 'description.required' => 'La description est requise.', + 'description.min' => 'Merci de détailler un peu plus votre suggestion (10 caractères minimum).', + ]); + + /** @var Utilisateur $user */ + $user = Auth::user(); + $auteur = $user->Pseudo ?? 'Utilisateur'; + + $title = "[{$data['type']}] {$data['titre']}"; + + $body = "**Type de demande :** {$data['type']}\n" + ."**Proposé par :** {$auteur} (via le site (RE)Sources Relationnelles)\n\n" + ."### Description\n" + .$data['description']."\n\n" + ."---\n" + .'_Ticket créé automatiquement depuis le formulaire de suggestions du site._'; + + if ($gitea->createIssue($title, $body)) { + return redirect()->route('suggestions.create') + ->with('success', 'Merci ! Votre suggestion a bien été transmise à l\'équipe.'); + } + + return back()->withInput()->withErrors([ + 'gitea' => "L'envoi de votre suggestion a échoué. Merci de réessayer plus tard.", + ]); + } +} diff --git a/app/Services/GiteaIssueService.php b/app/Services/GiteaIssueService.php new file mode 100644 index 0000000..6de6bf8 --- /dev/null +++ b/app/Services/GiteaIssueService.php @@ -0,0 +1,53 @@ +". + $response = Http::withToken($token, 'token') + ->acceptJson() + ->timeout(10) + ->post("{$url}/api/v1/repos/{$repo}/issues", [ + 'title' => $title, + 'body' => $body, + ]); + } catch (\Throwable $e) { + Log::error('Appel API Gitea impossible : '.$e->getMessage()); + + return false; + } + + if ($response->failed()) { + Log::error('Création du ticket Gitea échouée', [ + 'status' => $response->status(), + 'body' => $response->body(), + ]); + + return false; + } + + return true; + } +} diff --git a/config/services.php b/config/services.php index 6a90eb8..d3d2fcb 100644 --- a/config/services.php +++ b/config/services.php @@ -35,4 +35,12 @@ return [ ], ], + // Gitea : création automatique de tickets (issues) depuis le formulaire + // de suggestions du site. Le token doit avoir le scope "write:issue". + 'gitea' => [ + 'url' => env('GITEA_URL', 'https://gitea.sam-coffre.duckdns.org'), + 'token' => env('GITEA_TOKEN'), + 'repo' => env('GITEA_REPO', 'Groupe1/Ressources-relationnel'), + ], + ]; diff --git a/resources/views/layout/header.blade.php b/resources/views/layout/header.blade.php index d9959ec..e23edf5 100644 --- a/resources/views/layout/header.blade.php +++ b/resources/views/layout/header.blade.php @@ -24,6 +24,9 @@