diff --git a/app/Domain/Notifications/KeyHasBeenGivenNotification.php b/app/Domain/Notifications/KeyHasBeenGivenNotification.php index 977f5bf..2759396 100644 --- a/app/Domain/Notifications/KeyHasBeenGivenNotification.php +++ b/app/Domain/Notifications/KeyHasBeenGivenNotification.php @@ -7,6 +7,7 @@ namespace Toby\Domain\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Notification; use Toby\Eloquent\Models\User; +use Toby\Infrastructure\Slack\Elements\SlackMessage; class KeyHasBeenGivenNotification extends Notification { @@ -22,13 +23,14 @@ class KeyHasBeenGivenNotification extends Notification return [Channels::SLACK]; } - public function toSlack(Notifiable $notifiable): string + public function toSlack(Notifiable $notifiable): SlackMessage { - return __(":sender gives key no :key to :recipient", [ - "sender" => $this->getName($this->sender), - "recipient" => $this->getName($this->recipient), - "key" => $notifiable->id, - ]); + return (new SlackMessage()) + ->text(__(":sender gives key no :key to :recipient", [ + "sender" => $this->getName($this->sender), + "recipient" => $this->getName($this->recipient), + "key" => $notifiable->id, + ])); } protected function getName(User $user): string diff --git a/app/Domain/Notifications/KeyHasBeenTakenNotification.php b/app/Domain/Notifications/KeyHasBeenTakenNotification.php index 71e8b7b..435fc02 100644 --- a/app/Domain/Notifications/KeyHasBeenTakenNotification.php +++ b/app/Domain/Notifications/KeyHasBeenTakenNotification.php @@ -7,6 +7,7 @@ namespace Toby\Domain\Notifications; use Illuminate\Bus\Queueable; use Illuminate\Notifications\Notification; use Toby\Eloquent\Models\User; +use Toby\Infrastructure\Slack\Elements\SlackMessage; class KeyHasBeenTakenNotification extends Notification { @@ -22,13 +23,14 @@ class KeyHasBeenTakenNotification extends Notification return [Channels::SLACK]; } - public function toSlack(Notifiable $notifiable): string + public function toSlack(Notifiable $notifiable): SlackMessage { - return __(":recipient takes key no :key from :sender", [ - "recipient" => $this->getName($this->recipient), - "sender" => $this->getName($this->sender), - "key" => $notifiable->id, - ]); + return (new SlackMessage()) + ->text(__(":recipient takes key no :key from :sender", [ + "recipient" => $this->getName($this->recipient), + "sender" => $this->getName($this->sender), + "key" => $notifiable->id, + ])); } protected function getName(User $user): string diff --git a/app/Domain/Notifications/VacationRequestCreatedNotification.php b/app/Domain/Notifications/VacationRequestCreatedNotification.php index 9a352c6..187ee45 100644 --- a/app/Domain/Notifications/VacationRequestCreatedNotification.php +++ b/app/Domain/Notifications/VacationRequestCreatedNotification.php @@ -9,6 +9,7 @@ use Illuminate\Notifications\Messages\MailMessage; use Illuminate\Notifications\Notification; use InvalidArgumentException; use Toby\Eloquent\Models\VacationRequest; +use Toby\Infrastructure\Slack\Elements\SlackMessage; class VacationRequestCreatedNotification extends Notification { @@ -23,14 +24,12 @@ class VacationRequestCreatedNotification extends Notification return [Channels::MAIL, Channels::SLACK]; } - public function toSlack(): string + public function toSlack(): SlackMessage { $url = route("vacation.requests.show", ["vacationRequest" => $this->vacationRequest->id]); - return implode("\n", [ - $this->buildDescription(), - "<${url}|Zobacz szczegóły>", - ]); + return (new SlackMessage()) + ->text("{$this->buildDescription()}\n <${url}|Zobacz szczegóły>"); } /** @@ -56,19 +55,25 @@ class VacationRequestCreatedNotification extends Notification $days = $this->vacationRequest->vacations()->count(); return (new MailMessage()) - ->greeting(__("Hi :user!", [ - "user" => $user, - ])) + ->greeting( + __("Hi :user!", [ + "user" => $user, + ]), + ) ->subject($this->buildSubject()) ->line($this->buildDescription()) - ->line(__("Vacation type: :type", [ - "type" => $type, - ])) - ->line(__("From :from to :to (number of days: :days)", [ - "from" => $from, - "to" => $to, - "days" => $days, - ])) + ->line( + __("Vacation type: :type", [ + "type" => $type, + ]), + ) + ->line( + __("From :from to :to (number of days: :days)", [ + "from" => $from, + "to" => $to, + "days" => $days, + ]), + ) ->action(__("Click here for details"), $url); } diff --git a/app/Domain/Notifications/VacationRequestStatusChangedNotification.php b/app/Domain/Notifications/VacationRequestStatusChangedNotification.php index 746e3a0..cacd1e4 100644 --- a/app/Domain/Notifications/VacationRequestStatusChangedNotification.php +++ b/app/Domain/Notifications/VacationRequestStatusChangedNotification.php @@ -10,6 +10,7 @@ use Illuminate\Notifications\Notification; use InvalidArgumentException; use Toby\Eloquent\Models\User; use Toby\Eloquent\Models\VacationRequest; +use Toby\Infrastructure\Slack\Elements\SlackMessage; class VacationRequestStatusChangedNotification extends Notification { @@ -25,14 +26,12 @@ class VacationRequestStatusChangedNotification extends Notification return [Channels::MAIL, Channels::SLACK]; } - public function toSlack(): string + public function toSlack(): SlackMessage { $url = route("vacation.requests.show", ["vacationRequest" => $this->vacationRequest->id]); - return implode("\n", [ - $this->buildDescription(), - "<${url}|Zobacz szczegóły>", - ]); + return (new SlackMessage()) + ->text("{$this->buildDescription()}\n <${url}|Zobacz szczegóły>"); } /** diff --git a/app/Domain/Notifications/VacationRequestWaitsForApprovalNotification.php b/app/Domain/Notifications/VacationRequestWaitsForApprovalNotification.php index 63ea770..b4033ad 100644 --- a/app/Domain/Notifications/VacationRequestWaitsForApprovalNotification.php +++ b/app/Domain/Notifications/VacationRequestWaitsForApprovalNotification.php @@ -11,6 +11,7 @@ use InvalidArgumentException; use Toby\Domain\States\VacationRequest\WaitingForTechnical; use Toby\Eloquent\Models\User; use Toby\Eloquent\Models\VacationRequest; +use Toby\Infrastructure\Slack\Elements\SlackMessage; class VacationRequestWaitsForApprovalNotification extends Notification { @@ -26,14 +27,12 @@ class VacationRequestWaitsForApprovalNotification extends Notification return [Channels::MAIL, Channels::SLACK]; } - public function toSlack(): string + public function toSlack(): SlackMessage { $url = route("vacation.requests.show", ["vacationRequest" => $this->vacationRequest->id]); - return implode("\n", [ - $this->buildDescription(), - "<${url}|Zobacz szczegóły>", - ]); + return (new SlackMessage()) + ->text("{$this->buildDescription()}\n <${url}|Zobacz szczegóły>"); } /** diff --git a/app/Domain/Notifications/VacationRequestsSummaryNotification.php b/app/Domain/Notifications/VacationRequestsSummaryNotification.php index 7eb1de4..a56d12a 100644 --- a/app/Domain/Notifications/VacationRequestsSummaryNotification.php +++ b/app/Domain/Notifications/VacationRequestsSummaryNotification.php @@ -10,6 +10,8 @@ use Illuminate\Notifications\Notification; use Illuminate\Support\Carbon; use Illuminate\Support\Collection; use Toby\Eloquent\Models\User; +use Toby\Infrastructure\Slack\Elements\SlackMessage; +use Toby\Infrastructure\Slack\Elements\VacationRequestsAttachment; class VacationRequestsSummaryNotification extends Notification { @@ -22,7 +24,14 @@ class VacationRequestsSummaryNotification extends Notification public function via(): array { - return ["mail"]; + return [Channels::MAIL, Channels::SLACK]; + } + + public function toSlack(): SlackMessage + { + return (new SlackMessage()) + ->text("Lista wniosków oczekujących na Twoją akcję - stan na dzień {$this->day->toDisplayString()}:") + ->withAttachment(new VacationRequestsAttachment($this->vacationRequests)); } public function toMail($notifiable): MailMessage diff --git a/app/Infrastructure/Slack/Channels/SlackApiChannel.php b/app/Infrastructure/Slack/Channels/SlackApiChannel.php index d790555..b8a9e67 100644 --- a/app/Infrastructure/Slack/Channels/SlackApiChannel.php +++ b/app/Infrastructure/Slack/Channels/SlackApiChannel.php @@ -17,11 +17,12 @@ class SlackApiChannel $url = "{$baseUrl}/chat.postMessage"; $channel = $notifiable->routeNotificationFor("slack", $notification); + $message = $notification->toSlack($notifiable); + return Http::withToken($this->getClientToken()) - ->post($url, [ + ->post($url, array_merge($message->getPayload(), [ "channel" => $channel, - "text" => $notification->toSlack($notifiable), - ]); + ])); } protected function getClientToken(): string diff --git a/app/Infrastructure/Slack/Elements/SlackMessage.php b/app/Infrastructure/Slack/Elements/SlackMessage.php new file mode 100644 index 0000000..05d8e1b --- /dev/null +++ b/app/Infrastructure/Slack/Elements/SlackMessage.php @@ -0,0 +1,53 @@ +attachments = new Collection(); + } + + public function text(string $text): static + { + $this->text = $text; + + return $this; + } + + public function withAttachment(Attachment $attachment): static + { + $this->attachments->push($attachment); + + return $this; + } + + public function withAttachments(Collection $attachments): static + { + foreach ($attachments as $attachment) { + $this->withAttachment($attachment); + } + + return $this; + } + + public function getPayload(): array + { + return [ + "text" => $this->text, + "link_names" => true, + "unfurl_links" => true, + "unfurl_media" => true, + "mrkdwn" => true, + "attachments" => $this->attachments->toArray(), + ]; + } +} diff --git a/app/Infrastructure/Slack/Elements/VacationRequestsAttachment.php b/app/Infrastructure/Slack/Elements/VacationRequestsAttachment.php new file mode 100644 index 0000000..933b8fb --- /dev/null +++ b/app/Infrastructure/Slack/Elements/VacationRequestsAttachment.php @@ -0,0 +1,33 @@ +setColor("#527aba") + ->setItems($this->mapVacationRequests($vacationRequests)); + } + + protected function mapVacationRequests(Collection $vacationRequests): Collection + { + return $vacationRequests->map(function (VacationRequest $request): string { + $url = route("vacation.requests.show", ["vacationRequest" => $request->id]); + + $date = $request->from->equalTo($request->to) + ? "{$request->from->toDisplayString()}" + : "{$request->from->toDisplayString()} - {$request->to->toDisplayString()}"; + + return "<{$url}|Wniosek nr {$request->name}> użytkownika {$request->user->profile->full_name} ({$date})"; + }); + } +}