]> BookStack Code Mirror - bookstack/commitdiff
Added active toggle to webhooks
authorDan Brown <redacted>
Sun, 12 Dec 2021 17:39:06 +0000 (17:39 +0000)
committerDan Brown <redacted>
Sun, 12 Dec 2021 17:39:06 +0000 (17:39 +0000)
To allow easy temporary de-activation without deletion or other
workarounds. Updated tests to cover.

app/Actions/ActivityLogger.php
app/Actions/Webhook.php
app/Http/Controllers/WebhookController.php
database/factories/Actions/WebhookFactory.php
database/migrations/2021_12_07_111343_create_webhooks_table.php
resources/lang/en/common.php
resources/lang/en/settings.php
resources/views/settings/webhooks/index.blade.php
resources/views/settings/webhooks/parts/form.blade.php
tests/Actions/WebhookManagementTest.php

index ad4ee73752b91331ad105dc9b5edfce4aae6a9c2..870e7f96d0e5532c36dc946c36d89a1a91db7bda 100644 (file)
@@ -84,10 +84,13 @@ class ActivityLogger
      */
     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));
index 55bc855cedeaea45c203e3730cd9f52154f3e113..ed13856f3877e2db14daa9d961140c55ba2e969d 100644 (file)
@@ -13,6 +13,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany;
  * @property string $name
  * @property string $endpoint
  * @property Collection $trackedEvents
+ * @property bool $active
  */
 class Webhook extends Model implements Loggable
 {
index 497d623b20afc8141533a3b4b74b8adbf4d64cb7..588b256a35156ae92c11c806319445805e1c5f36 100644 (file)
@@ -43,10 +43,12 @@ class WebhookController extends Controller
         $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']));
 
@@ -75,12 +77,14 @@ class WebhookController extends Controller
         $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']);
 
index a18ffbbc8b6a7e6b279a3a4a3c251541b6018053..1230d49d11291bf7c273623e83dbbf3ea6cce0ff 100644 (file)
@@ -20,6 +20,7 @@ class WebhookFactory extends Factory
         return [
             'name' => 'My webhook for ' . $this->faker->country(),
             'endpoint' => $this->faker->url,
+            'active' => true,
         ];
     }
 }
index 22b8549f4bb254bfd6c9fe2ba4727e1ec83ee1b2..be4fc539d155675e51343624fabefd2cf0439cf6 100644 (file)
@@ -16,10 +16,12 @@ class CreateWebhooksTable extends Migration
         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) {
index 722bf00db9e827ad5d2c0db84a55adb4db9ad265..53db3cf409a027bd44043c71b8175377222b176f 100644 (file)
@@ -71,6 +71,9 @@ return [
     'list_view' => 'List View',
     'default' => 'Default',
     'breadcrumb' => 'Breadcrumb',
+    'status' => 'Status',
+    'status_active' => 'Active',
+    'status_inactive' => 'Inactive',
 
     // Header
     'header_menu_expand' => 'Expand Header Menu',
index 209702d0e68e1010244c1bfdedb6227aaaa071ce..3556fcf64c7dd091254a3a896d7d422bd9e4d489 100755 (executable)
@@ -236,6 +236,7 @@ return [
     // 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',
@@ -246,6 +247,7 @@ return [
     '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.',
index 999a458ec15057251840ddbcc5fbaacb33d88bb6..d6423b6fb1423dcc6408555142310c0f320fdfdf 100644 (file)
@@ -25,6 +25,7 @@
                     <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
 
index e2b3fc34d7d8fb13544d9c0111ce0c472f37236e..458b6767bd7a82287ade261c54b67a974ccee944 100644 (file)
@@ -9,6 +9,14 @@
             <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">
index 1423fe6efad2b1b15c9360bea227933d8a046412..8abf06fc5edb1347e0a852cd97224e18dbba7d2e 100644 (file)
@@ -22,6 +22,7 @@ class WebhookManagementTest extends TestCase
         $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()
@@ -38,6 +39,7 @@ class WebhookManagementTest extends TestCase
             'name' => 'My first webhook',
             'endpoint' => 'https://example.com/webhook',
             'events' => ['all'],
+            'active' => 'true'
         ]);
 
         $resp->assertRedirect('/settings/webhooks');
@@ -49,6 +51,7 @@ class WebhookManagementTest extends TestCase
         $this->assertDatabaseHas('webhooks', [
             'name' => 'My first webhook',
             'endpoint' => 'https://example.com/webhook',
+            'active' => true,
         ]);
 
         /** @var Webhook $webhook */
@@ -79,6 +82,7 @@ class WebhookManagementTest extends TestCase
             'name' => 'My updated webhook',
             'endpoint' => 'https://example.com/updated-webhook',
             'events' => [ActivityType::PAGE_CREATE, ActivityType::PAGE_UPDATE],
+            'active' => 'true'
         ]);
         $resp->assertRedirect('/settings/webhooks');
 
@@ -89,6 +93,7 @@ class WebhookManagementTest extends TestCase
             'id' => $webhook->id,
             'name' => 'My updated webhook',
             'endpoint' => 'https://example.com/updated-webhook',
+            'active' => true,
         ]);
 
         $trackedEvents = $webhook->trackedEvents()->get();