From d98a170fbd2e114604bfec3bc6267a3d6e02dec1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20=C5=A0tancl?= Date: Thu, 13 Mar 2025 17:02:11 +0100 Subject: [PATCH] Invalidate resolver cache on delete (#1328) --- .../Concerns/InvalidatesResolverCache.php | 7 ++- .../InvalidatesTenantsResolverCache.php | 7 ++- tests/CachedTenantResolverTest.php | 55 +++++++++++++++++++ 3 files changed, 65 insertions(+), 4 deletions(-) diff --git a/src/Database/Concerns/InvalidatesResolverCache.php b/src/Database/Concerns/InvalidatesResolverCache.php index 7dff35ad..2da00e52 100644 --- a/src/Database/Concerns/InvalidatesResolverCache.php +++ b/src/Database/Concerns/InvalidatesResolverCache.php @@ -18,13 +18,16 @@ trait InvalidatesResolverCache public static function bootInvalidatesResolverCache() { - static::saved(function (Tenant $tenant) { + $invalidateCache = static function (Tenant $tenant) { foreach (static::$resolvers as $resolver) { /** @var CachedTenantResolver $resolver */ $resolver = app($resolver); $resolver->invalidateCache($tenant); } - }); + }; + + static::saved($invalidateCache); + static::deleting($invalidateCache); } } diff --git a/src/Database/Concerns/InvalidatesTenantsResolverCache.php b/src/Database/Concerns/InvalidatesTenantsResolverCache.php index 555aceeb..4101faa7 100644 --- a/src/Database/Concerns/InvalidatesTenantsResolverCache.php +++ b/src/Database/Concerns/InvalidatesTenantsResolverCache.php @@ -21,13 +21,16 @@ trait InvalidatesTenantsResolverCache public static function bootInvalidatesTenantsResolverCache() { - static::saved(function (Model $model) { + $invalidateCache = static function (Model $model) { foreach (static::$resolvers as $resolver) { /** @var CachedTenantResolver $resolver */ $resolver = app($resolver); $resolver->invalidateCache($model->tenant); } - }); + }; + + static::saved($invalidateCache); + static::deleting($invalidateCache); } } diff --git a/tests/CachedTenantResolverTest.php b/tests/CachedTenantResolverTest.php index e7eb52d3..940c950f 100644 --- a/tests/CachedTenantResolverTest.php +++ b/tests/CachedTenantResolverTest.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace Stancl\Tenancy\Tests; use Illuminate\Support\Facades\DB; +use Stancl\Tenancy\Exceptions\TenantCouldNotBeIdentifiedOnDomainException; use Stancl\Tenancy\Resolvers\DomainTenantResolver; use Stancl\Tenancy\Tests\Etc\Tenant; @@ -80,6 +81,33 @@ class CachedTenantResolverTest extends TestCase $this->assertNotEmpty(DB::getQueryLog()); // not empty } + /** @test */ + public function cache_is_invalidated_when_the_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->assertThrows(function () { + app(DomainTenantResolver::class)->resolve('acme'); + }, TenantCouldNotBeIdentifiedOnDomainException::class); + + $this->assertNotEmpty(DB::getQueryLog()); // not empty - cache cleared so the DB was queried + } + /** @test */ public function cache_is_invalidated_when_a_tenants_domain_is_changed() { @@ -109,4 +137,31 @@ 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->assertThrows(function () { + app(DomainTenantResolver::class)->resolve('acme'); + }, TenantCouldNotBeIdentifiedOnDomainException::class); + + $this->assertNotEmpty(DB::getQueryLog()); // not empty - cache cleared so the DB was queried + } }