152 lines
5.2 KiB
PHP
152 lines
5.2 KiB
PHP
<?php
|
|
|
|
namespace App\Notifications;
|
|
|
|
use App\Notifications\Dto\DiscordMessage;
|
|
use App\Notifications\Dto\PushoverMessage;
|
|
use App\Notifications\Dto\SlackMessage;
|
|
use Illuminate\Notifications\Messages\MailMessage;
|
|
use Illuminate\Support\Collection;
|
|
use Spatie\Url\Url;
|
|
|
|
class SslExpirationNotification extends CustomEmailNotification
|
|
{
|
|
protected Collection $resources;
|
|
|
|
protected array $urls = [];
|
|
|
|
public function __construct(array|Collection $resources)
|
|
{
|
|
$this->onQueue('high');
|
|
$this->resources = collect($resources);
|
|
|
|
// Collect URLs for each resource
|
|
$this->resources->each(function ($resource) {
|
|
if (data_get($resource, 'environment.project.uuid')) {
|
|
$routeName = match ($resource->type()) {
|
|
'application' => 'project.application.configuration',
|
|
'database' => 'project.database.configuration',
|
|
'service' => 'project.service.configuration',
|
|
default => null
|
|
};
|
|
|
|
if ($routeName) {
|
|
$route = route($routeName, [
|
|
'project_uuid' => data_get($resource, 'environment.project.uuid'),
|
|
'environment_uuid' => data_get($resource, 'environment.uuid'),
|
|
$resource->type().'_uuid' => data_get($resource, 'uuid'),
|
|
]);
|
|
|
|
$settings = instanceSettings();
|
|
if (data_get($settings, 'fqdn')) {
|
|
$url = Url::fromString($route);
|
|
$url = $url->withPort(null);
|
|
$fqdn = data_get($settings, 'fqdn');
|
|
$fqdn = str_replace(['http://', 'https://'], '', $fqdn);
|
|
$url = $url->withHost($fqdn);
|
|
|
|
$this->urls[$resource->name] = $url->__toString();
|
|
} else {
|
|
$this->urls[$resource->name] = $route;
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
public function via(object $notifiable): array
|
|
{
|
|
return $notifiable->getEnabledChannels('ssl_certificate_renewal');
|
|
}
|
|
|
|
public function toMail(): MailMessage
|
|
{
|
|
$mail = new MailMessage;
|
|
$mail->subject('Coolify: [Action Required] SSL Certificates Renewed - Manual Redeployment Needed');
|
|
$mail->view('emails.ssl-certificate-renewed', [
|
|
'resources' => $this->resources,
|
|
'urls' => $this->urls,
|
|
]);
|
|
|
|
return $mail;
|
|
}
|
|
|
|
public function toDiscord(): DiscordMessage
|
|
{
|
|
$resourceNames = $this->resources->pluck('name')->join(', ');
|
|
|
|
$message = new DiscordMessage(
|
|
title: '🔒 SSL Certificates Renewed',
|
|
description: "SSL certificates have been renewed for: {$resourceNames}.\n\n**Action Required:** These resources need to be redeployed manually.",
|
|
color: DiscordMessage::warningColor(),
|
|
);
|
|
|
|
foreach ($this->urls as $name => $url) {
|
|
$message->addField($name, "[View Resource]({$url})");
|
|
}
|
|
|
|
return $message;
|
|
}
|
|
|
|
public function toTelegram(): array
|
|
{
|
|
$resourceNames = $this->resources->pluck('name')->join(', ');
|
|
$message = "Coolify: SSL certificates have been renewed for: {$resourceNames}.\n\nAction Required: These resources need to be redeployed manually for the new SSL certificates to take effect.";
|
|
|
|
$buttons = [];
|
|
foreach ($this->urls as $name => $url) {
|
|
$buttons[] = [
|
|
'text' => "View {$name}",
|
|
'url' => $url,
|
|
];
|
|
}
|
|
|
|
return [
|
|
'message' => $message,
|
|
'buttons' => $buttons,
|
|
];
|
|
}
|
|
|
|
public function toPushover(): PushoverMessage
|
|
{
|
|
$resourceNames = $this->resources->pluck('name')->join(', ');
|
|
$message = "SSL certificates have been renewed for: {$resourceNames}<br/><br/>";
|
|
$message .= '<b>Action Required:</b> These resources need to be redeployed manually for the new SSL certificates to take effect.';
|
|
|
|
$buttons = [];
|
|
foreach ($this->urls as $name => $url) {
|
|
$buttons[] = [
|
|
'text' => "View {$name}",
|
|
'url' => $url,
|
|
];
|
|
}
|
|
|
|
return new PushoverMessage(
|
|
title: 'SSL Certificates Renewed',
|
|
level: 'warning',
|
|
message: $message,
|
|
buttons: $buttons,
|
|
);
|
|
}
|
|
|
|
public function toSlack(): SlackMessage
|
|
{
|
|
$resourceNames = $this->resources->pluck('name')->join(', ');
|
|
$description = "SSL certificates have been renewed for: {$resourceNames}\n\n";
|
|
$description .= '**Action Required:** These resources need to be redeployed manually for the new SSL certificates to take effect.';
|
|
|
|
if (! empty($this->urls)) {
|
|
$description .= "\n\n**Resource URLs:**\n";
|
|
foreach ($this->urls as $name => $url) {
|
|
$description .= "• {$name}: {$url}\n";
|
|
}
|
|
}
|
|
|
|
return new SlackMessage(
|
|
title: '🔒 SSL Certificates Renewed',
|
|
description: $description,
|
|
color: SlackMessage::warningColor()
|
|
);
|
|
}
|
|
}
|