From 7bff55496f1de70d7104ecfee741838f4c127261 Mon Sep 17 00:00:00 2001 From: Thibault Debatty <thibault.debatty@gmail.com> Date: Thu, 24 Jan 2019 14:47:27 +0100 Subject: [PATCH] Send email on status change --- web/app/Jobs/StatusChangeDetection.php | 5 +++ web/app/Mail/StatusChanged.php | 37 +++++++++++++++++++ web/app/Server.php | 4 ++ web/app/StatusChange.php | 4 ++ .../views/emails/server/status.blade.php | 10 +++++ web/tests/Unit/ExampleTest.php | 23 ++++++++++-- 6 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 web/app/Mail/StatusChanged.php create mode 100644 web/resources/views/emails/server/status.blade.php diff --git a/web/app/Jobs/StatusChangeDetection.php b/web/app/Jobs/StatusChangeDetection.php index 5ab635c..4a19937 100644 --- a/web/app/Jobs/StatusChangeDetection.php +++ b/web/app/Jobs/StatusChangeDetection.php @@ -11,6 +11,7 @@ use Illuminate\Queue\SerializesModels; use Illuminate\Queue\InteractsWithQueue; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; +use Illuminate\Support\Facades\Mail; class StatusChangeDetection implements ShouldQueue { @@ -55,5 +56,9 @@ class StatusChangeDetection implements ShouldQueue $change->time = time(); $change->status = $current_status; StatusChange::save($change); + + foreach ($server->organization->users as $user) { + Mail::to($user)->send(new \App\Mail\StatusChanged($change)); + } } } diff --git a/web/app/Mail/StatusChanged.php b/web/app/Mail/StatusChanged.php new file mode 100644 index 0000000..851638d --- /dev/null +++ b/web/app/Mail/StatusChanged.php @@ -0,0 +1,37 @@ +<?php + +namespace App\Mail; + +use Illuminate\Bus\Queueable; +use Illuminate\Mail\Mailable; +use Illuminate\Queue\SerializesModels; +use Illuminate\Contracts\Queue\ShouldQueue; + +class StatusChanged extends Mailable +{ + use Queueable, SerializesModels; + + private $change; + + /** + * Create a new message instance. + * + * @return void + */ + public function __construct(\App\StatusChange $change) + { + $this->change = $change; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + return $this->markdown('emails.server.status') + ->with(["change" => $this->change]) + ->subject($this->change->server()->name . " : Status Change"); + } +} diff --git a/web/app/Server.php b/web/app/Server.php index bb3d621..f0face9 100644 --- a/web/app/Server.php +++ b/web/app/Server.php @@ -224,4 +224,8 @@ class Server extends Model public function getChanges($count = 10) { return \App\StatusChange::getLastChangesForServer($this->id, $count); } + + public static function id($id) : Server { + return self::where("id", $id)->first(); + } } diff --git a/web/app/StatusChange.php b/web/app/StatusChange.php index 3ab7b64..896a10d 100644 --- a/web/app/StatusChange.php +++ b/web/app/StatusChange.php @@ -38,6 +38,10 @@ class StatusChange { return Carbon::createFromTimestamp($this->time); } + public function server() : Server { + return Server::id($this->server_id); + } + public static function save($status) { $data = [ "time" => time(), diff --git a/web/resources/views/emails/server/status.blade.php b/web/resources/views/emails/server/status.blade.php new file mode 100644 index 0000000..650ce3e --- /dev/null +++ b/web/resources/views/emails/server/status.blade.php @@ -0,0 +1,10 @@ +@component('mail::message') +# {{ $change->server()->name }} : status change + +Your server "{{ $change->server()->name }}" went to {!! $change->getStatusBadge() !!} + +{{ action("ServerController@show", ["server" => $change->server()]) }} + + +{{ config('app.name') }} +@endcomponent diff --git a/web/tests/Unit/ExampleTest.php b/web/tests/Unit/ExampleTest.php index 5a53824..6320418 100644 --- a/web/tests/Unit/ExampleTest.php +++ b/web/tests/Unit/ExampleTest.php @@ -121,15 +121,30 @@ class ExampleTest extends TestCase * @group status-change */ public function testStatusChangeDetection() { + $organization = new Organization(); + $organization->name = "ACME"; + $organization->save(); + $server = new \App\Server(); - $server->id = 1; + $server->name = "My test server"; + $server->organization()->associate($organization); + $server->save(); + + $server_id = $server->id; + + $user = new User(); + $user->name = "Test"; + $user->email = "thibault.debatty@gmail.com"; + $user->password = "qmlskdj"; + $user->save(); + $organization->users()->attach($user->id); - $this->assertEquals(1, \App\StatusChange::getLastChangeForServer(1)->server_id); + $this->assertEquals($server_id, \App\StatusChange::getLastChangeForServer(1)->server_id); // Insert a fake status change $change = new \App\StatusChange(); $change->status = 155; - $change->server_id = 1; + $change->server_id = $server_id; \App\StatusChange::save($change); // Run change detection @@ -137,7 +152,7 @@ class ExampleTest extends TestCase $change_detection_job->detectChangeForServer($server); // Check if a new StatusChange was inserted in Mongo - $last_change = \App\StatusChange::getLastChangeForServer(1); + $last_change = \App\StatusChange::getLastChangeForServer($server_id); $this->assertEquals( $server->status(), $last_change->status); -- GitLab