webhook = $webhook; $this->event = $event; $this->detail = $detail; $this->initiator = user(); $this->initiatedTime = time(); } /** * Execute the job. * * @return void */ public function handle() { $httpClient = new Client([ 'timeout' => 3, 'allow_redirects' => ['strict' => true], ]); $request = new Request('POST', $this->webhook->endpoint, [ 'Content-Type' => 'application/json' ], json_encode($this->buildWebhookData())); try { $response = $httpClient->send($request); if ($response->getStatusCode() >= 400) { Log::error("Webhook call to endpoint {$this->webhook->endpoint} failed with status {$response->getStatusCode()}"); } } catch (ClientExceptionInterface $exception) { Log::error("Received error during webhook call to endpoint {$this->webhook->endpoint}: {$exception->getMessage()}"); } } 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; } }