1
0
Fork 0
mirror of https://github.com/archtechx/tenancy.git synced 2026-02-04 19:04:03 +00:00
This commit is contained in:
Samuel Štancl 2019-08-09 22:50:46 +02:00
commit fd0712e037
2 changed files with 16 additions and 27 deletions

View file

@ -2,8 +2,8 @@
namespace Stancl\Tenancy\StorageDrivers; namespace Stancl\Tenancy\StorageDrivers;
use Stancl\Tenancy\Interfaces\StorageDriver;
use Stancl\Tenancy\Tenant; use Stancl\Tenancy\Tenant;
use Stancl\Tenancy\Interfaces\StorageDriver;
class DatabaseStorageDriver implements StorageDriver class DatabaseStorageDriver implements StorageDriver
{ {
@ -26,13 +26,7 @@ class DatabaseStorageDriver implements StorageDriver
*/ */
public function getTenantById(string $uuid, array $fields = []): array public function getTenantById(string $uuid, array $fields = []): array
{ {
$fields = (array) $fields; return Tenant::find($uuid)->only($fields)->toArray();
if (! $fields) {
return $this->redis->hgetall("tenants:$uuid");
}
return array_combine($fields, $this->redis->hmget("tenants:$uuid", $fields));
} }
public function getTenantIdByDomain(string $domain): ?string public function getTenantIdByDomain(string $domain): ?string
@ -47,21 +41,11 @@ class DatabaseStorageDriver implements StorageDriver
public function deleteTenant(string $id): bool 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(); return Tenant::find($id)->delete();
} }
public function getAllTenants(array $uuids = []): array public function getAllTenants(array $uuids = []): array
{ {
$hashes = array_map(function ($hash) {
return "tenants:{$hash}";
}, $uuids);
return Tenant::all()->map(function ($model) { return Tenant::all()->map(function ($model) {
return $model->toArray(); return $model->toArray();
})->toArray(); })->toArray();
@ -70,6 +54,7 @@ class DatabaseStorageDriver implements StorageDriver
public function get(string $uuid, string $key) public function get(string $uuid, string $key)
{ {
$tenant = Tenant::find($uuid); $tenant = Tenant::find($uuid);
return $tenant->$key ?? json_decode($tenant->data)[$key] ?? null; 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 $tenant_data = null; // cache - json_decode() can be expensive
$get_from_tenant_data = function ($key) use ($tenant, &$tenant_data) { $get_from_tenant_data = function ($key) use ($tenant, &$tenant_data) {
$tenant_data = $tenant_data ?? json_decode($tenant->data); $tenant_data = $tenant_data ?? json_decode($tenant->data);
return $tenant_data[$key] ?? null; return $tenant_data[$key] ?? null;
}; };
return array_reduce($keys, function ($keys, $key) use ($tenant, $get_from_tenant_data) { return array_reduce($keys, function ($keys, $key) use ($tenant, $get_from_tenant_data) {
$keys[$key] = $tenant->$key ?? $get_from_tenant_data($key) ?? null; $keys[$key] = $tenant->$key ?? $get_from_tenant_data($key) ?? null;
return $keys; return $keys;
}, []); }, []);
} }
public function put(string $uuid, string $key, $value) 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 public function putMany(string $uuid, array $values): array
{ {
// todo foreach ($values as $key => $value) {
// $this->redis->hmset("tenants:$uuid", $values); Tenant::find($uuid)->put($key, $value);
}
return $values; return $values;
} }

View file

@ -6,20 +6,21 @@ use Illuminate\Database\Eloquent\Model;
class Tenant extends Model class Tenant extends Model
{ {
public function getDataColumn() protected $dataColumn = 'data';
{ protected $specialColumns = [];
return 'data'; protected $guarded = [];
}
public function put(string $key, $value) 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]); $this->update([$key => $value]);
} else { } else {
$obj = json_decode($this->{$this->getDataColumn()}); $obj = json_decode($this->{$this->dataColumn});
$obj->$key = $value; $obj->$key = $value;
$this->update([$this->getDataColumn() => json_encode($obj)]); $this->update([$this->getDataColumn() => json_encode($obj)]);
} }
return $value;
} }
} }