From 8d8c177daca850e6ecded9448c840fca0c0afa51 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20=C5=A0tancl?= Date: Mon, 19 Aug 2019 14:37:57 +0200 Subject: [PATCH] [1.8.0] Add Queue support & Horizon integration (#104) --- src/TenancyServiceProvider.php | 26 +++++++++++++++ tests/QueueTest.php | 59 ++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) create mode 100644 tests/QueueTest.php diff --git a/src/TenancyServiceProvider.php b/src/TenancyServiceProvider.php index 790e7210..411873f5 100644 --- a/src/TenancyServiceProvider.php +++ b/src/TenancyServiceProvider.php @@ -50,6 +50,7 @@ class TenancyServiceProvider extends ServiceProvider $this->app->register(TenantRouteServiceProvider::class); $this->registerTenantRedirectMacro(); + $this->makeQueuesTenantAware(); } public function registerTenantRedirectMacro() @@ -65,6 +66,31 @@ class TenancyServiceProvider extends ServiceProvider }); } + public function makeQueuesTenantAware() + { + $this->app['queue']->createPayloadUsing(function () { + if (tenancy()->initialized) { + [$uuid, $domain] = tenant()->get(['uuid', 'domain']); + + return [ + 'tenant_uuid' => $uuid, + 'tags' => [ + "tenant:$uuid", + "domain:$domain", + ], + ]; + } + + return []; + }); + + $this->app['events']->listen(\Illuminate\Queue\Events\JobProcessing::class, function ($event) { + if (\array_key_exists('tenant_uuid', $event->job->payload())) { + tenancy()->initById($event->job->payload()['tenant_uuid']); + } + }); + } + /** * Register services. * diff --git a/tests/QueueTest.php b/tests/QueueTest.php new file mode 100644 index 00000000..a84fe2d2 --- /dev/null +++ b/tests/QueueTest.php @@ -0,0 +1,59 @@ +markTestIncomplete(); + } + + /** @test */ + public function tenancy_is_initialized_inside_queues() + { + $this->loadLaravelMigrations(['--database' => 'tenant']); + Event::fake(); + + dispatch(new TestJob()); + + Event::assertDispatched(JobProcessing::class, function ($event) { + return $event->job->payload()['tenant_uuid'] === tenant('uuid'); + }); + } +} + +class TestJob implements ShouldQueue +{ + use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; + + /** + * Create a new job instance. + * + * @return void + */ + public function __construct() + { + // + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + logger(\json_encode(\DB::table('users')->get())); + } +}