ticket mention @user + mail

This commit is contained in:
Jérémy Munsch 2021-05-18 22:52:46 +02:00
parent 10eba95e06
commit 126957a3df
8 changed files with 137 additions and 9 deletions

View file

@ -1,4 +1,6 @@
- Permettre à un user de suivre un projet
- permettre d'insérer des @user dans le texte avec lien vers user
- ~~permettre d'insérer des @user dans le texte avec lien vers user~~
~~pas de liens vers user mais mise en form~~
- ~~parse de @user + envoie de mail si un seul user est trouvé~~
- permettre de modifier son mot de passe ? (je crois que ça n'as pas été mis exprès)
- ~~parser les liens http~~

View file

@ -3,20 +3,21 @@
namespace App\Http\Controllers;
use App\Enums\TicketStatus;
use App\Enums\TicketType;
use App\Events\NotifySubscriptions;
use App\Events\TicketStatusChanged;
use App\Http\Requests\ChangeTicketStatus;
use App\Http\Requests\CreateMessage;
use App\Http\Requests\SortTickets;
use App\Http\Requests\StoreTicket;
use App\Http\Requests\UpdateTicket;
use App\Jobs\SendTicketMentionMail;
use App\Mail\NewTicket;
use App\Mail\TicketMention;
use App\Models\Message;
use App\Models\Project;
use App\Models\Ticket;
use App\Models\User;
use Exception;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\File;
use Illuminate\Support\Facades\Mail;
@ -216,6 +217,25 @@ class TicketController extends Controller
])
));
// find @user + send mail si un seul user est trouvé
$matches = [];
\preg_match_all('/@\w*/', $message->message, $matches);
$matches = collect($matches[0] ?? [])->unique();
foreach ($matches as $pseudo_usertag) {
try {
$user = User::where('name', 'LIKE', '%' . ltrim($pseudo_usertag, '@') . '%')
->whereDoesntHave('subscriptions', function ($q) use ($ticket) {
$q->where('id', $ticket->id);
})->firstOrFail();
SendTicketMentionMail::dispatchAfterResponse(
$user,
new TicketMention($ticket, $message->message)
);
} catch (QueryException $e) {
continue;
}
}
return back();
}

View file

@ -0,0 +1,45 @@
<?php
namespace App\Jobs;
use App\Mail\TicketMention;
use App\Models\User;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
class SendTicketMentionMail implements ShouldQueue
{
use Dispatchable;
use SerializesModels;
/** @var User */
private $user;
/** @var TicketMention */
private $mail;
/**
* Create a new job instance.
*
* @return void
*/
public function __construct(User $user, TicketMention $mail)
{
$this->user = $user;
$this->mail = $mail;
}
/**
* Execute the job.
*
* @return void
*/
public function handle()
{
Mail::to($this->user->email)->send($this->mail);
Log::debug(sprintf('Mention mail sent to %s', $this->user->email));
}
}

View file

@ -0,0 +1,45 @@
<?php
namespace App\Mail;
use App\Lib\Utils;
use App\Models\Ticket;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class TicketMention extends Mailable
{
use Queueable;
use SerializesModels;
/** @var Ticket */
private $ticket;
/** @var string */
private $corpsMaj;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct(Ticket $ticket, string $corpsMaj)
{
$this->ticket = $ticket;
$this->corpsMaj = $corpsMaj;
}
/**
* Build the message.
*
* @return $this
*/
public function build()
{
$ticket = $this->ticket;
$corpsMaj = Utils::plainToHtml($this->corpsMaj);
return $this->subject("[SupportWeb] Vous avez été mentionné sur le ticket n° $ticket->id")
->view('mails.ticket-mention', compact('ticket', 'corpsMaj'));
}
}

View file

@ -2,6 +2,8 @@
namespace App\Mail;
use App\Lib\Utils;
use App\Models\Ticket;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
@ -9,16 +11,21 @@ use Illuminate\Queue\SerializesModels;
class TicketUpdate extends Mailable
{
use Queueable, SerializesModels;
use Queueable;
use SerializesModels;
private $ticket, $corpsMaj;
/** @var Ticket */
private $ticket;
/** @var string */
private $corpsMaj;
/**
* Create a new message instance.
*
* @return void
*/
public function __construct($ticket, $corpsMaj)
public function __construct(Ticket $ticket, string $corpsMaj)
{
$this->ticket = $ticket;
$this->corpsMaj = $corpsMaj;
@ -32,7 +39,7 @@ class TicketUpdate extends Mailable
public function build()
{
$ticket = $this->ticket;
$corpsMaj = $this->corpsMaj;
$corpsMaj = Utils::plainToHtml($this->corpsMaj);
return $this->subject("[SupportWeb] Le ticket n°" . $ticket->id . " à été mis à jour")->view('mails.ticket-update', compact('ticket', 'corpsMaj'));
}
}

View file

@ -3,7 +3,7 @@
<ul>
<li>Projet : {{ $ticket->project->name }}</li>
<li>Type : {{ $ticket->type === "0" ? "Bug" : "Évolution" }}</li>
<li>Créer par : {{ $ticket->user->name }}</li>
<li>Créé par : {{ $ticket->user->name }}</li>
</ul>
<p>
Description :<br>

View file

@ -0,0 +1,9 @@
<p>Bonjour,</p>
<p>Vous avez été mentionné sur le ticket n°{{ $ticket->id }}:</p>
<ul>
<li>Projet : {{ $ticket->project->name }}</li>
<li>Type : {{ $ticket->type === 0 ? "Bug" : "Évolution" }}</li>
<li>Créé par : {{ $ticket->user->name }}</li>
</ul>
<p>{!! $corpsMaj !!}</p>
<p>Lien vers le ticket : <a href="{{ route('ticket.show', $ticket->id) }}" target="_blank">Ouvrir dans un nouvel onglet</a></p>

View file

@ -3,7 +3,7 @@
<ul>
<li>Projet : {{ $ticket->project->name }}</li>
<li>Type : {{ $ticket->type === 0 ? "Bug" : "Évolution" }}</li>
<li>Créer par : {{ $ticket->user->name }}</li>
<li>Créé par : {{ $ticket->user->name }}</li>
</ul>
<p>{!! $corpsMaj !!}</p>
<p>Lien vers le ticket : <a href="{{ route('ticket.show', $ticket->id) }}" target="_blank">Ouvrir dans un nouvel onglet</a></p>