diff --git a/CHANGELOG.md b/CHANGELOG.md index abcb777..4c7288c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ et le versionnage suit [SemVer](https://semver.org/lang/fr/). ## [Non publié] ### Ajouté +- Formulaire de suggestions/signalements (utilisateur connecté) créant un ticket dans Gitea via son API. - Pipeline d'intégration continue Gitea Actions (tests, Pint, audit de sécurité). - Pipeline de déploiement continu (build image → registre Gitea → webhook Portainer). - Middleware `SecurityHeaders` (HSTS, CSP, X-Frame-Options, etc.). diff --git a/WEB/.env.example b/WEB/.env.example index c0660ea..7f78dee 100644 --- a/WEB/.env.example +++ b/WEB/.env.example @@ -62,4 +62,10 @@ AWS_DEFAULT_REGION=us-east-1 AWS_BUCKET= AWS_USE_PATH_STYLE_ENDPOINT=false +# --- Gitea (tickets créés depuis le formulaire de suggestions du site) --- +# Token d'accès Gitea avec le scope "write:issue" (Settings > Applications > Generate Token). +GITEA_URL=https://gitea.sam-coffre.duckdns.org +GITEA_TOKEN= +GITEA_REPO=sam/cesizen + VITE_APP_NAME="${APP_NAME}" diff --git a/WEB/.env.production.example b/WEB/.env.production.example index 9be7e24..23bddd2 100644 --- a/WEB/.env.production.example +++ b/WEB/.env.production.example @@ -52,4 +52,9 @@ MAIL_PASSWORD= MAIL_FROM_ADDRESS="no-reply@cesizen.fr" MAIL_FROM_NAME="${APP_NAME}" +# ── Gitea (tickets créés depuis le formulaire de suggestions) ─ +GITEA_URL=https://gitea.sam-coffre.duckdns.org +GITEA_TOKEN= # token Gitea avec le scope write:issue +GITEA_REPO=sam/cesizen + VITE_APP_NAME="${APP_NAME}" diff --git a/WEB/app/Http/Controllers/Web/SuggestionController.php b/WEB/app/Http/Controllers/Web/SuggestionController.php new file mode 100644 index 0000000..bc5babe --- /dev/null +++ b/WEB/app/Http/Controllers/Web/SuggestionController.php @@ -0,0 +1,59 @@ +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 demande (10 caractères minimum).', + ]); + + /** @var User $user */ + $user = Auth::user(); + $auteur = $user->name ?? 'Utilisateur'; + + $title = "[{$data['type']}] {$data['titre']}"; + + $body = "**Type de demande :** {$data['type']}\n" + ."**Proposé par :** {$auteur} (via le site CESIZen)\n\n" + ."### Description\n" + .$data['description']."\n\n" + ."---\n" + .'_Ticket créé automatiquement depuis le formulaire de suggestions du site CESIZen._'; + + if ($gitea->createIssue($title, $body)) { + return redirect()->route('suggestions.create') + ->with('success', 'Merci ! Votre demande a bien été transmise à l\'équipe.'); + } + + return back()->withInput()->withErrors([ + 'gitea' => "L'envoi de votre demande a échoué. Merci de réessayer plus tard.", + ]); + } +} diff --git a/WEB/app/Services/GiteaIssueService.php b/WEB/app/Services/GiteaIssueService.php new file mode 100644 index 0000000..6de6bf8 --- /dev/null +++ b/WEB/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/WEB/config/services.php b/WEB/config/services.php index 6a90eb8..79e5ab8 100644 --- a/WEB/config/services.php +++ b/WEB/config/services.php @@ -35,4 +35,11 @@ return [ ], ], + // Gitea : création de tickets (issues) depuis le formulaire de suggestions. + 'gitea' => [ + 'url' => env('GITEA_URL', 'https://gitea.sam-coffre.duckdns.org'), + 'token' => env('GITEA_TOKEN'), + 'repo' => env('GITEA_REPO', 'sam/cesizen'), + ], + ]; diff --git a/WEB/resources/views/layouts/sidebar.blade.php b/WEB/resources/views/layouts/sidebar.blade.php index f726f78..7527f6c 100644 --- a/WEB/resources/views/layouts/sidebar.blade.php +++ b/WEB/resources/views/layouts/sidebar.blade.php @@ -50,6 +50,18 @@ Guides & Informations + + @auth + routeIs('suggestions.*') ? 'aria-current="page"' : '' !!}> + + Signaler / Suggérer + + @endauth +