1
0
Fork 0
mirror of https://github.com/archtechx/tenancy.git synced 2026-02-04 17: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;
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;
}

View file

@ -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;
}
}