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 @@