From 802ef0301301f12c7cdc398466c8a2107a57a4f7 Mon Sep 17 00:00:00 2001 From: Andras Bacsai Date: Wed, 26 Jul 2023 14:46:28 +0200 Subject: [PATCH] fix: notifications feat: add app stopped notification --- app/Console/Kernel.php | 3 + app/Http/Livewire/Application/Heading.php | 2 + app/Jobs/ApplicationContainerStatusJob.php | 7 ++ app/Jobs/ApplicationDeploymentJob.php | 8 ++ app/Jobs/InstanceApplicationsStatusJob.php | 35 ++++++++ .../ApplicationStoppedNotification.php | 82 +++++++++++++++++++ .../DeployedSuccessfullyNotification.php | 14 ++-- 7 files changed, 146 insertions(+), 5 deletions(-) create mode 100644 app/Jobs/InstanceApplicationsStatusJob.php create mode 100644 app/Notifications/Notifications/Application/ApplicationStoppedNotification.php diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 4e52dbb81..8acfc53c8 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -2,6 +2,7 @@ namespace App\Console; +use App\Jobs\InstanceApplicationsStatusJob; use App\Jobs\CheckResaleLicenseJob; use App\Jobs\InstanceAutoUpdateJob; use App\Jobs\ProxyCheckJob; @@ -16,12 +17,14 @@ protected function schedule(Schedule $schedule): void { if (isDev()) { $schedule->command('horizon:snapshot')->everyMinute(); + $schedule->job(new InstanceApplicationsStatusJob)->everyMinute(); $schedule->job(new ProxyCheckJob)->everyFiveMinutes(); // $schedule->job(new CheckResaleLicenseJob)->hourly(); // $schedule->job(new DockerCleanupJob)->everyOddHour(); // $schedule->job(new InstanceAutoUpdateJob(true))->everyMinute(); } else { $schedule->command('horizon:snapshot')->everyFiveMinutes(); + $schedule->job(new InstanceApplicationsStatusJob)->everyMinute(); $schedule->job(new CheckResaleLicenseJob)->hourly(); $schedule->job(new ProxyCheckJob)->everyFiveMinutes(); $schedule->job(new DockerCleanupJob)->everyTenMinutes(); diff --git a/app/Http/Livewire/Application/Heading.php b/app/Http/Livewire/Application/Heading.php index 99bc7d4f8..44864f81b 100644 --- a/app/Http/Livewire/Application/Heading.php +++ b/app/Http/Livewire/Application/Heading.php @@ -4,6 +4,7 @@ use App\Jobs\ApplicationContainerStatusJob; use App\Models\Application; +use App\Notifications\Notifications\Application\ApplicationStoppedNotification; use Livewire\Component; use Visus\Cuid2\Cuid2; @@ -54,6 +55,7 @@ public function stop() ); $this->application->status = 'stopped'; $this->application->save(); + $this->application->environment->project->team->notify(new ApplicationStoppedNotification($this->application)); } protected function setDeploymentUuid() { diff --git a/app/Jobs/ApplicationContainerStatusJob.php b/app/Jobs/ApplicationContainerStatusJob.php index c8d87028c..7bb1f5931 100644 --- a/app/Jobs/ApplicationContainerStatusJob.php +++ b/app/Jobs/ApplicationContainerStatusJob.php @@ -4,6 +4,7 @@ use App\Models\Application; use App\Models\ApplicationPreview; +use App\Notifications\Notifications\Application\ApplicationStoppedNotification; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldBeUnique; use Illuminate\Contracts\Queue\ShouldQueue; @@ -32,8 +33,14 @@ public function uniqueId(): string } public function handle(): void { + ray('checking status of ' . $this->container_name); try { $status = get_container_status(server: $this->application->destination->server, container_id: $this->container_name, throwError: false); + ray($this->application->status, $status); + if ($this->application->status === 'running' && $status !== 'running') { + $this->application->environment->project->team->notify(new ApplicationStoppedNotification($this->application)); + } + if ($this->pull_request_id) { $preview = ApplicationPreview::findPreviewByApplicationAndPullId($this->application->id, $this->pull_request_id); $preview->status = $status; diff --git a/app/Jobs/ApplicationDeploymentJob.php b/app/Jobs/ApplicationDeploymentJob.php index a800d7c2e..0068e46e7 100644 --- a/app/Jobs/ApplicationDeploymentJob.php +++ b/app/Jobs/ApplicationDeploymentJob.php @@ -12,6 +12,8 @@ use App\Models\Server; use App\Models\StandaloneDocker; use App\Models\SwarmDocker; +use App\Notifications\Notifications\Application\DeployedSuccessfullyNotification; +use App\Notifications\Notifications\Application\DeployedWithErrorNotification; use App\Traits\ExecuteRemoteCommand; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; @@ -221,6 +223,12 @@ private function next(string $status) ]); } queue_next_deployment($this->application); + if ($status === ApplicationDeploymentStatus::FINISHED->value) { + $this->application->environment->project->team->notify(new DeployedSuccessfullyNotification($this->application, $this->deployment_uuid, $this->preview)); + } + if ($status === ApplicationDeploymentStatus::FAILED->value) { + $this->application->environment->project->team->notify(new DeployedWithErrorNotification($this->application, $this->deployment_uuid, $this->preview)); + } } private function start_by_compose_file() { diff --git a/app/Jobs/InstanceApplicationsStatusJob.php b/app/Jobs/InstanceApplicationsStatusJob.php new file mode 100644 index 000000000..a01883010 --- /dev/null +++ b/app/Jobs/InstanceApplicationsStatusJob.php @@ -0,0 +1,35 @@ +applications = Application::all(); + } + public function handle(): void + { + try { + foreach ($this->applications as $application) { + dispatch(new ApplicationContainerStatusJob( + application: $application, + container_name: generate_container_name($application->uuid), + )); + } + } catch (\Exception $e) { + ray($e->getMessage()); + } + } +} diff --git a/app/Notifications/Notifications/Application/ApplicationStoppedNotification.php b/app/Notifications/Notifications/Application/ApplicationStoppedNotification.php new file mode 100644 index 000000000..323ff6c19 --- /dev/null +++ b/app/Notifications/Notifications/Application/ApplicationStoppedNotification.php @@ -0,0 +1,82 @@ +application = $application; + $this->application_name = data_get($application, 'name'); + $this->project_uuid = data_get($application, 'environment.project.uuid'); + $this->environment_name = data_get($application, 'environment.name'); + $this->fqdn = data_get($application, 'fqdn'); + if (Str::of($this->fqdn)->explode(',')->count() > 1) { + $this->fqdn = Str::of($this->fqdn)->explode(',')->first(); + } + $this->application_url = base_url() . "/project/{$this->project_uuid}/{$this->environment_name}/application/{$this->application->uuid}"; + } + public function via(object $notifiable): array + { + $channels = []; + $isEmailEnabled = data_get($notifiable, 'smtp.enabled'); + $isDiscordEnabled = data_get($notifiable, 'discord.enabled'); + $isSubscribedToEmailDeployments = data_get($notifiable, 'smtp_notifications.deployments'); + $isSubscribedToDiscordDeployments = data_get($notifiable, 'discord_notifications.deployments'); + + if ($isEmailEnabled && $isSubscribedToEmailDeployments) { + $channels[] = EmailChannel::class; + } + if ($isDiscordEnabled && $isSubscribedToDiscordDeployments) { + $channels[] = DiscordChannel::class; + } + return $channels; + } + public function toMail(): MailMessage + { + // $mail = new MailMessage(); + // $pull_request_id = data_get($this->preview, 'pull_request_id', 0); + // $fqdn = $this->fqdn; + // if ($pull_request_id === 0) { + // $mail->subject("✅New version is deployed of {$this->application_name}"); + // } else { + // $fqdn = $this->preview->fqdn; + // $mail->subject("✅ Pull request #{$pull_request_id} of {$this->application_name} deployed successfully"); + // } + // $mail->view('emails.application-deployed-successfully', [ + // 'name' => $this->application_name, + // 'fqdn' => $fqdn, + // 'deployment_url' => $this->deployment_url, + // 'pull_request_id' => $pull_request_id, + // ]); + // return $mail; + } + + public function toDiscord(): string + { + $message = '⛔ ' . $this->application_name . ' has been stopped. + +'; + $message .= '[Application URL](' . $this->application_url . ')'; + return $message; + } +} diff --git a/app/Notifications/Notifications/Application/DeployedSuccessfullyNotification.php b/app/Notifications/Notifications/Application/DeployedSuccessfullyNotification.php index 916cc82b8..0a44ec745 100644 --- a/app/Notifications/Notifications/Application/DeployedSuccessfullyNotification.php +++ b/app/Notifications/Notifications/Application/DeployedSuccessfullyNotification.php @@ -62,7 +62,7 @@ public function toMail(): MailMessage $pull_request_id = data_get($this->preview, 'pull_request_id', 0); $fqdn = $this->fqdn; if ($pull_request_id === 0) { - $mail->subject("✅ New version is deployed of {$this->application_name}"); + $mail->subject("✅New version is deployed of {$this->application_name}"); } else { $fqdn = $this->preview->fqdn; $mail->subject("✅ Pull request #{$pull_request_id} of {$this->application_name} deployed successfully"); @@ -79,15 +79,19 @@ public function toMail(): MailMessage public function toDiscord(): string { if ($this->preview) { - $message = '✅ Pull request #' . $this->preview->pull_request_id . ' of **' . $this->application_name . '** deployed successfully: '; + $message = '✅ New PR' . $this->preview->pull_request_id . ' version successfully deployed of ' . $this->application_name . ' + +'; if ($this->preview->fqdn) { - $message .= '[Application Link](' . $this->preview->fqdn . ') |'; + $message .= '[Open Application](' . $this->preview->fqdn . ') | '; } $message .= '[Deployment logs](' . $this->deployment_url . ')'; } else { - $message = '✅ A new version has been deployed of **' . $this->application_name . '**: '; + $message = '✅ New version successfully deployed of ' . $this->application_name . ' + +'; if ($this->fqdn) { - $message .= '[Application Link](' . $this->fqdn . ') |'; + $message .= '[Open Application](' . $this->fqdn . ') | '; } $message .= '[Deployment logs](' . $this->deployment_url . ')'; }