1
0
Fork 0
mirror of https://github.com/archtechx/tenancy.git synced 2025-12-12 18:44:03 +00:00

[2.2.0] Timestamps (#213)

* Timestamps

* Apply fixes from StyleCI

* Add void typehint

* wip

* Fix tests

* Apply fixes from StyleCI
This commit is contained in:
Samuel Štancl 2019-11-04 17:56:08 +01:00 committed by GitHub
parent b0c8e92bb4
commit 31c9930c93
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 124 additions and 4 deletions

View file

@ -82,6 +82,7 @@ return [
// not needed for tenancy to be bootstrapped. They are run // not needed for tenancy to be bootstrapped. They are run
// regardless of whether tenancy has been initialized. // regardless of whether tenancy has been initialized.
// Stancl\Tenancy\Features\Timestamps::class,
// Stancl\Tenancy\Features\TenantConfig::class, // Stancl\Tenancy\Features\TenantConfig::class,
// Stancl\Tenancy\Features\TelescopeTags::class, // Stancl\Tenancy\Features\TelescopeTags::class,
// Stancl\Tenancy\Features\TenantRedirect::class, // Stancl\Tenancy\Features\TenantRedirect::class,

View file

@ -0,0 +1,46 @@
<?php
declare(strict_types=1);
namespace Stancl\Tenancy\Features;
use Illuminate\Config\Repository;
use Illuminate\Support\Facades\Date;
use Stancl\Tenancy\Contracts\Feature;
use Stancl\Tenancy\Tenant;
use Stancl\Tenancy\TenantManager;
class Timestamps implements Feature
{
/** @var Repository */
protected $config;
public function __construct(Repository $config)
{
$this->config = $config;
}
public function bootstrap(TenantManager $tenantManager): void
{
$tenantManager->hook('tenant.creating', function ($tm, Tenant $tenant) {
$tenant->with('created_at', $this->now());
$tenant->with('updated_at', $this->now());
});
$tenantManager->hook('tenant.updating', function ($tm, Tenant $tenant) {
$tenant->with('updated_at', $this->now());
});
$tenantManager->hook('tenant.softDeleting', function ($tm, Tenant $tenant) {
$tenant->with('deleted_at', $this->now());
});
}
public function now(): string
{
// Add this key to your tenancy.php config if you need to change the format.
return Date::now()->format(
$this->config->get('tenancy.features.timestamps.format') ?? 'c' // ISO 8601
);
}
}

View file

@ -260,10 +260,16 @@ class Tenant implements ArrayAccess
*/ */
public function softDelete(): self public function softDelete(): self
{ {
$this->put('_tenancy_original_domains', $this->domains); $this->manager->event('tenant.softDeleting', $this);
$this->put([
'_tenancy_original_domains' => $this->domains,
]);
$this->clearDomains(); $this->clearDomains();
$this->save(); $this->save();
$this->manager->event('tenant.softDeleted', $this);
return $this; return $this;
} }
@ -328,6 +334,8 @@ class Tenant implements ArrayAccess
*/ */
public function put($key, $value = null): self public function put($key, $value = null): self
{ {
$this->manager->event('tenant.updating', $this);
if ($key === 'id') { if ($key === 'id') {
throw new TenantStorageException("Tenant ids can't be changed."); throw new TenantStorageException("Tenant ids can't be changed.");
} }
@ -348,6 +356,8 @@ class Tenant implements ArrayAccess
$this->data[$key] = $value; $this->data[$key] = $value;
} }
$this->manager->event('tenant.updated', $this);
return $this; return $this;
} }
@ -376,6 +386,8 @@ class Tenant implements ArrayAccess
*/ */
public function deleteKeys(array $keys): self public function deleteKeys(array $keys): self
{ {
$this->manager->event('tenant.updating', $this);
if (! $this->storage instanceof CanDeleteKeys) { if (! $this->storage instanceof CanDeleteKeys) {
throw new NotImplementedException(get_class($this->storage), 'deleteMany', throw new NotImplementedException(get_class($this->storage), 'deleteMany',
'This method was added to storage drivers provided by the package in 2.2.0 and will be part of the StorageDriver contract in 3.0.0.' 'This method was added to storage drivers provided by the package in 2.2.0 and will be part of the StorageDriver contract in 3.0.0.'
@ -387,11 +399,13 @@ class Tenant implements ArrayAccess
} }
} }
$this->manager->event('tenant.updated', $this);
return $this; return $this;
} }
/** /**
* Set a value. * Set a value in the data array without saving into storage.
* *
* @param string $key * @param string $key
* @param mixed $value * @param mixed $value

View file

@ -2,7 +2,9 @@
declare(strict_types=1); declare(strict_types=1);
namespace Stancl\Tenancy\Tests; namespace Stancl\Tenancy\Tests\Feature;
use Stancl\Tenancy\Tests\TestCase;
class TenantConfigTest extends TestCase class TenantConfigTest extends TestCase
{ {

View file

@ -2,10 +2,11 @@
declare(strict_types=1); declare(strict_types=1);
namespace Stancl\Tenancy\Tests; namespace Stancl\Tenancy\Tests\Feature;
use Route; use Route;
use Stancl\Tenancy\Tenant; use Stancl\Tenancy\Tenant;
use Stancl\Tenancy\Tests\TestCase;
class TenantRedirectMacroTest extends TestCase class TenantRedirectMacroTest extends TestCase
{ {

View file

@ -0,0 +1,56 @@
<?php
declare(strict_types=1);
namespace Stancl\Tenancy\Tests\Feature;
use Stancl\Tenancy\Features\Timestamps;
use Stancl\Tenancy\Tenant;
use Stancl\Tenancy\Tests\TestCase;
class TimestampTest extends TestCase
{
public $autoCreateTenant = false;
public $autoInitTenancy = false;
public function setUp(): void
{
parent::setUp();
config(['tenancy.features' => [
Timestamps::class,
]]);
}
/** @test */
public function create_and_update_timestamps_are_added_on_create()
{
$tenant = Tenant::new()->save();
$this->assertArrayHasKey('created_at', $tenant->data);
$this->assertArrayHasKey('updated_at', $tenant->data);
}
/** @test */
public function update_timestamps_are_added()
{
$tenant = Tenant::new()->save();
$this->assertSame($tenant->created_at, $tenant->updated_at);
$this->assertSame('string', gettype($tenant->created_at));
sleep(1);
$tenant->put('abc', 'def');
$this->assertTrue($tenant->updated_at > $tenant->created_at);
}
/** @test */
public function softdelete_timestamps_are_added()
{
$tenant = Tenant::new()->save();
$this->assertNull($tenant->deleted_at);
$tenant->softDelete();
$this->assertNotNull($tenant->deleted_at);
}
}