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:
parent
b0c8e92bb4
commit
31c9930c93
6 changed files with 124 additions and 4 deletions
|
|
@ -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,
|
||||||
|
|
|
||||||
46
src/Features/Timestamps.php
Normal file
46
src/Features/Timestamps.php
Normal 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
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
@ -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
|
||||||
{
|
{
|
||||||
56
tests/Features/TimestampTest.php
Normal file
56
tests/Features/TimestampTest.php
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue