diff --git a/web/app/Jobs/StatusChangeDetection.php b/web/app/Jobs/StatusChangeDetection.php index 5ab635c0e3367e6ede00fa9e1161fc044551e787..4a19937207a6d2d80b760cedba493c1f8763210c 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 0000000000000000000000000000000000000000..851638dc9ab9ab6b66d5e24c71ac76df5f7f227e --- /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 bb3d62131e87ada7b8dae0e7ae99f210dff0f217..f0face9a2ad5df665b01aee552fe81bbb7bb2f78 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 3ab7b641f2ccf845ea41f92aecea71746de886a9..896a10d312eb13e32a43beaa06eab424715a4705 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 0000000000000000000000000000000000000000..650ce3ef3c9fc7b02fbf1ce0198d8e3cac115b00 --- /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 5a53824c0251bcbdd4445fd7a70db3743d674d89..6320418c71987a0c4f0f92ce12c3dd62821aa931 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);