diff --git a/app/Actions/Site/Deploy.php b/app/Actions/Site/Deploy.php index 1c3faca3..79fdce2c 100644 --- a/app/Actions/Site/Deploy.php +++ b/app/Actions/Site/Deploy.php @@ -5,9 +5,11 @@ use App\Enums\DeploymentStatus; use App\Exceptions\DeploymentScriptIsEmptyException; use App\Exceptions\SSHError; +use App\Facades\Notifier; use App\Models\Deployment; use App\Models\ServerLog; use App\Models\Site; +use App\Notifications\DeploymentCompleted; class Deploy { @@ -53,9 +55,11 @@ public function run(Site $site): Deployment ); $deployment->status = DeploymentStatus::FINISHED; $deployment->save(); - })->catch(function () use ($deployment) { + Notifier::send($site, new DeploymentCompleted($deployment, $site)); + })->catch(function () use ($deployment, $site) { $deployment->status = DeploymentStatus::FAILED; $deployment->save(); + Notifier::send($site, new DeploymentCompleted($deployment, $site)); })->onConnection('ssh'); return $deployment; diff --git a/app/Notifications/DeploymentCompleted.php b/app/Notifications/DeploymentCompleted.php new file mode 100644 index 00000000..20520486 --- /dev/null +++ b/app/Notifications/DeploymentCompleted.php @@ -0,0 +1,50 @@ +deployment = $deployment; + $this->site = $site; + } + + public function rawText(): string + { + return __('Deployment for site [:site] has completed with status: :status', [ + 'site' => $this->site->domain, + 'status' => $this->deployment->status, + ]); + } + + public function toEmail(object $notifiable): MailMessage + { + return (new MailMessage) + ->subject(__('Deployment Completed')) + ->line('Deployment for site ['.$this->site->domain.'] has completed with status: '.$this->deployment->status); + } + + public function toSlack(object $notifiable): string + { + return $this->rawText(); + } + + public function toDiscord(object $notifiable): string + { + return $this->rawText(); + } + + public function toTelegram(object $notifiable): string + { + return $this->rawText(); + } +} diff --git a/tests/Feature/ApplicationTest.php b/tests/Feature/ApplicationTest.php index 90f96464..3811f906 100644 --- a/tests/Feature/ApplicationTest.php +++ b/tests/Feature/ApplicationTest.php @@ -5,10 +5,12 @@ use App\Enums\DeploymentStatus; use App\Facades\SSH; use App\Models\GitHook; +use App\Notifications\DeploymentCompleted; use App\Web\Pages\Servers\Sites\View; use App\Web\Pages\Servers\Sites\Widgets\DeploymentsList; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Support\Facades\Http; +use Illuminate\Support\Facades\Notification; use Livewire\Livewire; use Tests\TestCase; @@ -65,6 +67,7 @@ public function test_deploy(): void ], ]), ]); + Notification::fake(); $this->site->deploymentScript->update([ 'content' => 'git pull', @@ -88,6 +91,8 @@ public function test_deploy(): void SSH::assertExecutedContains('cd /home/vito/'.$this->site->domain); SSH::assertExecutedContains('git pull'); + Notification::assertSentTo($this->notificationChannel, DeploymentCompleted::class); + $this->get( View::getUrl([ 'server' => $this->server, diff --git a/tests/TestCase.php b/tests/TestCase.php index 6414f065..4cf85499 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -3,10 +3,10 @@ namespace Tests; use App\Enums\Database; -use App\Enums\NotificationChannel; use App\Enums\ServiceStatus; use App\Enums\UserRole; use App\Enums\Webserver; +use App\Models\NotificationChannel; use App\Models\Server; use App\Models\Site; use App\Models\SourceControl; @@ -24,6 +24,8 @@ abstract class TestCase extends BaseTestCase protected Site $site; + protected NotificationChannel $notificationChannel; + public const EXPECT_SUCCESS = true; public const EXPECT_FAILURE = false; @@ -40,8 +42,8 @@ protected function setUp(): void ]); $this->user->createDefaultProject(); - \App\Models\NotificationChannel::factory()->create([ - 'provider' => NotificationChannel::EMAIL, + $this->notificationChannel = NotificationChannel::factory()->create([ + 'provider' => \App\Enums\NotificationChannel::EMAIL, 'connected' => true, 'data' => [ 'email' => 'user@example.com',