Skip to content

Commit d98a170

Browse files
authored
Invalidate resolver cache on delete (#1328)
1 parent e46355f commit d98a170

File tree

3 files changed

+65
-4
lines changed

3 files changed

+65
-4
lines changed

src/Database/Concerns/InvalidatesResolverCache.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,16 @@ trait InvalidatesResolverCache
1818

1919
public static function bootInvalidatesResolverCache()
2020
{
21-
static::saved(function (Tenant $tenant) {
21+
$invalidateCache = static function (Tenant $tenant) {
2222
foreach (static::$resolvers as $resolver) {
2323
/** @var CachedTenantResolver $resolver */
2424
$resolver = app($resolver);
2525

2626
$resolver->invalidateCache($tenant);
2727
}
28-
});
28+
};
29+
30+
static::saved($invalidateCache);
31+
static::deleting($invalidateCache);
2932
}
3033
}

src/Database/Concerns/InvalidatesTenantsResolverCache.php

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,16 @@ trait InvalidatesTenantsResolverCache
2121

2222
public static function bootInvalidatesTenantsResolverCache()
2323
{
24-
static::saved(function (Model $model) {
24+
$invalidateCache = static function (Model $model) {
2525
foreach (static::$resolvers as $resolver) {
2626
/** @var CachedTenantResolver $resolver */
2727
$resolver = app($resolver);
2828

2929
$resolver->invalidateCache($model->tenant);
3030
}
31-
});
31+
};
32+
33+
static::saved($invalidateCache);
34+
static::deleting($invalidateCache);
3235
}
3336
}

tests/CachedTenantResolverTest.php

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Stancl\Tenancy\Tests;
66

77
use Illuminate\Support\Facades\DB;
8+
use Stancl\Tenancy\Exceptions\TenantCouldNotBeIdentifiedOnDomainException;
89
use Stancl\Tenancy\Resolvers\DomainTenantResolver;
910
use Stancl\Tenancy\Tests\Etc\Tenant;
1011

@@ -80,6 +81,33 @@ public function cache_is_invalidated_when_the_tenant_is_updated()
8081
$this->assertNotEmpty(DB::getQueryLog()); // not empty
8182
}
8283

84+
/** @test */
85+
public function cache_is_invalidated_when_the_tenant_is_deleted()
86+
{
87+
$tenant = Tenant::create();
88+
$tenant->createDomain([
89+
'domain' => 'acme',
90+
]);
91+
92+
DB::enableQueryLog();
93+
94+
DomainTenantResolver::$shouldCache = true;
95+
96+
$this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('acme')));
97+
DB::flushQueryLog();
98+
$this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('acme')));
99+
$this->assertEmpty(DB::getQueryLog()); // empty
100+
101+
$tenant->delete();
102+
DB::flushQueryLog();
103+
104+
$this->assertThrows(function () {
105+
app(DomainTenantResolver::class)->resolve('acme');
106+
}, TenantCouldNotBeIdentifiedOnDomainException::class);
107+
108+
$this->assertNotEmpty(DB::getQueryLog()); // not empty - cache cleared so the DB was queried
109+
}
110+
83111
/** @test */
84112
public function cache_is_invalidated_when_a_tenants_domain_is_changed()
85113
{
@@ -109,4 +137,31 @@ public function cache_is_invalidated_when_a_tenants_domain_is_changed()
109137
$this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('bar')));
110138
$this->assertNotEmpty(DB::getQueryLog()); // not empty
111139
}
140+
141+
/** @test */
142+
public function cache_is_invalidated_when_a_tenants_domain_is_deleted()
143+
{
144+
$tenant = Tenant::create();
145+
$tenant->createDomain([
146+
'domain' => 'acme',
147+
]);
148+
149+
DB::enableQueryLog();
150+
151+
DomainTenantResolver::$shouldCache = true;
152+
153+
$this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('acme')));
154+
DB::flushQueryLog();
155+
$this->assertTrue($tenant->is(app(DomainTenantResolver::class)->resolve('acme')));
156+
$this->assertEmpty(DB::getQueryLog()); // empty
157+
158+
$tenant->domains->first()->delete();
159+
DB::flushQueryLog();
160+
161+
$this->assertThrows(function () {
162+
app(DomainTenantResolver::class)->resolve('acme');
163+
}, TenantCouldNotBeIdentifiedOnDomainException::class);
164+
165+
$this->assertNotEmpty(DB::getQueryLog()); // not empty - cache cleared so the DB was queried
166+
}
112167
}

0 commit comments

Comments
 (0)