| 
									
										
										
										
											2021-12-12 06:29:33 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace BookStack\Actions; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use BookStack\Auth\User; | 
					
						
							| 
									
										
										
										
											2022-01-04 02:22:03 +08:00
										 |  |  | use BookStack\Facades\Theme; | 
					
						
							| 
									
										
										
										
											2021-12-12 06:29:33 +08:00
										 |  |  | use BookStack\Interfaces\Loggable; | 
					
						
							| 
									
										
										
										
											2022-01-04 02:22:03 +08:00
										 |  |  | use BookStack\Theming\ThemeEvents; | 
					
						
							| 
									
										
										
										
											2021-12-12 06:29:33 +08:00
										 |  |  | use Illuminate\Bus\Queueable; | 
					
						
							|  |  |  | use Illuminate\Contracts\Queue\ShouldQueue; | 
					
						
							|  |  |  | use Illuminate\Foundation\Bus\Dispatchable; | 
					
						
							|  |  |  | use Illuminate\Queue\InteractsWithQueue; | 
					
						
							|  |  |  | use Illuminate\Queue\SerializesModels; | 
					
						
							| 
									
										
										
										
											2021-12-13 03:01:50 +08:00
										 |  |  | use Illuminate\Support\Facades\Http; | 
					
						
							| 
									
										
										
										
											2021-12-12 06:29:33 +08:00
										 |  |  | use Illuminate\Support\Facades\Log; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class DispatchWebhookJob implements ShouldQueue | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-12-18 19:43:05 +08:00
										 |  |  |     use Dispatchable; | 
					
						
							|  |  |  |     use InteractsWithQueue; | 
					
						
							|  |  |  |     use Queueable; | 
					
						
							|  |  |  |     use SerializesModels; | 
					
						
							| 
									
										
										
										
											2021-12-12 06:29:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-03-27 00:44:34 +08:00
										 |  |  |     protected Webhook $webhook; | 
					
						
							|  |  |  |     protected string $event; | 
					
						
							|  |  |  |     protected User $initiator; | 
					
						
							|  |  |  |     protected int $initiatedTime; | 
					
						
							| 
									
										
										
										
											2021-12-12 06:29:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * @var string|Loggable | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected $detail; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Create a new job instance. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function __construct(Webhook $webhook, string $event, $detail) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->webhook = $webhook; | 
					
						
							|  |  |  |         $this->event = $event; | 
					
						
							|  |  |  |         $this->detail = $detail; | 
					
						
							|  |  |  |         $this->initiator = user(); | 
					
						
							|  |  |  |         $this->initiatedTime = time(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Execute the job. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function handle() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-03-27 00:44:34 +08:00
										 |  |  |         $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(); | 
					
						
							| 
									
										
										
										
											2022-01-04 03:42:48 +08:00
										 |  |  |         $lastError = null; | 
					
						
							| 
									
										
										
										
											2022-01-04 02:22:03 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-04 02:37:05 +08:00
										 |  |  |         try { | 
					
						
							|  |  |  |             $response = Http::asJson() | 
					
						
							|  |  |  |                 ->withOptions(['allow_redirects' => ['strict' => true]]) | 
					
						
							| 
									
										
										
										
											2022-01-04 03:42:48 +08:00
										 |  |  |                 ->timeout($this->webhook->timeout) | 
					
						
							| 
									
										
										
										
											2022-01-04 02:37:05 +08:00
										 |  |  |                 ->post($this->webhook->endpoint, $webhookData); | 
					
						
							|  |  |  |         } catch (\Exception $exception) { | 
					
						
							| 
									
										
										
										
											2022-01-04 03:42:48 +08:00
										 |  |  |             $lastError = $exception->getMessage(); | 
					
						
							|  |  |  |             Log::error("Webhook call to endpoint {$this->webhook->endpoint} failed with error \"{$lastError}\""); | 
					
						
							| 
									
										
										
										
											2022-01-04 02:37:05 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2021-12-12 06:29:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-04 03:42:48 +08:00
										 |  |  |         if (isset($response) && $response->failed()) { | 
					
						
							|  |  |  |             $lastError = "Response status from endpoint was {$response->status()}"; | 
					
						
							| 
									
										
										
										
											2021-12-13 03:01:50 +08:00
										 |  |  |             Log::error("Webhook call to endpoint {$this->webhook->endpoint} failed with status {$response->status()}"); | 
					
						
							| 
									
										
										
										
											2021-12-12 06:29:33 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2022-01-04 03:42:48 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->webhook->last_called_at = now(); | 
					
						
							|  |  |  |         if ($lastError) { | 
					
						
							|  |  |  |             $this->webhook->last_errored_at = now(); | 
					
						
							|  |  |  |             $this->webhook->last_error = $lastError; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->webhook->save(); | 
					
						
							| 
									
										
										
										
											2021-12-12 06:29:33 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | } |