From 4e275c3b37d1a8eb2ee275ee7cffe1bec1c63309 Mon Sep 17 00:00:00 2001 From: Corentin Huet Date: Wed, 14 Jan 2026 16:49:51 +0100 Subject: [PATCH] feat: :sparkles: implement webhook ticket creation with regex extraction --- app/Http/Controllers/Bo/BrevoController.php | 74 ++++++++++++++++++++ app/Http/Middleware/VerifyCsrfToken.php | 3 +- app/Http/Requests/Bo/BrevoWehbookRequest.php | 31 ++++++++ routes/web-bo.php | 3 + 4 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 app/Http/Controllers/Bo/BrevoController.php create mode 100644 app/Http/Requests/Bo/BrevoWehbookRequest.php diff --git a/app/Http/Controllers/Bo/BrevoController.php b/app/Http/Controllers/Bo/BrevoController.php new file mode 100644 index 0000000..e5b833b --- /dev/null +++ b/app/Http/Controllers/Bo/BrevoController.php @@ -0,0 +1,74 @@ +firstOrFail(); + + $formContent = $request->items[0]["ExtractedMarkdownMessage"]; + + $tblRegexPatterns = [ + 'user' => '/Matricule et Nom du demandeur\s*\|\s*([^|]+?)\s*\|/i', + 'email' => '/Email du demandeur\s*\|\s*([^|]+?)\s*\|/i', + 'brand' => '/Marque\s*\/\s*Filiale\s*\|\s*([^|]+?)\s*\|/i', + 'subject' => '/Pour quels besoins avez-vous besoin d\'envoyer des emails en masse\s*\?\s*\|\s*([^|]+?)\s*\|/is', + 'date_mep' => '/Date de première envoi souhaité\s*\|\s*([^|]+?)\s*\|/i', + 'comment' => '/Commentaire\s*\|\s*([^|]+?)(?=\s*\|)/i', + ]; + + foreach ($tblRegexPatterns as $field => $regex) { + if (preg_match($regex, $formContent, $matches)) { + $data[$field] = trim($matches[1]); + } + } + + $dateMep = Carbon::createFromFormat('d/m/Y', $data['date_mep'])->format('Y-m-d'); + + $ticket = new Ticket([ + 'site_id' => $site->id, + 'type' => TicketTypeEnum::mailing->value, + 'status' => TicketStatusEnum::new->value, + 'date_mep' => $dateMep, + 'text' => " + Bonjour,\n + Nom du demandeur : {$data['user']}, + Adresse mail : {$data['email']}, + Marque / Filiale concernée : {$data['brand']}, + Sujet : {$data['subject']}, + Date d'envoi souhaitée : {$data['date_mep']}, + Commentaire : {$data['comment']},\n + Cordialement. + ", + 'title' => "Demande de mail en masse pour {$data['brand']}", + 'is_internal' => false + ]); + + $ticket->user()->associate($site->projectManager); + $ticket->site()->associate($site); + $ticket->assignedUser()->associate($site->projectManager); + $ticket->saveOrFail(); + + if (config('mail.MAIL_ADMIN')) { + Mail::to(config('mail.MAIL_ADMIN'))->send(new NewTicket($ticket)); + } else { + throw new \ErrorException('Missing MAIL_ADMIN in .env'); + } + + return response()->json(['ok' => true]); + } +} diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php index 61356d0..0054b1d 100644 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -12,6 +12,7 @@ class VerifyCsrfToken extends Middleware * @var array */ protected $except = [ - '/csp-report' + '/csp-report', + '/brevo-in' ]; } diff --git a/app/Http/Requests/Bo/BrevoWehbookRequest.php b/app/Http/Requests/Bo/BrevoWehbookRequest.php new file mode 100644 index 0000000..64d0e5f --- /dev/null +++ b/app/Http/Requests/Bo/BrevoWehbookRequest.php @@ -0,0 +1,31 @@ +|string> + */ + public function rules(): array + { + return [ + 'items' => 'required|array|min:1', + 'items.0.From.Address' => 'required|email', + 'items.0.To.*.Address' => 'required|email|in:mailing@reply.uwil.fr', + 'items.0.ExtractedMarkdownMessage' => 'required|string|min:10', + ]; + } +} diff --git a/routes/web-bo.php b/routes/web-bo.php index bf98ad2..39db39c 100644 --- a/routes/web-bo.php +++ b/routes/web-bo.php @@ -12,11 +12,14 @@ use App\Http\Controllers\Bo\PackageController; use App\Http\Controllers\Bo\SiteController; use App\Http\Controllers\Bo\TicketController; use App\Http\Controllers\Bo\TicketTypeController; +use App\Http\Controllers\Bo\BrevoController; use App\Http\Controllers\Bo\UserController; use App\Http\Middleware\SecureHeaders; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Route; +Route::post('/brevo-in', [BrevoController::class, 'createTicket']); + Route::middleware('admin-secure') ->group(function () {