| 
									
										
										
										
											2021-12-12 06:29:33 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | namespace BookStack\Activity; | 
					
						
							| 
									
										
										
										
											2021-12-12 06:29:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | use BookStack\Activity\Models\Loggable; | 
					
						
							|  |  |  | use BookStack\Activity\Models\Webhook; | 
					
						
							|  |  |  | use BookStack\Activity\Tools\WebhookFormatter; | 
					
						
							| 
									
										
										
										
											2022-01-04 02:22:03 +08:00
										 |  |  | use BookStack\Facades\Theme; | 
					
						
							| 
									
										
										
										
											2023-09-08 21:16:09 +08:00
										 |  |  | use BookStack\Http\HttpRequestService; | 
					
						
							| 
									
										
										
										
											2022-01-04 02:22:03 +08:00
										 |  |  | use BookStack\Theming\ThemeEvents; | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | use BookStack\Users\Models\User; | 
					
						
							| 
									
										
										
										
											2023-08-26 22:28:29 +08:00
										 |  |  | use BookStack\Util\SsrUrlValidator; | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 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 User $initiator; | 
					
						
							|  |  |  |     protected int $initiatedTime; | 
					
						
							| 
									
										
										
										
											2023-07-12 23:16:12 +08:00
										 |  |  |     protected array $webhookData; | 
					
						
							| 
									
										
										
										
											2021-12-12 06:29:33 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Create a new job instance. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-07-12 23:16:12 +08:00
										 |  |  |     public function __construct(Webhook $webhook, string $event, Loggable|string $detail) | 
					
						
							| 
									
										
										
										
											2021-12-12 06:29:33 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $this->webhook = $webhook; | 
					
						
							|  |  |  |         $this->initiator = user(); | 
					
						
							|  |  |  |         $this->initiatedTime = time(); | 
					
						
							| 
									
										
										
										
											2023-07-12 23:16:12 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $themeResponse = Theme::dispatch(ThemeEvents::WEBHOOK_CALL_BEFORE, $event, $this->webhook, $detail, $this->initiator, $this->initiatedTime); | 
					
						
							|  |  |  |         $this->webhookData =  $themeResponse ?? WebhookFormatter::getDefault($event, $this->webhook, $detail, $this->initiator, $this->initiatedTime)->format(); | 
					
						
							| 
									
										
										
										
											2021-12-12 06:29:33 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Execute the job. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2023-09-08 21:16:09 +08:00
										 |  |  |     public function handle(HttpRequestService $http) | 
					
						
							| 
									
										
										
										
											2021-12-12 06:29:33 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											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 { | 
					
						
							| 
									
										
										
										
											2023-08-26 22:28:29 +08:00
										 |  |  |             (new SsrUrlValidator())->ensureAllowed($this->webhook->endpoint); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-08 21:16:09 +08:00
										 |  |  |             $client = $http->buildClient($this->webhook->timeout, [ | 
					
						
							|  |  |  |                 'connect_timeout' => 10, | 
					
						
							|  |  |  |                 'allow_redirects' => ['strict' => true], | 
					
						
							|  |  |  |             ]); | 
					
						
							| 
									
										
										
										
											2021-12-12 06:29:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-08 21:16:09 +08:00
										 |  |  |             $response = $client->sendRequest($http->jsonRequest('POST', $this->webhook->endpoint, $this->webhookData)); | 
					
						
							|  |  |  |             $statusCode = $response->getStatusCode(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if ($statusCode >= 400) { | 
					
						
							|  |  |  |                 $lastError = "Response status from endpoint was {$statusCode}"; | 
					
						
							|  |  |  |                 Log::error("Webhook call to endpoint {$this->webhook->endpoint} failed with status {$statusCode}"); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2023-09-09 00:16:57 +08:00
										 |  |  |         } catch (\Exception $error) { | 
					
						
							| 
									
										
										
										
											2023-09-08 21:16:09 +08:00
										 |  |  |             $lastError = $error->getMessage(); | 
					
						
							|  |  |  |             Log::error("Webhook call to endpoint {$this->webhook->endpoint} failed with error \"{$lastError}\""); | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     } | 
					
						
							|  |  |  | } |