From 2e9df26f370d7057c1e38850b168663e307ca535 Mon Sep 17 00:00:00 2001 From: Corentin Huet Date: Fri, 7 Nov 2025 11:06:31 +0100 Subject: [PATCH] feat: :sparkles: add consent page --- app/Http/Controllers/Fo/ConsentController.php | 44 +++++++++++++++++++ app/Http/Requests/Fo/ConsentRequest.php | 21 +++++++++ app/Models/OptinConsent.php | 18 ++++++++ ..._07_093313_create_optin_consents_table.php | 28 ++++++++++++ .../fo/pages/newsletter-consent.blade.php | 39 ++++++++++++++++ routes/web-fo.php | 3 ++ 6 files changed, 153 insertions(+) create mode 100644 app/Http/Controllers/Fo/ConsentController.php create mode 100644 app/Http/Requests/Fo/ConsentRequest.php create mode 100644 app/Models/OptinConsent.php create mode 100644 database/migrations/2025_11_07_093313_create_optin_consents_table.php create mode 100644 resources/views/fo/pages/newsletter-consent.blade.php diff --git a/app/Http/Controllers/Fo/ConsentController.php b/app/Http/Controllers/Fo/ConsentController.php new file mode 100644 index 00000000..5ea42837 --- /dev/null +++ b/app/Http/Controllers/Fo/ConsentController.php @@ -0,0 +1,44 @@ +action === 'optin') { + try { + if ($optinToAdd = OptinConsent::query()->where('hashcode', $request->hashcode)->first()) { + SingleOptin::setStatus($optinToAdd->email, true); + $isSubscribed = true; + } + } catch (ValidationException | CrmException | ApiErrorException $e) { + report($e); + } + } + + return view('fo.pages.newsletter-consent', compact('isSubscribed')); + } +} diff --git a/app/Http/Requests/Fo/ConsentRequest.php b/app/Http/Requests/Fo/ConsentRequest.php new file mode 100644 index 00000000..c4c89a99 --- /dev/null +++ b/app/Http/Requests/Fo/ConsentRequest.php @@ -0,0 +1,21 @@ +|string> + */ + public function rules(): array + { + return [ + 'hashcode' => 'required|string|exists:optin_consents,hashcode', + 'action' => 'required|string|in:optin,noptin' + ]; + } +} diff --git a/app/Models/OptinConsent.php b/app/Models/OptinConsent.php new file mode 100644 index 00000000..acf691f1 --- /dev/null +++ b/app/Models/OptinConsent.php @@ -0,0 +1,18 @@ +id(); + $table->string('email')->unique(); + $table->string('hashcode')->unique(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('optin_consents'); + } +}; diff --git a/resources/views/fo/pages/newsletter-consent.blade.php b/resources/views/fo/pages/newsletter-consent.blade.php new file mode 100644 index 00000000..6c125d12 --- /dev/null +++ b/resources/views/fo/pages/newsletter-consent.blade.php @@ -0,0 +1,39 @@ +@php + $staticPageModel = new stdClass(); + $staticPageModel->title = __('Consentir à la newsletter'); + $staticPageModel->subtitle = ''; + $staticPageModel->description = __('Page de consentement à la newsletter du site le Gaulois'); + $staticPageModel->picture = null; + $staticPageModel->picture_title = ''; + $staticPageModel->picture_alt = ''; +@endphp + +@extends('fo.layout', ['brParam' => $staticPageModel]) +@section('title', $staticPageModel->title) +@section('description', $staticPageModel->description) +@section('breadcrumb', request()->route()->getName()) +@section('bg-offset', true) + +@section('content') + {{-- HEADER --}} + @include('fo.layouts.header-banner') +
+
+
!$isSubscribed, + 'alert-success' => $isSubscribed + ])> +

+ @if($isSubscribed) + {{ __('Vous êtes désormais inscrit à la newsletter Le Gaulois.') }}
+ {{ __('A bientôt !')}} + @else + {{ __('Vous n\'êtes pas inscrits à la newsletter Le Gaulois.') }}
+ {{ __('En espérant vous revoir bientôt !') }} + @endif +

+
+
+
+@endsection diff --git a/routes/web-fo.php b/routes/web-fo.php index 65ac861f..d1504ea9 100644 --- a/routes/web-fo.php +++ b/routes/web-fo.php @@ -2,6 +2,7 @@ use App\Http\Controllers\Fo\BreedingController; use App\Http\Controllers\Fo\BreederController; +use App\Http\Controllers\Fo\ConsentController; use App\Http\Controllers\Fo\ContactController; use App\Http\Controllers\Fo\ExportController; use App\Http\Controllers\Fo\HomeController; @@ -11,6 +12,7 @@ use App\Http\Controllers\Fo\RatingController; use App\Http\Controllers\Fo\RecipeController; use App\Http\Controllers\Fo\SearchController; use App\Http\Controllers\Fo\StaticPageController; +use App\Models\StaticPage; use Illuminate\Support\Facades\Route; Route::middleware(['throttle:web'])->name('fo.')->group(function () { @@ -156,6 +158,7 @@ Route::middleware(['throttle:web'])->name('fo.')->group(function () { Route::get('/{unsubscribe}', [HomeController::class, 'unsubscribeNewsletter']) ->where('unsubscribe', 'unsubscribe|unsubscribe.php|unsubscribe.html|newsletter') ->name('unsubscribeNewsletter'); + Route::get('/newsletter/consent', [ConsentController::class, 'consent'])->name('newsletter.consent'); // * BREEDERS Route::prefix('breeders')