Skip to content

Commit

Permalink
Listen to more framework webhook events (#728)
Browse files Browse the repository at this point in the history
* Add new framework events to listen to

* Add simple test for framework events

* Update app/Models/WebhookConfiguration.php

Co-authored-by: Lance Pioch <[email protected]>

* Update app/Models/WebhookConfiguration.php

Co-authored-by: Lance Pioch <[email protected]>

* Update app/Models/WebhookConfiguration.php

---------

Co-authored-by: Vehikl <[email protected]>
Co-authored-by: Lance Pioch <[email protected]>
  • Loading branch information
3 people authored Dec 13, 2024
1 parent 914f3dc commit 7a4c4ce
Show file tree
Hide file tree
Showing 3 changed files with 52 additions and 8 deletions.
43 changes: 35 additions & 8 deletions app/Models/WebhookConfiguration.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,24 @@ class WebhookConfiguration extends Model
'events',
];

public static function getEventClassesFromDirectory(string $directory, string $after): array
{
$events = [];
foreach (File::allFiles($directory) as $file) {
$namespace = str($file->getPath())
->after($after)
->replace(DIRECTORY_SEPARATOR, '\\')
->after('\\')
->replaceFirst('app', 'App')
->toString();

$events[] = $namespace.'\\'.str($file->getFilename())
->replace([DIRECTORY_SEPARATOR, '.php'], ['\\', '']);
}

return $events;
}

protected function casts(): array
{
return [
Expand Down Expand Up @@ -75,6 +93,7 @@ public static function allPossibleEvents(): array
{
return collect(static::discoverCustomEvents())
->merge(static::allModelEvents())
->merge(static::discoverFrameworkEvents())
->unique()
->filter(fn ($event) => !in_array($event, static::$eventBlacklist))
->all();
Expand All @@ -97,6 +116,7 @@ public static function transformClassName(string $event): string
->after('eloquent.')
->replace('App\\Models\\', '')
->replace('App\\Events\\', 'event: ')
->replaceMatches('/Illuminate\\\\([A-z]+)\\\\Events\\\\/', fn (array $matches) => strtolower($matches[1]) . ': ')
->toString();
}

Expand Down Expand Up @@ -133,16 +153,23 @@ public static function discoverCustomEvents(): array
{
$directory = app_path('Events');

return self::getEventClassesFromDirectory($directory, base_path());
}

public static function discoverFrameworkEvents(): array
{
$frameworkDirectory = 'vendor/laravel/framework/src/';

$eventDirectories = [
'Illuminate/Auth/Events',
'Illuminate/Queue/Events',
];

$events = [];
foreach (File::allFiles($directory) as $file) {
$namespace = str($file->getPath())
->after(base_path())
->replace(DIRECTORY_SEPARATOR, '\\')
->replace('\\app\\', 'App\\')
->toString();
foreach ($eventDirectories as $eventDirectory) {
$directory = base_path("$frameworkDirectory/$eventDirectory");

$events[] = $namespace . '\\' . str($file->getFilename())
->replace([DIRECTORY_SEPARATOR, '.php'], ['\\', '']);
$events = array_merge($events, static::getEventClassesFromDirectory($directory, $frameworkDirectory));
}

return $events;
Expand Down
2 changes: 2 additions & 0 deletions app/Providers/EventServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,5 +15,7 @@ class EventServiceProvider extends ServiceProvider
'eloquent.created*' => [DispatchWebhooks::class],
'eloquent.deleted*' => [DispatchWebhooks::class],
'eloquent.updated*' => [DispatchWebhooks::class],
'Illuminate\\Auth\\Events\\*' => [DispatchWebhooks::class],
'Illuminate\\Queue\\Events\\*' => [DispatchWebhooks::class],
];
}
15 changes: 15 additions & 0 deletions tests/Feature/Webhooks/DispatchWebhooksTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@

use App\Jobs\ProcessWebhook;
use App\Models\Server;
use App\Models\User;
use App\Models\WebhookConfiguration;
use App\Tests\TestCase;
use Illuminate\Auth\Events\Authenticated;
use Illuminate\Foundation\Testing\LazilyRefreshDatabase;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Queue;

class DispatchWebhooksTest extends TestCase
Expand Down Expand Up @@ -88,6 +91,18 @@ public function test_it_does_not_call_deleted_webhooks()
Queue::assertNothingPushed();
}

public function test_it_listens_to_framework_events()
{
WebhookConfiguration::factory()->create([
'events' => [Authenticated::class],
]);

$user = User::factory()->create();
Auth::login($user);

Queue::assertPushed(ProcessWebhook::class, 1);
}

public function createServer(): Server
{
return Server::factory()->withNode()->create();
Expand Down

0 comments on commit 7a4c4ce

Please sign in to comment.