X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/f27d0d5aebf4bc88a72e6769c2d6b23b6bb2ceb9..refs/pull/3139/head:/app/Actions/DispatchWebhookJob.php diff --git a/app/Actions/DispatchWebhookJob.php b/app/Actions/DispatchWebhookJob.php index 69d04d36c..8f78150a9 100644 --- a/app/Actions/DispatchWebhookJob.php +++ b/app/Actions/DispatchWebhookJob.php @@ -4,8 +4,10 @@ namespace BookStack\Actions; use BookStack\Auth\User; use BookStack\Entities\Models\Entity; +use BookStack\Facades\Theme; use BookStack\Interfaces\Loggable; use BookStack\Model; +use BookStack\Theming\ThemeEvents; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Foundation\Bus\Dispatchable; @@ -17,7 +19,10 @@ use Illuminate\Support\Facades\Log; class DispatchWebhookJob implements ShouldQueue { - use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; + use Dispatchable; + use InteractsWithQueue; + use Queueable; + use SerializesModels; /** * @var Webhook @@ -65,14 +70,32 @@ class DispatchWebhookJob implements ShouldQueue */ public function handle() { - $response = Http::asJson() - ->withOptions(['allow_redirects' => ['strict' => true]]) - ->timeout(3) - ->post($this->webhook->endpoint, $this->buildWebhookData()); + $themeResponse = Theme::dispatch(ThemeEvents::WEBHOOK_CALL_BEFORE, $this->event, $this->webhook, $this->detail); + $webhookData = $themeResponse ?? $this->buildWebhookData(); + $lastError = null; + + try { + $response = Http::asJson() + ->withOptions(['allow_redirects' => ['strict' => true]]) + ->timeout($this->webhook->timeout) + ->post($this->webhook->endpoint, $webhookData); + } catch (\Exception $exception) { + $lastError = $exception->getMessage(); + Log::error("Webhook call to endpoint {$this->webhook->endpoint} failed with error \"{$lastError}\""); + } - if ($response->failed()) { + if (isset($response) && $response->failed()) { + $lastError = "Response status from endpoint was {$response->status()}"; Log::error("Webhook call to endpoint {$this->webhook->endpoint} failed with status {$response->status()}"); } + + $this->webhook->last_called_at = now(); + if ($lastError) { + $this->webhook->last_errored_at = now(); + $this->webhook->last_error = $lastError; + } + + $this->webhook->save(); } protected function buildWebhookData(): array @@ -86,14 +109,14 @@ class DispatchWebhookJob implements ShouldQueue $textParts[] = '"' . $this->detail->name . '"'; } - $data = [ - 'event' => $this->event, - 'text' => implode(' ', $textParts), - 'triggered_at' => Carbon::createFromTimestampUTC($this->initiatedTime)->toISOString(), - 'triggered_by' => $this->initiator->attributesToArray(), + $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, + 'webhook_id' => $this->webhook->id, + 'webhook_name' => $this->webhook->name, ]; if (method_exists($this->detail, 'getUrl')) {