diff --git a/app/Jobs/SendMessageToSlackJob.php b/app/Jobs/SendMessageToSlackJob.php index dd5335850..fcd87a9dd 100644 --- a/app/Jobs/SendMessageToSlackJob.php +++ b/app/Jobs/SendMessageToSlackJob.php @@ -22,6 +22,36 @@ public function __construct( } public function handle(): void + { + if ($this->isSlackWebhook()) { + $this->sendToSlack(); + + return; + } + + /** + * This works with Mattermost and as a fallback also with Slack, the notifications just look slightly different and advanced formatting for slack is not supported with Mattermost. + * + * @see https://github.com/coollabsio/coolify/pull/6139#issuecomment-3756777708 + */ + $this->sendToMattermost(); + } + + private function isSlackWebhook(): bool + { + $parsedUrl = parse_url($this->webhookUrl); + + if ($parsedUrl === false) { + return false; + } + + $scheme = $parsedUrl['scheme'] ?? ''; + $host = $parsedUrl['host'] ?? ''; + + return $scheme === 'https' && $host === 'hooks.slack.com'; + } + + private function sendToSlack(): void { Http::post($this->webhookUrl, [ 'text' => $this->message->title, @@ -57,4 +87,24 @@ public function handle(): void ], ]); } + + /** + * @todo v5 refactor: Extract this into a separate SendMessageToMattermostJob.php triggered via the "mattermost" notification channel type. + */ + private function sendToMattermost(): void + { + $username = config('app.name'); + + Http::post($this->webhookUrl, [ + 'username' => $username, + 'attachments' => [ + [ + 'title' => $this->message->title, + 'color' => $this->message->color, + 'text' => $this->message->description, + 'footer' => $username, + ], + ], + ]); + } }