*/
protected function dispatchWebhooks(string $type, $detail): void
{
- $webhooks = Webhook::query()->whereHas('trackedEvents', function(Builder $query) use ($type) {
- $query->where('event', '=', $type)
- ->orWhere('event', '=', 'all');
- })->get();
+ $webhooks = Webhook::query()
+ ->whereHas('trackedEvents', function(Builder $query) use ($type) {
+ $query->where('event', '=', $type)
+ ->orWhere('event', '=', 'all');
+ })
+ ->where('active', '=', true)
+ ->get();
foreach ($webhooks as $webhook) {
dispatch(new DispatchWebhookJob($webhook, $type, $detail));
* @property string $name
* @property string $endpoint
* @property Collection $trackedEvents
+ * @property bool $active
*/
class Webhook extends Model implements Loggable
{
$validated = $this->validate($request, [
'name' => ['required', 'max:150'],
'endpoint' => ['required', 'url', 'max:500'],
- 'events' => ['required', 'array']
+ 'events' => ['required', 'array'],
+ 'active' => ['required'],
]);
$webhook = new Webhook($validated);
+ $webhook->active = $validated['active'] === 'true';
$webhook->save();
$webhook->updateTrackedEvents(array_values($validated['events']));
$validated = $this->validate($request, [
'name' => ['required', 'max:150'],
'endpoint' => ['required', 'url', 'max:500'],
- 'events' => ['required', 'array']
+ 'events' => ['required', 'array'],
+ 'active' => ['required'],
]);
/** @var Webhook $webhook */
$webhook = Webhook::query()->findOrFail($id);
+ $webhook->active = $validated['active'] === 'true';
$webhook->fill($validated)->save();
$webhook->updateTrackedEvents($validated['events']);
return [
'name' => 'My webhook for ' . $this->faker->country(),
'endpoint' => $this->faker->url,
+ 'active' => true,
];
}
}
Schema::create('webhooks', function (Blueprint $table) {
$table->increments('id');
$table->string('name', 150);
+ $table->boolean('active');
$table->string('endpoint', 500);
$table->timestamps();
$table->index('name');
+ $table->index('active');
});
Schema::create('webhook_tracked_events', function (Blueprint $table) {
'list_view' => 'List View',
'default' => 'Default',
'breadcrumb' => 'Breadcrumb',
+ 'status' => 'Status',
+ 'status_active' => 'Active',
+ 'status_inactive' => 'Inactive',
// Header
'header_menu_expand' => 'Expand Header Menu',
// Webhooks
'webhooks' => 'Webhooks',
'webhooks_create' => 'Create New Webhook',
+ 'webhooks_none_created' => 'No webhooks have yet been created.',
'webhooks_edit' => 'Edit Webhook',
'webhooks_save' => 'Save Webhook',
'webhooks_details' => 'Webhook Details',
'webhooks_events_all' => 'All system events',
'webhooks_name' => 'Webhook Name',
'webhooks_endpoint' => 'Webhook Endpoint',
+ 'webhooks_active' => 'Webhook Active',
'webhook_events_table_header' => 'Events',
'webhooks_delete' => 'Delete Webhook',
'webhooks_delete_warning' => 'This will fully delete this webhook, with the name \':webhookName\', from the system.',
<tr>
<th>{{ trans('common.name') }}</th>
<th>{{ trans('settings.webhook_events_table_header') }}</th>
+ <th>{{ trans('common.status') }}</th>
</tr>
@foreach($webhooks as $webhook)
<tr>
{{ $webhook->trackedEvents->count() }}
@endif
</td>
+ <td>
+ {{ trans('common.status_' . ($webhook->active ? 'active' : 'inactive')) }}
+ </td>
</tr>
@endforeach
</table>
@else
- <p class="text-muted empty-text">
- {{ trans('common.no_items') }}
+ <p class="text-muted empty-text px-none">
+ {{ trans('settings.webhooks_none_created') }}
</p>
@endif
<div>
<label class="setting-list-label">{{ trans('settings.webhooks_details') }}</label>
<p class="small">{{ trans('settings.webhooks_details_desc') }}</p>
+ <div>
+ @include('form.toggle-switch', [
+ 'name' => 'active',
+ 'value' => old('active') ?? $model->active ?? true,
+ 'label' => trans('settings.webhooks_active'),
+ ])
+ @include('form.errors', ['name' => 'active'])
+ </div>
</div>
<div>
<div class="form-group">
$resp->assertElementExists('a[href="' . $webhook->getUrl() . '"]', $webhook->name);
$resp->assertSee($webhook->endpoint);
$resp->assertSee('All system events');
+ $resp->assertSee('Active');
}
public function test_create_view()
'name' => 'My first webhook',
'endpoint' => 'https://example.com/webhook',
'events' => ['all'],
+ 'active' => 'true'
]);
$resp->assertRedirect('/settings/webhooks');
$this->assertDatabaseHas('webhooks', [
'name' => 'My first webhook',
'endpoint' => 'https://example.com/webhook',
+ 'active' => true,
]);
/** @var Webhook $webhook */
'name' => 'My updated webhook',
'endpoint' => 'https://example.com/updated-webhook',
'events' => [ActivityType::PAGE_CREATE, ActivityType::PAGE_UPDATE],
+ 'active' => 'true'
]);
$resp->assertRedirect('/settings/webhooks');
'id' => $webhook->id,
'name' => 'My updated webhook',
'endpoint' => 'https://example.com/updated-webhook',
+ 'active' => true,
]);
$trackedEvents = $webhook->trackedEvents()->get();