From 729c891542df36eae5d957190fa570a6a87ca4a0 Mon Sep 17 00:00:00 2001 From: Andras Bacsai <5845193+andrasbacsai@users.noreply.github.com> Date: Fri, 10 Oct 2025 17:57:10 +0200 Subject: [PATCH] feat: add WebhookChannel placeholder implementation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add basic WebhookChannel infrastructure: - Create SendsWebhook interface - Create WebhookChannel with placeholder implementation (logs instead of sending) - Update Test notification to support webhook channel - Add WebhookChannel to HasNotificationSettings trait - Add toWebhook() method to Test notification This provides a working foundation that won't break test notifications. The actual HTTP webhook delivery will be implemented in a follow-up. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude --- app/Notifications/Channels/SendsWebhook.php | 8 +++++ app/Notifications/Channels/WebhookChannel.php | 33 +++++++++++++++++++ app/Notifications/Test.php | 12 ++++++- app/Traits/HasNotificationSettings.php | 2 ++ 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 app/Notifications/Channels/SendsWebhook.php create mode 100644 app/Notifications/Channels/WebhookChannel.php diff --git a/app/Notifications/Channels/SendsWebhook.php b/app/Notifications/Channels/SendsWebhook.php new file mode 100644 index 000000000..9301a4ff0 --- /dev/null +++ b/app/Notifications/Channels/SendsWebhook.php @@ -0,0 +1,8 @@ +webhookNotificationSettings; + + if (! $webhookSettings || ! $webhookSettings->isEnabled() || ! $webhookSettings->webhook_url) { + return; + } + + // TODO: Implement actual webhook delivery + // This is a placeholder implementation + // You'll need to: + // 1. Get the webhook payload from $notification->toWebhook() + // 2. Create a job to send the HTTP POST request to $webhookSettings->webhook_url + // 3. Handle retries and errors appropriately + + Log::info('Webhook notification would be sent', [ + 'url' => $webhookSettings->webhook_url, + 'notification' => get_class($notification), + ]); + } +} diff --git a/app/Notifications/Test.php b/app/Notifications/Test.php index 430eb7b48..5a635a601 100644 --- a/app/Notifications/Test.php +++ b/app/Notifications/Test.php @@ -7,6 +7,7 @@ use App\Notifications\Channels\PushoverChannel; use App\Notifications\Channels\SlackChannel; use App\Notifications\Channels\TelegramChannel; +use App\Notifications\Channels\WebhookChannel; use App\Notifications\Dto\DiscordMessage; use App\Notifications\Dto\PushoverMessage; use App\Notifications\Dto\SlackMessage; @@ -36,7 +37,7 @@ public function via(object $notifiable): array 'telegram' => [TelegramChannel::class], 'slack' => [SlackChannel::class], 'pushover' => [PushoverChannel::class], - 'webhook' => [], // WebhookChannel will be implemented later + 'webhook' => [WebhookChannel::class], default => [], }; } else { @@ -111,4 +112,13 @@ public function toSlack(): SlackMessage description: 'This is a test Slack notification from Coolify.' ); } + + public function toWebhook(): array + { + return [ + 'event' => 'test', + 'message' => 'This is a test webhook notification from Coolify.', + 'url' => base_url(), + ]; + } } diff --git a/app/Traits/HasNotificationSettings.php b/app/Traits/HasNotificationSettings.php index d10122386..297b44a06 100644 --- a/app/Traits/HasNotificationSettings.php +++ b/app/Traits/HasNotificationSettings.php @@ -7,6 +7,7 @@ use App\Notifications\Channels\PushoverChannel; use App\Notifications\Channels\SlackChannel; use App\Notifications\Channels\TelegramChannel; +use App\Notifications\Channels\WebhookChannel; use Illuminate\Database\Eloquent\Model; trait HasNotificationSettings @@ -78,6 +79,7 @@ public function getEnabledChannels(string $event): array 'telegram' => TelegramChannel::class, 'slack' => SlackChannel::class, 'pushover' => PushoverChannel::class, + 'webhook' => WebhookChannel::class, ]; if ($event === 'general') {