From f489aba8190f059eb240cec583be3391ffca0bac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20=C5=A0tancl?= Date: Sun, 20 Oct 2019 00:27:52 +0200 Subject: [PATCH] Respect custom columns during tenant creation (#191) --- .../Database/DatabaseStorageDriver.php | 4 ++- src/StorageDrivers/Database/TenantModel.php | 18 ++++++++++ tests/TenantStorageTest.php | 34 ++++++++++++++++--- 3 files changed, 51 insertions(+), 5 deletions(-) diff --git a/src/StorageDrivers/Database/DatabaseStorageDriver.php b/src/StorageDrivers/Database/DatabaseStorageDriver.php index 95df006e..0b649eae 100644 --- a/src/StorageDrivers/Database/DatabaseStorageDriver.php +++ b/src/StorageDrivers/Database/DatabaseStorageDriver.php @@ -103,7 +103,9 @@ class DatabaseStorageDriver implements StorageDriver public function createTenant(Tenant $tenant): void { $this->centralDatabase->transaction(function () use ($tenant) { - Tenants::create(['id' => $tenant->id, 'data' => json_encode($tenant->data)])->toArray(); + Tenants::create(array_merge(Tenants::encodeData($tenant->data), [ + 'id' => $tenant->id, + ]))->toArray(); $domainData = []; foreach ($tenant->domains as $domain) { diff --git a/src/StorageDrivers/Database/TenantModel.php b/src/StorageDrivers/Database/TenantModel.php index 782d0308..16189723 100644 --- a/src/StorageDrivers/Database/TenantModel.php +++ b/src/StorageDrivers/Database/TenantModel.php @@ -33,6 +33,24 @@ class TenantModel extends Model return config('tenancy.storage_drivers.db.custom_columns', []); } + public static function encodeData(array $data) + { + $result = []; + $jsonData = []; + + foreach ($data as $key => $value) { + if (in_array($key, static::customColumns(), true)) { + $result[$key] = $value; + } else { + $jsonData[$key] = $value; + } + } + + $result['data'] = $jsonData ? json_encode($jsonData) : '{}'; + + return $result; + } + public static function getAllTenants(array $ids) { $tenants = $ids ? static::findMany($ids) : static::all(); diff --git a/tests/TenantStorageTest.php b/tests/TenantStorageTest.php index 5f955ab9..a33ec5cc 100644 --- a/tests/TenantStorageTest.php +++ b/tests/TenantStorageTest.php @@ -137,7 +137,7 @@ class TenantStorageTest extends TestCase /** @test */ public function custom_columns_work_with_db_storage_driver() { - if (config('tenancy.storage_driver') != 'Stancl\Tenancy\StorageDrivers\DatabaseStorageDriver') { + if (config('tenancy.storage_driver') != 'db') { $this->markTestSkipped(); } @@ -153,12 +153,38 @@ class TenantStorageTest extends TestCase 'foo', ]]); - tenant()->create(['foo.localhost']); + tenancy()->create(['foo.localhost']); tenancy()->init('foo.localhost'); tenant()->put(['foo' => 'bar', 'abc' => 'xyz']); - $this->assertSame(['bar', 'xyz'], tenant()->get(['foo', 'abc'])); + $this->assertSame(['foo' => 'bar', 'abc' => 'xyz'], tenant()->get(['foo', 'abc'])); - $this->assertSame('bar', DB::connection('central')->table('tenants')->where('id', tenant('id'))->first()->foo); + $this->assertSame('bar', \DB::connection('central')->table('tenants')->where('id', tenant('id'))->first()->foo); + } + + /** @test */ + public function custom_columns_can_be_used_on_tenant_create() + { + if (config('tenancy.storage_driver') != 'db') { + $this->markTestSkipped(); + } + + tenancy()->endTenancy(); + + $this->loadMigrationsFrom([ + '--path' => __DIR__ . '/Etc', + '--database' => 'central', + ]); + config(['database.default' => 'sqlite']); // fix issue caused by loadMigrationsFrom + + config(['tenancy.storage_drivers.db.custom_columns' => [ + 'foo', + ]]); + + tenancy()->create(['foo.localhost'], ['foo' => 'bar', 'abc' => 'xyz']); + tenancy()->init('foo.localhost'); + + $this->assertSame(['foo' => 'bar', 'abc' => 'xyz'], tenant()->get(['foo', 'abc'])); + $this->assertSame('bar', \DB::connection('central')->table('tenants')->where('id', tenant('id'))->first()->foo); } }