From 5ac7888fc8616d2d1ac6b60f8e1e1b20fc7e5902 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Munsch?= Date: Fri, 21 Apr 2023 15:45:29 +0200 Subject: [PATCH] Fix #13 Send only notifications to Admin users if message is private --- app/Http/Controllers/TicketController.php | 1 + app/Http/Requests/CreateMessage.php | 9 +++-- app/Listeners/AddStatusMessages.php | 32 +++++++-------- .../SendSubscriptionsNotificationsMail.php | 2 + app/Models/Message.php | 39 ++++++++++++++++--- app/Models/Ticket.php | 6 ++- resources/views/ticket/show.blade.php | 2 +- 7 files changed, 62 insertions(+), 29 deletions(-) diff --git a/app/Http/Controllers/TicketController.php b/app/Http/Controllers/TicketController.php index 746f15f..0cfeb69 100644 --- a/app/Http/Controllers/TicketController.php +++ b/app/Http/Controllers/TicketController.php @@ -454,6 +454,7 @@ class TicketController extends Controller /** @var \App\Enums\TicketStatus */ $oldStatus = $ticket->status; + // * Notification systeme doit etre privée. event(new TicketStatusChanged($ticket, $oldStatus, null, $message, true, false)); event(new NotifySubscriptions($ticket, $message, collect([$ticket->user]))); diff --git a/app/Http/Requests/CreateMessage.php b/app/Http/Requests/CreateMessage.php index f754e0e..a0eb2e3 100644 --- a/app/Http/Requests/CreateMessage.php +++ b/app/Http/Requests/CreateMessage.php @@ -20,14 +20,15 @@ class CreateMessage extends FormRequest return false; } if ( - !auth()->user()->can('createPrivateMessage', request()->route()->ticket) + !$user->can('createPrivateMessage', $this->route()->ticket) && $this->is_private == MessageType::private() ) { return false; } - return auth()->check() and auth()->user()->sites and ( - $user->isAdmin() or - auth()->user()->sites->contains(request()->route()->ticket->site_id) + return auth()->check() and $user->sites and ( + $user->isAdmin() or $user->sites->contains( + $this->route()->ticket->site_id + ) ); } diff --git a/app/Listeners/AddStatusMessages.php b/app/Listeners/AddStatusMessages.php index 7b31768..f3d50d9 100644 --- a/app/Listeners/AddStatusMessages.php +++ b/app/Listeners/AddStatusMessages.php @@ -18,25 +18,25 @@ class AddStatusMessages */ public function handle(TicketStatusChanged $event) { + // phpcs:enable $message = new Message(); $message->ticket_id = $event->ticket->id; - $message->type = MessageType::public(); - if ($event->is_private) { - $message->type = MessageType::private(); - } + // * Le message system est privé si demandé (eg: Assignation à une personne). + $message->type = $event->is_private ? + MessageType::public() : MessageType::private(); if ($event->message) { $message->message = $event->message; } elseif ($event->user) { $message->message = sprintf( "%s %s %s", $event->user->name, - __("a modifié le statut en"), + trans('a modifié le statut en'), $event->ticket->status->label ); } else { $message->message = sprintf( "%s : %s", - __("Le statut est passé à"), + trans('Le statut est passé à'), $event->ticket->status->label ); } @@ -46,55 +46,55 @@ class AddStatusMessages $message->message = sprintf( "%s
%s
", $message->message, - __("Votre ticket a été créé, nous allons en prendre connaissance.") + trans('Votre ticket a été créé, nous allons en prendre connaissance.') ); break; case TicketStatus::estimateTodo(): $message->message = sprintf( "%s
%s
", $message->message, - __("Votre ticket nécessite une estimation, nous allons vous proposer un devis.") + trans('Votre ticket nécessite une estimation, nous allons vous proposer un devis.') ); break; case TicketStatus::takenInAccount(): $message->message .= sprintf("
" . - __("Votre ticket est dans le processus de traitement.") . "
"); + trans('Votre ticket est dans le processus de traitement.') . "
"); break; case TicketStatus::waiting(): $message->message = sprintf( "%s
%s
", $message->message, - __("Nous attendons une réponse de votre part pour procéder à la suite du traitement.") + trans('Nous attendons une réponse de votre part pour procéder à la suite du traitement.') ); break; case TicketStatus::waitingValidation(): $message->message = sprintf( "%s
%s
", $message->message, - __("Nous attendons une validation de votre part pour procéder au traitement.") + trans('Nous attendons une validation de votre part pour procéder au traitement.') ); break; case TicketStatus::recette(): $message->message = sprintf( "%s
%s
", $message->message, - __("Le traitement à été réalisé et mis à disposition sur la plateforme de recette. - Vous pouvez vérifier que la solution mise en œuvre correspond à la demande.") + trans('Le traitement à été réalisé et mis à disposition sur la plateforme de recette. + Vous pouvez vérifier que la solution mise en œuvre correspond à la demande.') ); break; case TicketStatus::production(): $message->message = sprintf( "%s
%s
", $message->message, - __("La solution à été mise en ligne. - Vous pouvez vérifier sur le site de production que tout fonctionne comme attendu.") + trans('La solution à été mise en ligne. + Vous pouvez vérifier sur le site de production que tout fonctionne comme attendu.') ); break; case TicketStatus::archived(): $message->message = sprintf( "%s
%s
", $message->message, - __("Ce ticket est clos.") + trans('Ce ticket est clos.') ); break; } //end switch diff --git a/app/Listeners/SendSubscriptionsNotificationsMail.php b/app/Listeners/SendSubscriptionsNotificationsMail.php index 1db3858..1f46865 100644 --- a/app/Listeners/SendSubscriptionsNotificationsMail.php +++ b/app/Listeners/SendSubscriptionsNotificationsMail.php @@ -22,7 +22,9 @@ class SendSubscriptionsNotificationsMail $ignoreUsers = $event->ignoreUsers ?? collect(); foreach ($event->ticket->subscriptions as $sub) { if ( + // * Ignore the message author (job in sync). $sub->email !== $ignoreConnectedUserEmail and + // * Are there are users to notify !$ignoreUsers->filter(function (User $user) use ($sub) { return $user->email === $sub->email; })->count() diff --git a/app/Models/Message.php b/app/Models/Message.php index 6755a42..3140882 100644 --- a/app/Models/Message.php +++ b/app/Models/Message.php @@ -9,6 +9,14 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Kwaadpepper\Enum\Traits\CastsEnums; +/** + * + * @property string $message The message content. + * @property \App\Enums\MessageType $type The message is not visible for clients. + * @property string $file The message joined file path. + * + * @package App\Models + */ class Message extends Model { use HasFactory; @@ -32,7 +40,6 @@ class Message extends Model protected $enumCasts = [ 'type' => MessageType::class ]; - /** * The attributes that are mass assignable. * @@ -52,10 +59,30 @@ class Message extends Model }]); /** @var \App\Models\User $messageUser */ $messageUser = $message->user()->withTrashed()->firstOrFail(); - // * Send mail to mentionned users - $usersNotified = $ticket->sendBeenMentionnedToUser($message); + // * Send mail to mentionned users\ + /** @var \Illuminate\Support\Collection<\App\Models\User> */ + $dontNotifyUsers = $ticket->sendBeenMentionnedToUser($message); + + // * Ignorer le cas où le message est privé et l'auteur du ticket n'est pas admin. + if (!$ticket->user->isAdmin() && $message->type->equals(MessageType::private())) { + $dontNotifyUsers->push($ticket->user); + } + + // * Filter Users if the message is private. + if ($message->type->equals(MessageType::private())) { + $dontNotifyUsers = $dontNotifyUsers->concat( + // * Add to ignore list all non Admin users. + $ticket->subscriptions->filter(function (User $suscribedUser) { + return !$suscribedUser->isAdmin(); + }) + ); + } // * If email has not been sen to ticket author yet. - if (!$usersNotified->contains($ticket->user) and $ticket->user->id !== $messageUser->id) { + if ( + !$dontNotifyUsers->contains(function (User $dontNotifyUser) use ($ticket) { + return $dontNotifyUser->id === $ticket->user->id; + }) and $ticket->user->id !== $messageUser->id + ) { // * Send mail to ticket author event(new NotifyTicketCreator( $ticket, @@ -64,7 +91,7 @@ class Message extends Model 'message' => $message->message ]) )); - $usersNotified->push($ticket->user); + $dontNotifyUsers->push($ticket->user); } // ? Is message author is admin ? if ($messageUser->isAdmin()) { @@ -85,7 +112,7 @@ class Message extends Model 'name' => $message->user->name, 'message' => $message->message ]), - $usersNotified + $dontNotifyUsers )); }//end if }); diff --git a/app/Models/Ticket.php b/app/Models/Ticket.php index db8b24b..1a5f9ea 100644 --- a/app/Models/Ticket.php +++ b/app/Models/Ticket.php @@ -181,6 +181,7 @@ class Ticket extends Model { $ticket = $this; // Find @user + send mail si un seul user est trouvé. + /** @var \Illuminate\Support\Collection<\App\Models\User> */ $usersNotified = collect([]); $matches = []; $ticket->load('site'); @@ -215,8 +216,9 @@ class Ticket extends Model } } catch (ModelNotFoundException $e) { continue; - }//end try - }//end foreach + } //end try + } //end foreach + return $usersNotified; } diff --git a/resources/views/ticket/show.blade.php b/resources/views/ticket/show.blade.php index 4818ca1..d5095d8 100644 --- a/resources/views/ticket/show.blade.php +++ b/resources/views/ticket/show.blade.php @@ -130,7 +130,7 @@
- +