| 
									
										
										
										
											2021-12-07 22:55:11 +08:00
										 |  |  | <?php | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | namespace BookStack\Activity\Controllers; | 
					
						
							| 
									
										
										
										
											2021-12-07 22:55:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-18 00:56:55 +08:00
										 |  |  | use BookStack\Activity\ActivityType; | 
					
						
							|  |  |  | use BookStack\Activity\Models\Webhook; | 
					
						
							|  |  |  | use BookStack\Activity\Queries\WebhooksAllPaginatedAndSorted; | 
					
						
							| 
									
										
										
										
											2023-05-19 03:53:39 +08:00
										 |  |  | use BookStack\Http\Controller; | 
					
						
							| 
									
										
										
										
											2022-10-30 23:16:06 +08:00
										 |  |  | use BookStack\Util\SimpleListOptions; | 
					
						
							| 
									
										
										
										
											2021-12-07 22:55:11 +08:00
										 |  |  | use Illuminate\Http\Request; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class WebhookController extends Controller | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2021-12-08 22:29:42 +08:00
										 |  |  |     public function __construct() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->middleware([ | 
					
						
							|  |  |  |             'can:settings-manage', | 
					
						
							|  |  |  |         ]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-07 22:55:11 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Show all webhooks configured in the system. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2022-10-30 20:02:06 +08:00
										 |  |  |     public function index(Request $request) | 
					
						
							| 
									
										
										
										
											2021-12-07 22:55:11 +08:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-10-30 23:16:06 +08:00
										 |  |  |         $listOptions = SimpleListOptions::fromRequest($request, 'webhooks')->withSortOptions([ | 
					
						
							|  |  |  |             'name' => trans('common.sort_name'), | 
					
						
							|  |  |  |             'endpoint'  => trans('settings.webhooks_endpoint'), | 
					
						
							|  |  |  |             'created_at' => trans('common.sort_created_at'), | 
					
						
							|  |  |  |             'updated_at' => trans('common.sort_updated_at'), | 
					
						
							|  |  |  |             'active'     => trans('common.status'), | 
					
						
							|  |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2022-10-30 20:02:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-30 23:16:06 +08:00
										 |  |  |         $webhooks = (new WebhooksAllPaginatedAndSorted())->run(20, $listOptions); | 
					
						
							|  |  |  |         $webhooks->appends($listOptions->getPaginationAppends()); | 
					
						
							| 
									
										
										
										
											2021-12-18 19:43:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-04 21:33:24 +08:00
										 |  |  |         $this->setPageTitle(trans('settings.webhooks')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-10-30 20:02:06 +08:00
										 |  |  |         return view('settings.webhooks.index', [ | 
					
						
							|  |  |  |             'webhooks'    => $webhooks, | 
					
						
							| 
									
										
										
										
											2022-10-30 23:16:06 +08:00
										 |  |  |             'listOptions' => $listOptions, | 
					
						
							| 
									
										
										
										
											2022-10-30 20:02:06 +08:00
										 |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2021-12-07 22:55:11 +08:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-12-08 22:29:42 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Show the view for creating a new webhook in the system. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function create() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2022-01-04 21:33:24 +08:00
										 |  |  |         $this->setPageTitle(trans('settings.webhooks_create')); | 
					
						
							| 
									
										
										
										
											2022-01-06 20:18:11 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-08 22:29:42 +08:00
										 |  |  |         return view('settings.webhooks.create'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Store a new webhook in the system. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function store(Request $request) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-12-09 01:35:58 +08:00
										 |  |  |         $validated = $this->validate($request, [ | 
					
						
							| 
									
										
										
										
											2021-12-18 19:43:05 +08:00
										 |  |  |             'name'     => ['required', 'max:150'], | 
					
						
							| 
									
										
										
										
											2021-12-09 01:35:58 +08:00
										 |  |  |             'endpoint' => ['required', 'url', 'max:500'], | 
					
						
							| 
									
										
										
										
											2021-12-18 19:43:05 +08:00
										 |  |  |             'events'   => ['required', 'array'], | 
					
						
							|  |  |  |             'active'   => ['required'], | 
					
						
							| 
									
										
										
										
											2022-01-04 03:42:48 +08:00
										 |  |  |             'timeout'  => ['required', 'integer', 'min:1', 'max:600'], | 
					
						
							| 
									
										
										
										
											2021-12-09 01:35:58 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $webhook = new Webhook($validated); | 
					
						
							| 
									
										
										
										
											2021-12-13 01:39:06 +08:00
										 |  |  |         $webhook->active = $validated['active'] === 'true'; | 
					
						
							| 
									
										
										
										
											2021-12-09 01:35:58 +08:00
										 |  |  |         $webhook->save(); | 
					
						
							|  |  |  |         $webhook->updateTrackedEvents(array_values($validated['events'])); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-08 22:29:42 +08:00
										 |  |  |         $this->logActivity(ActivityType::WEBHOOK_CREATE, $webhook); | 
					
						
							| 
									
										
										
										
											2021-12-18 19:43:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-08 22:29:42 +08:00
										 |  |  |         return redirect('/settings/webhooks'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Show the view to edit an existing webhook. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function edit(string $id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         /** @var Webhook $webhook */ | 
					
						
							| 
									
										
										
										
											2021-12-09 01:35:58 +08:00
										 |  |  |         $webhook = Webhook::query() | 
					
						
							|  |  |  |             ->with('trackedEvents') | 
					
						
							|  |  |  |             ->findOrFail($id); | 
					
						
							| 
									
										
										
										
											2021-12-08 22:29:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-04 21:33:24 +08:00
										 |  |  |         $this->setPageTitle(trans('settings.webhooks_edit')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-08 22:29:42 +08:00
										 |  |  |         return view('settings.webhooks.edit', ['webhook' => $webhook]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Update an existing webhook with the provided request data. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function update(Request $request, string $id) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2021-12-09 01:35:58 +08:00
										 |  |  |         $validated = $this->validate($request, [ | 
					
						
							| 
									
										
										
										
											2021-12-18 19:43:05 +08:00
										 |  |  |             'name'     => ['required', 'max:150'], | 
					
						
							| 
									
										
										
										
											2021-12-09 01:35:58 +08:00
										 |  |  |             'endpoint' => ['required', 'url', 'max:500'], | 
					
						
							| 
									
										
										
										
											2021-12-18 19:43:05 +08:00
										 |  |  |             'events'   => ['required', 'array'], | 
					
						
							|  |  |  |             'active'   => ['required'], | 
					
						
							| 
									
										
										
										
											2022-01-04 03:42:48 +08:00
										 |  |  |             'timeout'  => ['required', 'integer', 'min:1', 'max:600'], | 
					
						
							| 
									
										
										
										
											2021-12-09 01:35:58 +08:00
										 |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-08 22:29:42 +08:00
										 |  |  |         /** @var Webhook $webhook */ | 
					
						
							|  |  |  |         $webhook = Webhook::query()->findOrFail($id); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-13 01:39:06 +08:00
										 |  |  |         $webhook->active = $validated['active'] === 'true'; | 
					
						
							| 
									
										
										
										
											2021-12-09 01:35:58 +08:00
										 |  |  |         $webhook->fill($validated)->save(); | 
					
						
							|  |  |  |         $webhook->updateTrackedEvents($validated['events']); | 
					
						
							| 
									
										
										
										
											2021-12-08 22:29:42 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $this->logActivity(ActivityType::WEBHOOK_UPDATE, $webhook); | 
					
						
							| 
									
										
										
										
											2021-12-18 19:43:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-08 22:29:42 +08:00
										 |  |  |         return redirect('/settings/webhooks'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Show the view to delete a webhook. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function delete(string $id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         /** @var Webhook $webhook */ | 
					
						
							|  |  |  |         $webhook = Webhook::query()->findOrFail($id); | 
					
						
							| 
									
										
										
										
											2021-12-18 19:43:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-04 21:33:24 +08:00
										 |  |  |         $this->setPageTitle(trans('settings.webhooks_delete')); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-08 22:29:42 +08:00
										 |  |  |         return view('settings.webhooks.delete', ['webhook' => $webhook]); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Destroy a webhook from the system. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function destroy(string $id) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         /** @var Webhook $webhook */ | 
					
						
							|  |  |  |         $webhook = Webhook::query()->findOrFail($id); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-09 01:35:58 +08:00
										 |  |  |         $webhook->trackedEvents()->delete(); | 
					
						
							| 
									
										
										
										
											2021-12-08 22:29:42 +08:00
										 |  |  |         $webhook->delete(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->logActivity(ActivityType::WEBHOOK_DELETE, $webhook); | 
					
						
							| 
									
										
										
										
											2021-12-18 19:43:05 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-08 22:29:42 +08:00
										 |  |  |         return redirect('/settings/webhooks'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-12-07 22:55:11 +08:00
										 |  |  | } |