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:
commit
7e9cba3d2a
4 changed files with 110 additions and 1 deletions
74
app/Http/Controllers/Bo/BrevoController.php
Normal file
74
app/Http/Controllers/Bo/BrevoController.php
Normal 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]);
|
||||
}
|
||||
}
|
||||
|
|
@ -12,6 +12,7 @@ class VerifyCsrfToken extends Middleware
|
|||
* @var array<int, string>
|
||||
*/
|
||||
protected $except = [
|
||||
'/csp-report'
|
||||
'/csp-report',
|
||||
'/brevo-in'
|
||||
];
|
||||
}
|
||||
|
|
|
|||
31
app/Http/Requests/Bo/BrevoWehbookRequest.php
Normal file
31
app/Http/Requests/Bo/BrevoWehbookRequest.php
Normal 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',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -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 () {
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue