1
0
Fork 0
mirror of https://github.com/archtechx/tenancy.git synced 2026-02-04 14:44:05 +00:00

also invalidate the resolver cache when a tenant or related model is deleted

This commit is contained in:
Johannes 2025-03-12 11:16:34 +01:00
parent 19bc316cf6
commit 1bcc215966
3 changed files with 70 additions and 14 deletions

View file

@ -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);
}
}
}

View file

@ -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);
}
}
}

View file

@ -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
}
}