Merge branch '106-mailing-ticket' into 'develop'

feat: ✨ implement webhook ticket creation with regex extraction

See merge request ldc-web/projets/support-web!118
This commit is contained in:
noah.lancien 2026-01-16 14:48:57 +00:00
commit 7e9cba3d2a
4 changed files with 110 additions and 1 deletions

View file

@ -0,0 +1,74 @@
<?php
namespace App\Http\Controllers\Bo;
use Carbon\Carbon;
use App\Models\Site;
use App\Models\Ticket;
use App\Mail\NewTicket;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Mail;
use App\Enums\Tickets\TicketTypeEnum;
use App\Enums\Tickets\TicketStatusEnum;
use App\Http\Requests\Bo\BrevoWehbookRequest;
class BrevoController extends Controller
{
public function createTicket(BrevoWehbookRequest $request)
{
$data = [];
$site = Site::where('name', 'Mailing en masse')->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]);
}
}

View file

@ -12,6 +12,7 @@ class VerifyCsrfToken extends Middleware
* @var array<int, string>
*/
protected $except = [
'/csp-report'
'/csp-report',
'/brevo-in'
];
}

View file

@ -0,0 +1,31 @@
<?php
namespace App\Http\Requests\Bo;
use Illuminate\Foundation\Http\FormRequest;
class BrevoWehbookRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|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',
];
}
}

View file

@ -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 () {