From 2482bf84133abb9762106e1cb7022e6a48df5130 Mon Sep 17 00:00:00 2001 From: Romain Bonhomme Date: Thu, 26 Nov 2020 15:48:35 +0100 Subject: [PATCH] =?UTF-8?q?Ajout=20abonnement=20a=20un=20ticket=20pour=20r?= =?UTF-8?q?ecevoir=20un=20mail=20en=20cas=20de=20mis=20=C3=A0=20jour=20du?= =?UTF-8?q?=20ticket=20(r=C3=A9ponse/status)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Events/NotifySubscriptions.php | 25 ++++++++++++ app/Http/Controllers/TicketController.php | 15 +++++++- app/Listeners/SendNotificationMail.php | 37 ++++++++++++++++++ app/Mail/TicketUpdate.php | 38 +++++++++++++++++++ app/Models/Ticket.php | 4 ++ app/Models/User.php | 4 ++ app/Providers/EventServiceProvider.php | 3 ++ ...2020_11_26_132557_create_subscriptions.php | 32 ++++++++++++++++ resources/views/home.blade.php | 4 +- resources/views/mails/ticket-update.blade.php | 9 +++++ resources/views/ticket/show.blade.php | 11 +++++- routes/web.php | 1 + 12 files changed, 180 insertions(+), 3 deletions(-) create mode 100644 app/Events/NotifySubscriptions.php create mode 100644 app/Listeners/SendNotificationMail.php create mode 100644 app/Mail/TicketUpdate.php create mode 100644 database/migrations/2020_11_26_132557_create_subscriptions.php create mode 100644 resources/views/mails/ticket-update.blade.php diff --git a/app/Events/NotifySubscriptions.php b/app/Events/NotifySubscriptions.php new file mode 100644 index 0000000..e9a15ec --- /dev/null +++ b/app/Events/NotifySubscriptions.php @@ -0,0 +1,25 @@ +ticket = $ticket; + $this->corpsMaj = $corpsMaj; + } +} diff --git a/app/Http/Controllers/TicketController.php b/app/Http/Controllers/TicketController.php index d9d9b79..2355788 100644 --- a/app/Http/Controllers/TicketController.php +++ b/app/Http/Controllers/TicketController.php @@ -2,11 +2,13 @@ namespace App\Http\Controllers; +use App\Events\NotifySubscriptions; use App\Events\TicketStatusChanged; use App\Mail\NewTicket; use App\Models\Message; use App\Models\Project; use App\Models\Ticket; +use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Mail; @@ -30,9 +32,12 @@ class TicketController extends Controller $ticket = Ticket::find($id); $status = $this->status; $messages = $ticket->messages()->orderBy('created_at', 'DESC')->get(); + $isSubscribed = false; if (!$ticket) abort(404); - return view('ticket.show', compact('ticket', 'status', 'messages')); + if ($ticket->subscriptions()->where('user_id', Auth::user()->id)->count() !== 0) + $isSubscribed = true; + return view('ticket.show', compact('ticket', 'status', 'messages', 'isSubscribed')); } public function create() { @@ -164,6 +169,7 @@ class TicketController extends Controller $ticket->status = $request->status; $ticket->save(); event(new TicketStatusChanged($ticket, $this->status)); + event(new NotifySubscriptions($ticket, "Le ticket à changé de status : " . $this->status[$ticket->status])); return back(); } @@ -203,6 +209,13 @@ class TicketController extends Controller $message->save(); } + event(new NotifySubscriptions($ticket, "Nouvelle réponse de " . $message->user->name . " :
" . $message->message)); + + return back(); + } + + public function subscribe(Request $request, $id) { + User::find(Auth::user()->id)->subscriptions()->toggle($id); return back(); } } diff --git a/app/Listeners/SendNotificationMail.php b/app/Listeners/SendNotificationMail.php new file mode 100644 index 0000000..55fb583 --- /dev/null +++ b/app/Listeners/SendNotificationMail.php @@ -0,0 +1,37 @@ +ticket->subscriptions as $sub) + if ($sub->email !== Auth::user()->email) + Mail::to($sub->email)->send(new TicketUpdate($event->ticket, $event->corpsMaj)); + } +} diff --git a/app/Mail/TicketUpdate.php b/app/Mail/TicketUpdate.php new file mode 100644 index 0000000..17673de --- /dev/null +++ b/app/Mail/TicketUpdate.php @@ -0,0 +1,38 @@ +ticket = $ticket; + $this->corpsMaj = $corpsMaj; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + $ticket = $this->ticket; + $corpsMaj = $this->corpsMaj; + return $this->subject("[SupportWeb] Le ticket n°" . $ticket->id . " à été mis à jour")->view('mails.ticket-update', compact('ticket', 'corpsMaj')); + } +} diff --git a/app/Models/Ticket.php b/app/Models/Ticket.php index 7d3bd3e..ff43a4d 100644 --- a/app/Models/Ticket.php +++ b/app/Models/Ticket.php @@ -20,4 +20,8 @@ class Ticket extends Model public function messages() { return $this->hasMany('App\Models\Message', 'ticket_id'); } + + public function subscriptions() { + return $this->belongsToMany('App\Models\User', 'subscriptions'); + } } diff --git a/app/Models/User.php b/app/Models/User.php index 55dce5a..e1034d2 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -48,4 +48,8 @@ class User extends Authenticatable public function messages() { return $this->hasMany('App\Models\Messages', 'user_id'); } + + public function subscriptions() { + return $this->belongsToMany('App\Models\Ticket', 'subscriptions'); + } } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index e925966..3b8ac12 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -21,6 +21,9 @@ class EventServiceProvider extends ServiceProvider 'App\Events\TicketStatusChanged' => [ 'App\Listeners\AddStatusMessages', ], + 'App\Events\NotifySubscriptions' => [ + 'App\Listeners\SendNotificationMail' + ], ]; /** diff --git a/database/migrations/2020_11_26_132557_create_subscriptions.php b/database/migrations/2020_11_26_132557_create_subscriptions.php new file mode 100644 index 0000000..6a22058 --- /dev/null +++ b/database/migrations/2020_11_26_132557_create_subscriptions.php @@ -0,0 +1,32 @@ +foreignId('ticket_id')->constrained('tickets'); + $table->foreignId('user_id')->constrained('users'); + $table->primary(['ticket_id', 'user_id']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('subscriptions'); + } +} diff --git a/resources/views/home.blade.php b/resources/views/home.blade.php index 82710b1..91614f7 100644 --- a/resources/views/home.blade.php +++ b/resources/views/home.blade.php @@ -17,7 +17,9 @@ Créer par Status Contenu + @if (Auth::user()->role === 1) + @endif @foreach ($tickets as $ticket) @@ -79,7 +81,7 @@ - @if ($ticket->created_by === Auth::user()->id || Auth::user()->role === 1) + @if (Auth::user()->role === 1) Modifier @endif diff --git a/resources/views/mails/ticket-update.blade.php b/resources/views/mails/ticket-update.blade.php new file mode 100644 index 0000000..44cd431 --- /dev/null +++ b/resources/views/mails/ticket-update.blade.php @@ -0,0 +1,9 @@ +

Bonjour,

+

Le ticket n°{{ $ticket->id }} à été mis à jour :

+ +

{!! $corpsMaj !!}

+

Lien vers le ticket : Ouvrir dans un nouvel onglet

diff --git a/resources/views/ticket/show.blade.php b/resources/views/ticket/show.blade.php index 6588af7..40a816b 100644 --- a/resources/views/ticket/show.blade.php +++ b/resources/views/ticket/show.blade.php @@ -3,13 +3,20 @@ @section('content')
-

+

← Ticket n°{{ $ticket->id }} : {{ $ticket->project->name }} - {{ $ticket->type === 0 ? "Bug" : "Évolution" }} @if (Auth::user()->role !== 1) {{ $status[$ticket->status] }} @endif

+
+ @csrf +
+ + +
+
@if (Auth::user()->role === 1)
@csrf @@ -100,6 +107,7 @@

{!! nl2br(e($ticket->text)) !!}

Créer le {{ \Carbon\Carbon::parse($ticket->created_at)->format('d/m/Y à H:i') }}
+ @if ($ticket->file !== null || $ticket->file2 !== null)

Pièces jointes

@@ -118,5 +126,6 @@ @endif
+ @endif
@endsection diff --git a/routes/web.php b/routes/web.php index ac73c44..e0e9874 100644 --- a/routes/web.php +++ b/routes/web.php @@ -29,6 +29,7 @@ Route::middleware(['auth'])->group(function () { Route::get('/ticket/{id}', [TicketController::class, 'show'])->name('show-ticket'); Route::post('/ticket/change-status/{id}', [TicketController::class, 'changeStatus'])->name('change-status-ticket'); Route::put('/ticket/message/create', [TicketController::class, 'createMessage'])->name('create-message'); + Route::post('/ticket/subscribe/{id}', [TicketController::class, 'subscribe'])->name('subscribe-ticket'); // Projets (admin) Route::middleware(['is-admin'])->group(function () { Route::get('/projects', [ProjectController::class, 'index'])->name('projects');