From 1bcc2159668802f4845756e1c04ba62d0fc3a399 Mon Sep 17 00:00:00 2001 From: Johannes Date: Wed, 12 Mar 2025 11:16:34 +0100 Subject: [PATCH] also invalidate the resolver cache when a tenant or related model is deleted --- .../Concerns/InvalidatesResolverCache.php | 18 ++++--- .../InvalidatesTenantsResolverCache.php | 18 ++++--- tests/CachedTenantResolverTest.php | 48 +++++++++++++++++++ 3 files changed, 70 insertions(+), 14 deletions(-) diff --git a/src/Database/Concerns/InvalidatesResolverCache.php b/src/Database/Concerns/InvalidatesResolverCache.php index 7dff35ad..84ff9378 100644 --- a/src/Database/Concerns/InvalidatesResolverCache.php +++ b/src/Database/Concerns/InvalidatesResolverCache.php @@ -18,13 +18,17 @@ trait InvalidatesResolverCache public static function bootInvalidatesResolverCache() { - static::saved(function (Tenant $tenant) { - foreach (static::$resolvers as $resolver) { - /** @var CachedTenantResolver $resolver */ - $resolver = app($resolver); + static::saved(fn(Tenant $tenant) => static::invalidateTenantCache($tenant)); + static::deleted(fn(Tenant $tenant) => static::invalidateTenantCache($tenant)); + } - $resolver->invalidateCache($tenant); - } - }); + private static function invalidateTenantCache(Tenant $tenant): void + { + foreach (static::$resolvers as $resolver) { + /** @var CachedTenantResolver $resolver */ + $resolver = app($resolver); + + $resolver->invalidateCache($tenant); + } } } diff --git a/src/Database/Concerns/InvalidatesTenantsResolverCache.php b/src/Database/Concerns/InvalidatesTenantsResolverCache.php index 555aceeb..55e172d7 100644 --- a/src/Database/Concerns/InvalidatesTenantsResolverCache.php +++ b/src/Database/Concerns/InvalidatesTenantsResolverCache.php @@ -21,13 +21,17 @@ trait InvalidatesTenantsResolverCache public static function bootInvalidatesTenantsResolverCache() { - static::saved(function (Model $model) { - foreach (static::$resolvers as $resolver) { - /** @var CachedTenantResolver $resolver */ - $resolver = app($resolver); + static::saved(fn(Model $model) => static::invalidateTenantCache($model)); + static::deleted(fn(Model $model) => static::invalidateTenantCache($model)); + } - $resolver->invalidateCache($model->tenant); - } - }); + private static function invalidateTenantCache(Model $model): void + { + foreach (static::$resolvers as $resolver) { + /** @var CachedTenantResolver $resolver */ + $resolver = app($resolver); + + $resolver->invalidateCache($model->tenant); + } } } diff --git a/tests/CachedTenantResolverTest.php b/tests/CachedTenantResolverTest.php index e7eb52d3..f2f5a0cd 100644 --- a/tests/CachedTenantResolverTest.php +++ b/tests/CachedTenantResolverTest.php @@ -109,4 +109,52 @@ class CachedTenantResolverTest extends TestCase $this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('bar'))); $this->assertNotEmpty(DB::getQueryLog()); // not empty } + + /** @test */ + public function cache_is_invalidated_when_a_tenants_domain_is_deleted() + { + $tenant = Tenant::create(); + $tenant->createDomain([ + 'domain' => 'acme', + ]); + + DB::enableQueryLog(); + + DomainTenantResolver::$shouldCache = true; + + $this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('acme'))); + DB::flushQueryLog(); + $this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('acme'))); + $this->assertEmpty(DB::getQueryLog()); // empty + + $tenant->domains()->first()->delete(); + + DB::flushQueryLog(); + $this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('acme'))); + $this->assertEmpty(DB::getQueryLog()); // not empty + } + + /** @test */ + public function cache_is_invalidated_when_a_tenant_is_deleted() + { + $tenant = Tenant::create(); + $tenant->createDomain([ + 'domain' => 'acme', + ]); + + DB::enableQueryLog(); + + DomainTenantResolver::$shouldCache = true; + + $this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('acme'))); + DB::flushQueryLog(); + $this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('acme'))); + $this->assertEmpty(DB::getQueryLog()); // empty + + $tenant->delete(); + + DB::flushQueryLog(); + $this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('acme'))); + $this->assertEmpty(DB::getQueryLog()); // not empty + } }