2021-12-07 15:55:11 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace BookStack\Http\Controllers;
|
|
|
|
|
2021-12-08 15:29:42 +01:00
|
|
|
use BookStack\Actions\ActivityType;
|
2022-10-30 13:02:06 +01:00
|
|
|
use BookStack\Actions\Queries\WebhooksAllPaginatedAndSorted;
|
2021-12-08 15:29:42 +01:00
|
|
|
use BookStack\Actions\Webhook;
|
2021-12-07 15:55:11 +01:00
|
|
|
use Illuminate\Http\Request;
|
|
|
|
|
|
|
|
class WebhookController extends Controller
|
|
|
|
{
|
2021-12-08 15:29:42 +01:00
|
|
|
public function __construct()
|
|
|
|
{
|
|
|
|
$this->middleware([
|
|
|
|
'can:settings-manage',
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
2021-12-07 15:55:11 +01:00
|
|
|
/**
|
|
|
|
* Show all webhooks configured in the system.
|
|
|
|
*/
|
2022-10-30 13:02:06 +01:00
|
|
|
public function index(Request $request)
|
2021-12-07 15:55:11 +01:00
|
|
|
{
|
2022-10-30 13:02:06 +01:00
|
|
|
$listDetails = [
|
|
|
|
'search' => $request->get('search', ''),
|
|
|
|
'sort' => setting()->getForCurrentUser('webhooks_sort', 'name'),
|
|
|
|
'order' => setting()->getForCurrentUser('webhooks_sort_order', 'asc'),
|
|
|
|
];
|
|
|
|
|
|
|
|
$webhooks = (new WebhooksAllPaginatedAndSorted())->run(20, $listDetails);
|
|
|
|
$webhooks->appends(['search' => $listDetails['search']]);
|
2021-12-18 12:43:05 +01:00
|
|
|
|
2022-01-04 14:33:24 +01:00
|
|
|
$this->setPageTitle(trans('settings.webhooks'));
|
|
|
|
|
2022-10-30 13:02:06 +01:00
|
|
|
return view('settings.webhooks.index', [
|
|
|
|
'webhooks' => $webhooks,
|
|
|
|
'listDetails' => $listDetails,
|
|
|
|
]);
|
2021-12-07 15:55:11 +01:00
|
|
|
}
|
2021-12-08 15:29:42 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Show the view for creating a new webhook in the system.
|
|
|
|
*/
|
|
|
|
public function create()
|
|
|
|
{
|
2022-01-04 14:33:24 +01:00
|
|
|
$this->setPageTitle(trans('settings.webhooks_create'));
|
2022-01-06 13:18:11 +01:00
|
|
|
|
2021-12-08 15:29:42 +01:00
|
|
|
return view('settings.webhooks.create');
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Store a new webhook in the system.
|
|
|
|
*/
|
|
|
|
public function store(Request $request)
|
|
|
|
{
|
2021-12-08 18:35:58 +01:00
|
|
|
$validated = $this->validate($request, [
|
2021-12-18 12:43:05 +01:00
|
|
|
'name' => ['required', 'max:150'],
|
2021-12-08 18:35:58 +01:00
|
|
|
'endpoint' => ['required', 'url', 'max:500'],
|
2021-12-18 12:43:05 +01:00
|
|
|
'events' => ['required', 'array'],
|
|
|
|
'active' => ['required'],
|
2022-01-03 20:42:48 +01:00
|
|
|
'timeout' => ['required', 'integer', 'min:1', 'max:600'],
|
2021-12-08 18:35:58 +01:00
|
|
|
]);
|
|
|
|
|
|
|
|
$webhook = new Webhook($validated);
|
2021-12-12 18:39:06 +01:00
|
|
|
$webhook->active = $validated['active'] === 'true';
|
2021-12-08 18:35:58 +01:00
|
|
|
$webhook->save();
|
|
|
|
$webhook->updateTrackedEvents(array_values($validated['events']));
|
|
|
|
|
2021-12-08 15:29:42 +01:00
|
|
|
$this->logActivity(ActivityType::WEBHOOK_CREATE, $webhook);
|
2021-12-18 12:43:05 +01:00
|
|
|
|
2021-12-08 15:29:42 +01:00
|
|
|
return redirect('/settings/webhooks');
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Show the view to edit an existing webhook.
|
|
|
|
*/
|
|
|
|
public function edit(string $id)
|
|
|
|
{
|
|
|
|
/** @var Webhook $webhook */
|
2021-12-08 18:35:58 +01:00
|
|
|
$webhook = Webhook::query()
|
|
|
|
->with('trackedEvents')
|
|
|
|
->findOrFail($id);
|
2021-12-08 15:29:42 +01:00
|
|
|
|
2022-01-04 14:33:24 +01:00
|
|
|
$this->setPageTitle(trans('settings.webhooks_edit'));
|
|
|
|
|
2021-12-08 15:29:42 +01: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-08 18:35:58 +01:00
|
|
|
$validated = $this->validate($request, [
|
2021-12-18 12:43:05 +01:00
|
|
|
'name' => ['required', 'max:150'],
|
2021-12-08 18:35:58 +01:00
|
|
|
'endpoint' => ['required', 'url', 'max:500'],
|
2021-12-18 12:43:05 +01:00
|
|
|
'events' => ['required', 'array'],
|
|
|
|
'active' => ['required'],
|
2022-01-03 20:42:48 +01:00
|
|
|
'timeout' => ['required', 'integer', 'min:1', 'max:600'],
|
2021-12-08 18:35:58 +01:00
|
|
|
]);
|
|
|
|
|
2021-12-08 15:29:42 +01:00
|
|
|
/** @var Webhook $webhook */
|
|
|
|
$webhook = Webhook::query()->findOrFail($id);
|
|
|
|
|
2021-12-12 18:39:06 +01:00
|
|
|
$webhook->active = $validated['active'] === 'true';
|
2021-12-08 18:35:58 +01:00
|
|
|
$webhook->fill($validated)->save();
|
|
|
|
$webhook->updateTrackedEvents($validated['events']);
|
2021-12-08 15:29:42 +01:00
|
|
|
|
|
|
|
$this->logActivity(ActivityType::WEBHOOK_UPDATE, $webhook);
|
2021-12-18 12:43:05 +01:00
|
|
|
|
2021-12-08 15:29:42 +01: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 12:43:05 +01:00
|
|
|
|
2022-01-04 14:33:24 +01:00
|
|
|
$this->setPageTitle(trans('settings.webhooks_delete'));
|
|
|
|
|
2021-12-08 15:29:42 +01: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-08 18:35:58 +01:00
|
|
|
$webhook->trackedEvents()->delete();
|
2021-12-08 15:29:42 +01:00
|
|
|
$webhook->delete();
|
|
|
|
|
|
|
|
$this->logActivity(ActivityType::WEBHOOK_DELETE, $webhook);
|
2021-12-18 12:43:05 +01:00
|
|
|
|
2021-12-08 15:29:42 +01:00
|
|
|
return redirect('/settings/webhooks');
|
|
|
|
}
|
2021-12-07 15:55:11 +01:00
|
|
|
}
|