From 0fd1d82c6801089d1e7063249d92f20620a651ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20=C5=A0tancl?= Date: Sun, 15 Sep 2019 11:01:24 +0200 Subject: [PATCH] TenantModel putMany --- .../{FeatureProvider.php => Feature.php} | 3 +- src/Contracts/TenancyBootstrapper.php | 2 +- src/Features/TelescopeTags.php | 4 +- src/Features/TenantRedirect.php | 4 +- .../Database/DatabaseStorageDriver.php | 8 ++-- src/StorageDrivers/Database/TenantModel.php | 32 +++++++++++++--- .../QueueTenancyBootstrapper.php | 2 +- src/TenancyServiceProvider.php | 37 +++++++----------- src/Tenant.php | 38 ++++++++++++++++++- src/TenantManager.php | 4 +- 10 files changed, 88 insertions(+), 46 deletions(-) rename src/Contracts/{FeatureProvider.php => Feature.php} (72%) diff --git a/src/Contracts/FeatureProvider.php b/src/Contracts/Feature.php similarity index 72% rename from src/Contracts/FeatureProvider.php rename to src/Contracts/Feature.php index 05299f81..0d51c4aa 100644 --- a/src/Contracts/FeatureProvider.php +++ b/src/Contracts/Feature.php @@ -7,8 +7,7 @@ namespace Stancl\Tenancy\Contracts; use Stancl\Tenancy\TenantManager; /** Additional features, like Telescope tags and tenant redirects. */ -// todo interface name. Feature, FeatureProvider, ProvidesFeature(s) -interface FeatureProvider +interface Feature { public function bootstrap(TenantManager $tenantManager): void; } diff --git a/src/Contracts/TenancyBootstrapper.php b/src/Contracts/TenancyBootstrapper.php index 5d1e2dcf..0e8c063f 100644 --- a/src/Contracts/TenancyBootstrapper.php +++ b/src/Contracts/TenancyBootstrapper.php @@ -8,7 +8,7 @@ use Stancl\Tenancy\Tenant; interface TenancyBootstrapper { - public function start(Tenant $tenant); + public function start(Tenant $tenant); // todo TenantManager instead of Tenant public function end(); } diff --git a/src/Features/TelescopeTags.php b/src/Features/TelescopeTags.php index 26f3e345..c849c547 100644 --- a/src/Features/TelescopeTags.php +++ b/src/Features/TelescopeTags.php @@ -6,10 +6,10 @@ namespace Stancl\Tenancy\Features; use Laravel\Telescope\IncomingEntry; use Laravel\Telescope\Telescope; -use Stancl\Tenancy\Contracts\FeatureProvider; +use Stancl\Tenancy\Contracts\Feature; use Stancl\Tenancy\TenantManager; -class TelescopeTags implements FeatureProvider +class TelescopeTags implements Feature { /** @var callable User-specific callback that returns tags. */ protected $callback; diff --git a/src/Features/TenantRedirect.php b/src/Features/TenantRedirect.php index 691c66cf..32407dd5 100644 --- a/src/Features/TenantRedirect.php +++ b/src/Features/TenantRedirect.php @@ -2,10 +2,10 @@ declare(strict_types=1); -use Stancl\Tenancy\Contracts\FeatureProvider; +use Stancl\Tenancy\Contracts\Feature; use Stancl\Tenancy\TenantManager; -class TenantRedirect implements FeatureProvider +class TenantRedirect implements Feature { public function bootstrap(TenantManager $tenantManager): void { diff --git a/src/StorageDrivers/Database/DatabaseStorageDriver.php b/src/StorageDrivers/Database/DatabaseStorageDriver.php index 6c06ee6d..b82f2cd9 100644 --- a/src/StorageDrivers/Database/DatabaseStorageDriver.php +++ b/src/StorageDrivers/Database/DatabaseStorageDriver.php @@ -30,7 +30,7 @@ class DatabaseStorageDriver implements StorageDriver ->withDomains(Domains::where('tenant_id', $id)->all()->only('domain')->toArray()); } - public function ensureTEnantCanBeCreated(Tenant $tenant) + public function ensureTenantCanBeCreated(Tenant $tenant) { // todo } @@ -61,7 +61,7 @@ class DatabaseStorageDriver implements StorageDriver public function deleteTenant(Tenant $tenant): void { Tenants::find($tenant->id)->delete(); - // todo domains + Domains::where('tenant_id', $tenant->id)->delete(); } public function all(array $ids = []): array @@ -87,8 +87,6 @@ class DatabaseStorageDriver implements StorageDriver public function putMany(array $kvPairs, Tenant $tenant = null): void { - foreach ($kvPairs as $key => $value) { // todo performance - Tenants::find($tenant->id)->put($key, $value); - } + Tenants::find($tenant->id)->putMany($kvPairs); } } diff --git a/src/StorageDrivers/Database/TenantModel.php b/src/StorageDrivers/Database/TenantModel.php index 81ed5c24..60943769 100644 --- a/src/StorageDrivers/Database/TenantModel.php +++ b/src/StorageDrivers/Database/TenantModel.php @@ -52,14 +52,14 @@ class TenantModel extends Model public static function decodeData($tenant) { $tenant = $tenant instanceof self ? (array) $tenant->attributes : $tenant; - $decoded = \json_decode($tenant[$dataColumn = static::dataColumn()], true); + $decoded = json_decode($tenant[$dataColumn = static::dataColumn()], true); foreach ($decoded as $key => $value) { $tenant[$key] = $value; } // If $tenant[$dataColumn] has been overriden by a value, don't delete the key. - if (! \array_key_exists($dataColumn, $decoded)) { + if (! array_key_exists($dataColumn, $decoded)) { unset($tenant[$dataColumn]); } @@ -68,7 +68,7 @@ class TenantModel extends Model public function getFromData(string $key) { - $this->dataArray = $this->dataArray ?? \json_decode($this->{$this->dataColumn()}, true); + $this->dataArray = $this->dataArray ?? json_decode($this->{$this->dataColumn()}, true); return $this->dataArray[$key] ?? null; } @@ -89,15 +89,35 @@ class TenantModel extends Model public function put(string $key, $value) { - if (\in_array($key, $this->customColumns())) { + if (in_array($key, $this->customColumns())) { $this->update([$key => $value]); } else { - $obj = \json_decode($this->{$this->dataColumn()}); + $obj = json_decode($this->{$this->dataColumn()}); $obj->$key = $value; - $this->update([$this->dataColumn() => \json_encode($obj)]); + $this->update([$this->dataColumn() => json_encode($obj)]); } return $value; } + + public function putMany(array $kvPairs) + { + $customColumns = []; + $jsonObj = json_decode($this->{$this->customColumns()}); + + foreach($kvPairs as $key => $value) + { + if (in_array($key, $this->customColumns())) { + $customColumns[$key] = $value; + continue; + } + + $jsonObj->$key = $value; + } + + $this->update(array_merge($customColumns, [ + $this->dataColumn() => json_encode($jsonObj), + ])) + } } diff --git a/src/TenancyBootstrappers/QueueTenancyBootstrapper.php b/src/TenancyBootstrappers/QueueTenancyBootstrapper.php index 38cab5bc..0861567b 100644 --- a/src/TenancyBootstrappers/QueueTenancyBootstrapper.php +++ b/src/TenancyBootstrappers/QueueTenancyBootstrapper.php @@ -10,7 +10,7 @@ use Stancl\Tenancy\Tenant; class QueueTenancyBootstrapper implements TenancyBootstrapper { /** @var bool Has tenancy been started. */ - protected $started = false; // todo var name? + protected $started = false; /** @var Application */ protected $app; diff --git a/src/TenancyServiceProvider.php b/src/TenancyServiceProvider.php index 6d3b63d8..0cbb6bf0 100644 --- a/src/TenancyServiceProvider.php +++ b/src/TenancyServiceProvider.php @@ -7,13 +7,6 @@ namespace Stancl\Tenancy; use Illuminate\Cache\CacheManager; use Illuminate\Support\Facades\Route; use Illuminate\Support\ServiceProvider; -use Stancl\Tenancy\Commands\Install; -use Stancl\Tenancy\Commands\Migrate; -use Stancl\Tenancy\Commands\Rollback; -use Stancl\Tenancy\Commands\Run; -use Stancl\Tenancy\Commands\Seed; -use Stancl\Tenancy\Commands\TenantList; -use Stancl\Tenancy\Contracts\StorageDriver; class TenancyServiceProvider extends ServiceProvider { @@ -25,12 +18,12 @@ class TenancyServiceProvider extends ServiceProvider public function boot() { $this->commands([ - Run::class, - Seed::class, - Install::class, - Migrate::class, - Rollback::class, - TenantList::class, + Commands\Run::class, + Commands\Seed::class, + Commands\Install::class, + Commands\Migrate::class, + Commands\Rollback::class, + Commands\TenantList::class, ]); $this->publishes([ @@ -59,29 +52,27 @@ class TenancyServiceProvider extends ServiceProvider { $this->mergeConfigFrom(__DIR__ . '/../assets/config.php', 'tenancy'); - $this->app->bind(StorageDriver::class, $this->app['config']['tenancy.storage_driver']); + $this->app->bind(Contracts\StorageDriver::class, $this->app['config']['tenancy.storage_driver']); + $this->app->bind(Contracts\UniqueIdentifierGenerator::class, $this->app['config']['tenancy.unique_id_generator']); $this->app->singleton(DatabaseManager::class); - $this->app->singleton(TenantManager::class, function ($app) { - return new TenantManager( - $app, $app[StorageDriver::class], $app[DatabaseManager::class], $app[$app['config']['tenancy.unique_id_generator']] // todo - ); - }); + $this->app->singleton(TenantManager::class); $this->app->bind(Tenant::class, function ($app) { - return $app[TenantManager::class]->currentTenant(); + return $app[TenantManager::class]->getTenant(); }); foreach ($this->app['config']['tenancy.bootstrappers'] as $bootstrapper) { $this->app->singleton($bootstrapper); } + // todo are these necessary? $this->app->singleton(Migrate::class, function ($app) { - return new Migrate($app['migrator'], $app[DatabaseManager::class]); + return new Commands\Migrate($app['migrator'], $app[DatabaseManager::class]); }); $this->app->singleton(Rollback::class, function ($app) { - return new Rollback($app['migrator'], $app[DatabaseManager::class]); + return new Commands\Rollback($app['migrator'], $app[DatabaseManager::class]); }); $this->app->singleton(Seed::class, function ($app) { - return new Seed($app['db'], $app[DatabaseManager::class]); + return new Commands\Seed($app['db'], $app[DatabaseManager::class]); }); $this->app->bind('globalCache', function ($app) { diff --git a/src/Tenant.php b/src/Tenant.php index bace0cf1..a9034e75 100644 --- a/src/Tenant.php +++ b/src/Tenant.php @@ -73,7 +73,41 @@ class Tenant implements ArrayAccess return $this; } - // todo addDomain, removeDomain + /** + * Assign domains to the tenant. + * + * @param string|string[] $domains + * @return self + */ + public function addDomains($domains): self + { + $domains = (array) $domains; + $this->domains = array_merge($this->domains, $domains); + + return $this; + } + + /** + * Unassign domains from the tenant. + * + * @param string|string[] $domains + * @return self + */ + public function removeDomains($domains): self + { + $domains = (array) $domains; + $this->domains = array_diff($this->domains, $domains); + + return $this; + } + + public function clearDomains(): self + { + $this->domains = []; + + return $this; + } + public function withDomains($domains): self { $domains = (array) $domains; @@ -135,7 +169,7 @@ class Tenant implements ArrayAccess public function softDelete(): self { $this->put('_tenancy_original_domains', $this->domains); - $this->domains = []; + $this->clearDomains(); $this->save(); return $this; diff --git a/src/TenantManager.php b/src/TenantManager.php index 291633c0..8a52f435 100644 --- a/src/TenantManager.php +++ b/src/TenantManager.php @@ -185,10 +185,10 @@ class TenantManager * Get the current tenant. * * @param string $key - * @return Tenant + * @return Tenant|mixed * @throws NoTenantIdentifiedException */ - public function getTenant(string $key = null): Tenant + public function getTenant(string $key = null) { if (! $this->tenant) { throw new NoTenantIdentifiedException;