mirror of
https://github.com/tiennm99/coolify.git
synced 2026-10-23 02:15:49 +00:00
Add notification-level deduplication keys and TTLs for deployment, backup, server, container, scheduled task, SSL, token, and transactional emails. Apply deduplication in email channels before sending rendered messages.
143 lines
4.3 KiB
PHP
143 lines
4.3 KiB
PHP
<?php
|
|
|
|
namespace App\Notifications\Application;
|
|
|
|
use App\Models\Application;
|
|
use App\Notifications\CustomEmailNotification;
|
|
use App\Notifications\Dto\DiscordMessage;
|
|
use App\Notifications\Dto\PushoverMessage;
|
|
use App\Notifications\Dto\SlackMessage;
|
|
use Illuminate\Notifications\Messages\MailMessage;
|
|
|
|
class StatusChanged extends CustomEmailNotification
|
|
{
|
|
public string $resource_name;
|
|
|
|
public string $project_uuid;
|
|
|
|
public string $environment_uuid;
|
|
|
|
public string $environment_name;
|
|
|
|
public ?string $resource_url = null;
|
|
|
|
public ?string $fqdn;
|
|
|
|
public function __construct(public Application $resource)
|
|
{
|
|
$this->onQueue('high');
|
|
$this->resource_name = data_get($resource, 'name');
|
|
$this->project_uuid = data_get($resource, 'environment.project.uuid');
|
|
$this->environment_uuid = data_get($resource, 'environment.uuid');
|
|
$this->environment_name = data_get($resource, 'environment.name');
|
|
$this->fqdn = data_get($resource, 'fqdn', null);
|
|
if (str($this->fqdn)->explode(',')->count() > 1) {
|
|
$this->fqdn = str($this->fqdn)->explode(',')->first();
|
|
}
|
|
$this->resource_url = base_url()."/project/{$this->project_uuid}/environment/{$this->environment_uuid}/application/{$this->resource->uuid}";
|
|
}
|
|
|
|
public function via(object $notifiable): array
|
|
{
|
|
return $notifiable->getEnabledChannels('status_change');
|
|
}
|
|
|
|
public function deduplicationKey(object $notifiable, string $channel): ?string
|
|
{
|
|
return "application-status-changed:application:{$this->resource->uuid}:stopped";
|
|
}
|
|
|
|
public function deduplicateFor(): int
|
|
{
|
|
return 3600;
|
|
}
|
|
|
|
public function toMail(): MailMessage
|
|
{
|
|
$mail = new MailMessage;
|
|
$fqdn = $this->fqdn;
|
|
$mail->subject("Coolify: {$this->resource_name} has been stopped");
|
|
$mail->view('emails.application-status-changes', [
|
|
'name' => $this->resource_name,
|
|
'fqdn' => $fqdn,
|
|
'application_url' => $this->resource_url,
|
|
'resource_url' => $this->resource_url,
|
|
]);
|
|
|
|
return $mail;
|
|
}
|
|
|
|
public function toDiscord(): DiscordMessage
|
|
{
|
|
return new DiscordMessage(
|
|
title: ':cross_mark: Application stopped',
|
|
description: '[Open Application in Coolify]('.$this->resource_url.')',
|
|
color: DiscordMessage::errorColor(),
|
|
isCritical: true,
|
|
);
|
|
}
|
|
|
|
public function toTelegram(): array
|
|
{
|
|
$message = 'Coolify: '.$this->resource_name.' has been stopped.';
|
|
|
|
return [
|
|
'message' => $message,
|
|
'buttons' => [
|
|
[
|
|
'text' => 'Open Application in Coolify',
|
|
'url' => $this->resource_url,
|
|
],
|
|
],
|
|
];
|
|
}
|
|
|
|
public function toPushover(): PushoverMessage
|
|
{
|
|
$message = $this->resource_name.' has been stopped.';
|
|
|
|
return new PushoverMessage(
|
|
title: 'Application stopped',
|
|
level: 'error',
|
|
message: $message,
|
|
buttons: [
|
|
[
|
|
'text' => 'Open Application in Coolify',
|
|
'url' => $this->resource_url,
|
|
],
|
|
],
|
|
);
|
|
}
|
|
|
|
public function toSlack(): SlackMessage
|
|
{
|
|
$title = 'Application stopped';
|
|
$description = "{$this->resource_name} has been stopped";
|
|
|
|
$description .= "\n\n*Project:* ".data_get($this->resource, 'environment.project.name');
|
|
$description .= "\n*Environment:* {$this->environment_name}";
|
|
$description .= "\n*Application URL:* {$this->resource_url}";
|
|
|
|
return new SlackMessage(
|
|
title: $title,
|
|
description: $description,
|
|
color: SlackMessage::errorColor()
|
|
);
|
|
}
|
|
|
|
public function toWebhook(): array
|
|
{
|
|
return [
|
|
'success' => false,
|
|
'message' => 'Application stopped',
|
|
'event' => 'status_changed',
|
|
'application_name' => $this->resource_name,
|
|
'application_uuid' => $this->resource->uuid,
|
|
'url' => $this->resource_url,
|
|
'project' => data_get($this->resource, 'environment.project.name'),
|
|
'environment' => $this->environment_name,
|
|
'fqdn' => $this->fqdn,
|
|
];
|
|
}
|
|
}
|