mirror of
https://github.com/archtechx/tenancy.git
synced 2026-02-05 15:14:04 +00:00
code improvements
This commit is contained in:
parent
8aea33c0f2
commit
c62dc0f0f3
3 changed files with 16 additions and 17 deletions
|
|
@ -16,8 +16,6 @@ interface Syncable
|
|||
|
||||
public function triggerSyncEvent(): void;
|
||||
|
||||
/**
|
||||
* Get the attributes used for creating the *other* model (i.e. tenant if this is the central one, and central if this is the tenant one).
|
||||
*/
|
||||
/** Get the attributes used for creating the *other* model (i.e. tenant if this is the central one, and central if this is the tenant one). */
|
||||
public function getSyncedCreationAttributes(): array|null; // todo come up with a better name
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,6 +10,8 @@ use Illuminate\Database\Eloquent\Relations\Pivot;
|
|||
use Illuminate\Support\Arr;
|
||||
use Stancl\Tenancy\Contracts\Syncable;
|
||||
use Stancl\Tenancy\Contracts\SyncMaster;
|
||||
use Stancl\Tenancy\Contracts\Tenant;
|
||||
use Stancl\Tenancy\Database\TenantCollection;
|
||||
use Stancl\Tenancy\Events\SyncedResourceChangedInForeignDatabase;
|
||||
use Stancl\Tenancy\Events\SyncedResourceSaved;
|
||||
use Stancl\Tenancy\Exceptions\ModelNotSyncMasterException;
|
||||
|
|
@ -32,14 +34,14 @@ class UpdateSyncedResource extends QueueableListener
|
|||
$this->updateResourceInTenantDatabases($tenants, $event, $syncedAttributes);
|
||||
}
|
||||
|
||||
protected function getTenantsForCentralModel($centralModel): EloquentCollection
|
||||
protected function getTenantsForCentralModel($centralModel): TenantCollection
|
||||
{
|
||||
if (! $centralModel instanceof SyncMaster) {
|
||||
// If we're trying to use a tenant User model instead of the central User model, for example.
|
||||
throw new ModelNotSyncMasterException(get_class($centralModel));
|
||||
}
|
||||
|
||||
/** @var SyncMaster|Model $centralModel */
|
||||
/** @var Tenant&Model&SyncMaster $centralModel */
|
||||
|
||||
// Since this model is "dirty" (taken by reference from the event), it might have the tenants
|
||||
// relationship already loaded and cached. For this reason, we refresh the relationship.
|
||||
|
|
@ -48,7 +50,7 @@ class UpdateSyncedResource extends QueueableListener
|
|||
return $centralModel->tenants;
|
||||
}
|
||||
|
||||
protected function updateResourceInCentralDatabaseAndGetTenants($event, $syncedAttributes): EloquentCollection
|
||||
protected function updateResourceInCentralDatabaseAndGetTenants($event, array $syncedAttributes): TenantCollection
|
||||
{
|
||||
/** @var Model|SyncMaster $centralModel */
|
||||
$centralModel = $event->model->getCentralModelName()::where($event->model->getGlobalIdentifierKeyName(), $event->model->getGlobalIdentifierKey())
|
||||
|
|
@ -87,12 +89,13 @@ class UpdateSyncedResource extends QueueableListener
|
|||
});
|
||||
}
|
||||
|
||||
protected function updateResourceInTenantDatabases($tenants, $event, $syncedAttributes): void
|
||||
protected function updateResourceInTenantDatabases($tenants, $event, array $syncedAttributes): void
|
||||
{
|
||||
tenancy()->runForMultiple($tenants, function ($tenant) use ($event, $syncedAttributes) {
|
||||
// Forget instance state and find the model,
|
||||
// again in the current tenant's context.
|
||||
|
||||
/** @var Model&Syncable $eventModel */
|
||||
$eventModel = $event->model;
|
||||
|
||||
if ($eventModel instanceof SyncMaster) {
|
||||
|
|
@ -121,7 +124,7 @@ class UpdateSyncedResource extends QueueableListener
|
|||
});
|
||||
}
|
||||
|
||||
protected function getAttributesForCreation(Syncable $model): array
|
||||
protected function getAttributesForCreation(Model&Syncable $model): array
|
||||
{
|
||||
if (! $model->getSyncedCreationAttributes()) {
|
||||
// Creation attributes are not specified so create the model as 1:1 copy
|
||||
|
|
@ -143,7 +146,7 @@ class UpdateSyncedResource extends QueueableListener
|
|||
/**
|
||||
* Split the attribute names (sequential index items) and default values (key => values).
|
||||
*/
|
||||
protected function getAttributeNamesAndDefaultValues(Syncable $model): array
|
||||
protected function getAttributeNamesAndDefaultValues(Model&Syncable $model): array
|
||||
{
|
||||
$syncedCreationAttributes = $model->getSyncedCreationAttributes();
|
||||
|
||||
|
|
|
|||
|
|
@ -4,11 +4,9 @@ declare(strict_types=1);
|
|||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Events\CallQueuedListener;
|
||||
use Illuminate\Support\Facades\Event;
|
||||
use Illuminate\Support\Facades\Queue;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Support\Str;
|
||||
use Stancl\JobPipeline\JobPipeline;
|
||||
use Stancl\Tenancy\Bootstrappers\DatabaseTenancyBootstrapper;
|
||||
|
|
@ -46,10 +44,10 @@ beforeEach(function () {
|
|||
Event::listen(TenancyInitialized::class, BootstrapTenancy::class);
|
||||
Event::listen(TenancyEnded::class, RevertToCentralContext::class);
|
||||
|
||||
UpdateSyncedResource::$shouldQueue = false; // global state cleanup
|
||||
UpdateSyncedResource::$shouldQueue = false; // Global state cleanup
|
||||
Event::listen(SyncedResourceSaved::class, UpdateSyncedResource::class);
|
||||
|
||||
// run migrations on central connection
|
||||
// Run migrations on central connection
|
||||
pest()->artisan('migrate', [
|
||||
'--path' => [
|
||||
__DIR__ . '/Etc/synced_resource_migrations',
|
||||
|
|
@ -129,7 +127,7 @@ test('only the synced columns are updated in the central db', function () {
|
|||
], ResourceUser::first()->getAttributes());
|
||||
});
|
||||
|
||||
test('creating the resource in tenant database creates it in central database as 1:1 copy when creation attributes are not specified', function () {
|
||||
test('creating the resource in tenant database creates it in central database as a direct copy when creation attributes are not specified', function () {
|
||||
// Assert no user exists in central DB
|
||||
expect(ResourceUser::all())->toHaveCount(0);
|
||||
|
||||
|
|
@ -154,7 +152,7 @@ test('creating the resource in tenant database creates it in central database as
|
|||
expect(CentralUser::first()->toArray())->toEqual(ResourceUser::first()->toArray());
|
||||
});
|
||||
|
||||
test('creating the resource in tenant database creates it in central database with default attributes values', function () {
|
||||
test('creating the resource in tenant database creates it in central database with default attribute values', function () {
|
||||
// Assert no user exists in central DB
|
||||
expect(ResourceUserWithDefaultValues::all())->toHaveCount(0);
|
||||
|
||||
|
|
@ -244,9 +242,9 @@ test('creating the resource in tenant database creates it in central database wi
|
|||
expect(CentralUser::first()->password)->toBe('secret');
|
||||
expect(CentralUser::first()->code)->toBeNull();
|
||||
expect(CentralUser::first()->role)->toBe('admin'); // unsynced so it should be default value
|
||||
}) ;
|
||||
});
|
||||
|
||||
test('creating the resource in central database creates it in tenant database as 1:1 copy when creation attributes are not specified', function () {
|
||||
test('creating the resource in central database creates it in tenant database as direct copy when creation attributes are not specified', function () {
|
||||
$centralUser = CentralUser::create([
|
||||
'global_id' => 'acme',
|
||||
'name' => 'John Doe',
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue