]> BookStack Code Mirror - bookstack/blobdiff - app/Actions/DispatchWebhookJob.php
Updated attachment links to have dropdown for open type
[bookstack] / app / Actions / DispatchWebhookJob.php
index 57cb2feabad6afc8b375070e8aaf3697f139e424..2d805228cd5e54d83526fb7aedda72513c9fdb71 100644 (file)
@@ -3,17 +3,14 @@
 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;
 use Illuminate\Queue\InteractsWithQueue;
 use Illuminate\Queue\SerializesModels;
-use Illuminate\Support\Carbon;
 use Illuminate\Support\Facades\Http;
 use Illuminate\Support\Facades\Log;
 
@@ -24,31 +21,16 @@ class DispatchWebhookJob implements ShouldQueue
     use Queueable;
     use SerializesModels;
 
-    /**
-     * @var Webhook
-     */
-    protected $webhook;
-
-    /**
-     * @var string
-     */
-    protected $event;
+    protected Webhook $webhook;
+    protected string $event;
+    protected User $initiator;
+    protected int $initiatedTime;
 
     /**
      * @var string|Loggable
      */
     protected $detail;
 
-    /**
-     * @var User
-     */
-    protected $initiator;
-
-    /**
-     * @var int
-     */
-    protected $initiatedTime;
-
     /**
      * Create a new job instance.
      *
@@ -70,54 +52,31 @@ class DispatchWebhookJob implements ShouldQueue
      */
     public function handle()
     {
-        $themeResponse = Theme::dispatch(ThemeEvents::WEBHOOK_CALL_BEFORE, $this->event, $this->webhook, $this->detail);
-        $webhookData = $themeResponse ?? $this->buildWebhookData();
+        $themeResponse = Theme::dispatch(ThemeEvents::WEBHOOK_CALL_BEFORE, $this->event, $this->webhook, $this->detail, $this->initiator, $this->initiatedTime);
+        $webhookData = $themeResponse ?? WebhookFormatter::getDefault($this->event, $this->webhook, $this->detail, $this->initiator, $this->initiatedTime)->format();
+        $lastError = null;
 
         try {
             $response = Http::asJson()
                 ->withOptions(['allow_redirects' => ['strict' => true]])
-                ->timeout(3)
+                ->timeout($this->webhook->timeout)
                 ->post($this->webhook->endpoint, $webhookData);
-
         } catch (\Exception $exception) {
-            Log::error("Webhook call to endpoint {$this->webhook->endpoint} failed with error \"{$exception->getMessage()}\"");
-            return;
+            $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()}");
         }
-    }
-
-    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();
+        $this->webhook->last_called_at = now();
+        if ($lastError) {
+            $this->webhook->last_errored_at = now();
+            $this->webhook->last_error = $lastError;
         }
 
-        return $data;
+        $this->webhook->save();
     }
 }