X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/4621d8bcc51d2cba552055151ae6696348231b54..refs/pull/3850/head:/app/Http/Controllers/WebhookController.php diff --git a/app/Http/Controllers/WebhookController.php b/app/Http/Controllers/WebhookController.php index 15a31f312..c72dcc510 100644 --- a/app/Http/Controllers/WebhookController.php +++ b/app/Http/Controllers/WebhookController.php @@ -3,7 +3,9 @@ namespace BookStack\Http\Controllers; use BookStack\Actions\ActivityType; +use BookStack\Actions\Queries\WebhooksAllPaginatedAndSorted; use BookStack\Actions\Webhook; +use BookStack\Util\SimpleListOptions; use Illuminate\Http\Request; class WebhookController extends Controller @@ -18,10 +20,25 @@ class WebhookController extends Controller /** * Show all webhooks configured in the system. */ - public function index() + public function index(Request $request) { - // TODO - Get and pass webhooks - return view('settings.webhooks.index'); + $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'), + ]); + + $webhooks = (new WebhooksAllPaginatedAndSorted())->run(20, $listOptions); + $webhooks->appends($listOptions->getPaginationAppends()); + + $this->setPageTitle(trans('settings.webhooks')); + + return view('settings.webhooks.index', [ + 'webhooks' => $webhooks, + 'listOptions' => $listOptions, + ]); } /** @@ -29,6 +46,8 @@ class WebhookController extends Controller */ public function create() { + $this->setPageTitle(trans('settings.webhooks_create')); + return view('settings.webhooks.create'); } @@ -37,8 +56,21 @@ class WebhookController extends Controller */ public function store(Request $request) { - // TODO - Create webhook + $validated = $this->validate($request, [ + 'name' => ['required', 'max:150'], + 'endpoint' => ['required', 'url', 'max:500'], + 'events' => ['required', 'array'], + 'active' => ['required'], + 'timeout' => ['required', 'integer', 'min:1', 'max:600'], + ]); + + $webhook = new Webhook($validated); + $webhook->active = $validated['active'] === 'true'; + $webhook->save(); + $webhook->updateTrackedEvents(array_values($validated['events'])); + $this->logActivity(ActivityType::WEBHOOK_CREATE, $webhook); + return redirect('/settings/webhooks'); } @@ -48,7 +80,11 @@ class WebhookController extends Controller public function edit(string $id) { /** @var Webhook $webhook */ - $webhook = Webhook::query()->findOrFail($id); + $webhook = Webhook::query() + ->with('trackedEvents') + ->findOrFail($id); + + $this->setPageTitle(trans('settings.webhooks_edit')); return view('settings.webhooks.edit', ['webhook' => $webhook]); } @@ -58,12 +94,23 @@ class WebhookController extends Controller */ public function update(Request $request, string $id) { + $validated = $this->validate($request, [ + 'name' => ['required', 'max:150'], + 'endpoint' => ['required', 'url', 'max:500'], + 'events' => ['required', 'array'], + 'active' => ['required'], + 'timeout' => ['required', 'integer', 'min:1', 'max:600'], + ]); + /** @var Webhook $webhook */ $webhook = Webhook::query()->findOrFail($id); - // TODO - Update + $webhook->active = $validated['active'] === 'true'; + $webhook->fill($validated)->save(); + $webhook->updateTrackedEvents($validated['events']); $this->logActivity(ActivityType::WEBHOOK_UPDATE, $webhook); + return redirect('/settings/webhooks'); } @@ -74,6 +121,9 @@ class WebhookController extends Controller { /** @var Webhook $webhook */ $webhook = Webhook::query()->findOrFail($id); + + $this->setPageTitle(trans('settings.webhooks_delete')); + return view('settings.webhooks.delete', ['webhook' => $webhook]); } @@ -85,10 +135,11 @@ class WebhookController extends Controller /** @var Webhook $webhook */ $webhook = Webhook::query()->findOrFail($id); - // TODO - Delete event type relations + $webhook->trackedEvents()->delete(); $webhook->delete(); $this->logActivity(ActivityType::WEBHOOK_DELETE, $webhook); + return redirect('/settings/webhooks'); } }