webhook = $webhook; $this->event = $event; $this->detail = $detail; $this->initiator = user(); $this->initiatedTime = time(); } /** * Execute the job. * * @return void */ public function handle() { $themeResponse = Theme::dispatch(ThemeEvents::WEBHOOK_CALL_BEFORE, $this->event, $this->webhook, $this->detail); $webhookData = $themeResponse ?? $this->buildWebhookData(); try { $response = Http::asJson() ->withOptions(['allow_redirects' => ['strict' => true]]) ->timeout(3) ->post($this->webhook->endpoint, $webhookData); } catch (\Exception $exception) { Log::error("Webhook call to endpoint {$this->webhook->endpoint} failed with error \"{$exception->getMessage()}\""); return; } if ($response->failed()) { Log::error("Webhook call to endpoint {$this->webhook->endpoint} failed with status {$response->status()}"); } } protected function buildWebhookData(): array { $textParts = [ $this->initiator->name, trans('activities.' . $this->event), ]; if ($this->detail instanceof Entity) { $textParts[] = '"' . $this->detail->name . '"'; } $data = [ 'event' => $this->event, 'text' => implode(' ', $textParts), 'triggered_at' => Carbon::createFromTimestampUTC($this->initiatedTime)->toISOString(), 'triggered_by' => $this->initiator->attributesToArray(), 'triggered_by_profile_url' => $this->initiator->getProfileUrl(), 'webhook_id' => $this->webhook->id, 'webhook_name' => $this->webhook->name, ]; if (method_exists($this->detail, 'getUrl')) { $data['url'] = $this->detail->getUrl(); } if ($this->detail instanceof Model) { $data['related_item'] = $this->detail->attributesToArray(); } return $data; } }