diff --git a/src/StorageDrivers/DatabaseStorageDriver.php b/src/StorageDrivers/DatabaseStorageDriver.php index c9b9999f..d69f6071 100644 --- a/src/StorageDrivers/DatabaseStorageDriver.php +++ b/src/StorageDrivers/DatabaseStorageDriver.php @@ -2,8 +2,8 @@ namespace Stancl\Tenancy\StorageDrivers; -use Stancl\Tenancy\Interfaces\StorageDriver; use Stancl\Tenancy\Tenant; +use Stancl\Tenancy\Interfaces\StorageDriver; class DatabaseStorageDriver implements StorageDriver { @@ -26,13 +26,7 @@ class DatabaseStorageDriver implements StorageDriver */ public function getTenantById(string $uuid, array $fields = []): array { - $fields = (array) $fields; - - if (! $fields) { - return $this->redis->hgetall("tenants:$uuid"); - } - - return array_combine($fields, $this->redis->hmget("tenants:$uuid", $fields)); + return Tenant::find($uuid)->only($fields)->toArray(); } public function getTenantIdByDomain(string $domain): ?string @@ -47,21 +41,11 @@ class DatabaseStorageDriver implements StorageDriver public function deleteTenant(string $id): bool { - try { - $domain = json_decode($this->getTenantById($id)['domain']); - } catch (\Throwable $th) { - throw new \Exception("No tenant with UUID $id exists."); - } - return Tenant::find($id)->delete(); } public function getAllTenants(array $uuids = []): array { - $hashes = array_map(function ($hash) { - return "tenants:{$hash}"; - }, $uuids); - return Tenant::all()->map(function ($model) { return $model->toArray(); })->toArray(); @@ -70,6 +54,7 @@ class DatabaseStorageDriver implements StorageDriver public function get(string $uuid, string $key) { $tenant = Tenant::find($uuid); + return $tenant->$key ?? json_decode($tenant->data)[$key] ?? null; } @@ -80,24 +65,27 @@ class DatabaseStorageDriver implements StorageDriver $tenant_data = null; // cache - json_decode() can be expensive $get_from_tenant_data = function ($key) use ($tenant, &$tenant_data) { $tenant_data = $tenant_data ?? json_decode($tenant->data); + return $tenant_data[$key] ?? null; }; return array_reduce($keys, function ($keys, $key) use ($tenant, $get_from_tenant_data) { $keys[$key] = $tenant->$key ?? $get_from_tenant_data($key) ?? null; + return $keys; }, []); } public function put(string $uuid, string $key, $value) { - // return Tenant::find($uuid) TODO + return Tenant::find($uuid)->put($key, $value); } public function putMany(string $uuid, array $values): array { - // todo - // $this->redis->hmset("tenants:$uuid", $values); + foreach ($values as $key => $value) { + Tenant::find($uuid)->put($key, $value); + } return $values; } diff --git a/src/Tenant.php b/src/Tenant.php index aa2d806e..9e52a9c3 100644 --- a/src/Tenant.php +++ b/src/Tenant.php @@ -6,20 +6,21 @@ use Illuminate\Database\Eloquent\Model; class Tenant extends Model { - public function getDataColumn() - { - return 'data'; - } + protected $dataColumn = 'data'; + protected $specialColumns = []; + protected $guarded = []; public function put(string $key, $value) { - if ($this->getConnection()->getSchemaBuilder()->hasColumn($this->getTable(), $key)) { + if (array_key_exists($key, $this->specialColumns)) { $this->update([$key => $value]); } else { - $obj = json_decode($this->{$this->getDataColumn()}); + $obj = json_decode($this->{$this->dataColumn}); $obj->$key = $value; $this->update([$this->getDataColumn() => json_encode($obj)]); } + + return $value; } }