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

Fix transactions

This commit is contained in:
Samuel Štancl 2019-09-21 13:54:02 +02:00
parent 46609c5b0d
commit c475e7a43d
11 changed files with 47 additions and 27 deletions

View file

@ -56,7 +56,7 @@ class Migrate extends MigrateCommand
// See Illuminate\Database\Migrations\DatabaseMigrationRepository::getConnection. // See Illuminate\Database\Migrations\DatabaseMigrationRepository::getConnection.
// Database connections are cached by Illuminate\Database\ConnectionResolver. // Database connections are cached by Illuminate\Database\ConnectionResolver.
$this->input->setOption('database', 'tenant'); $this->input->setOption('database', 'tenant');
tenancy()->initialize($tenant); // todo3 test that this works with multiple tenants with MySQL tenancy()->initialize($tenant); // todo2 test that this works with multiple tenants with MySQL
// Migrate // Migrate
parent::handle(); parent::handle();

View file

@ -4,8 +4,10 @@ declare(strict_types=1);
namespace Stancl\Tenancy; namespace Stancl\Tenancy;
use Illuminate\Database\Connection;
use Illuminate\Database\DatabaseManager as BaseDatabaseManager; use Illuminate\Database\DatabaseManager as BaseDatabaseManager;
use Illuminate\Foundation\Application; use Illuminate\Foundation\Application;
use Illuminate\Support\Facades\DB;
use Stancl\Tenancy\Contracts\TenantDatabaseManager; use Stancl\Tenancy\Contracts\TenantDatabaseManager;
use Stancl\Tenancy\Exceptions\DatabaseManagerNotRegisteredException; use Stancl\Tenancy\Exceptions\DatabaseManagerNotRegisteredException;
use Stancl\Tenancy\Exceptions\TenantDatabaseAlreadyExistsException; use Stancl\Tenancy\Exceptions\TenantDatabaseAlreadyExistsException;
@ -176,4 +178,19 @@ class DatabaseManager
return $this->app[$databaseManagers[$driver]]; return $this->app[$databaseManagers[$driver]];
} }
/**
* Get the central database connection.
*
* @return \Illuminate\Database\Connection
*/
public function getCentralConnection(): \Illuminate\Database\Connection
{
return DB::connection($this->getCentralConnectionName());
}
public function getCentralConnectionName(): string
{
return $this->app['config']['tenancy.storage.db.connection'] ?? $this->originalDefaultConnectionName;
}
} }

View file

@ -26,7 +26,6 @@ class TelescopeTags implements Feature
if (in_array('tenancy', optional(request()->route())->middleware() ?? [])) { if (in_array('tenancy', optional(request()->route())->middleware() ?? [])) {
$tags = array_merge($tags, [ $tags = array_merge($tags, [
'tenant:' . tenant('id'), 'tenant:' . tenant('id'),
// todo3 domain?
]); ]);
} }

View file

@ -0,0 +1,13 @@
<?php
namespace Stancl\Tenancy\StorageDrivers\Database;
use Stancl\Tenancy\DatabaseManager;
trait CentralConnection
{
public function getConnectionName()
{
return app(DatabaseManager::class)->getCentralConnectionName();
}
}

View file

@ -5,8 +5,8 @@ declare(strict_types=1);
namespace Stancl\Tenancy\StorageDrivers\Database; namespace Stancl\Tenancy\StorageDrivers\Database;
use Illuminate\Foundation\Application; use Illuminate\Foundation\Application;
use Illuminate\Support\Facades\DB;
use Stancl\Tenancy\Contracts\StorageDriver; use Stancl\Tenancy\Contracts\StorageDriver;
use Stancl\Tenancy\DatabaseManager;
use Stancl\Tenancy\Exceptions\DomainsOccupiedByOtherTenantException; use Stancl\Tenancy\Exceptions\DomainsOccupiedByOtherTenantException;
use Stancl\Tenancy\Exceptions\TenantCouldNotBeIdentifiedException; use Stancl\Tenancy\Exceptions\TenantCouldNotBeIdentifiedException;
use Stancl\Tenancy\Exceptions\TenantWithThisIdAlreadyExistsException; use Stancl\Tenancy\Exceptions\TenantWithThisIdAlreadyExistsException;
@ -16,17 +16,19 @@ use Stancl\Tenancy\Tenant;
class DatabaseStorageDriver implements StorageDriver class DatabaseStorageDriver implements StorageDriver
{ {
// todo4 write tests verifying that data is decoded and added to the array
/** @var Application */ /** @var Application */
protected $app; protected $app;
/** @var \Illuminate\Database\Connection */
protected $centralDatabase;
/** @var Tenant The default tenant. */ /** @var Tenant The default tenant. */
protected $tenant; protected $tenant;
public function __construct(Application $app) public function __construct(Application $app)
{ {
$this->app = $app; $this->app = $app;
$this->centralDatabase = $app->make(DatabaseManager::class)->getCentralConnection();
} }
public function findByDomain(string $domain): Tenant public function findByDomain(string $domain): Tenant
@ -77,7 +79,7 @@ class DatabaseStorageDriver implements StorageDriver
public function createTenant(Tenant $tenant): void public function createTenant(Tenant $tenant): void
{ {
DB::transaction(function () use ($tenant) { $this->centralDatabase->transaction(function () use ($tenant) {
Tenants::create(['id' => $tenant->id, 'data' => '{}'])->toArray(); Tenants::create(['id' => $tenant->id, 'data' => '{}'])->toArray();
$domainData = []; $domainData = [];
@ -90,7 +92,7 @@ class DatabaseStorageDriver implements StorageDriver
public function updateTenant(Tenant $tenant): void public function updateTenant(Tenant $tenant): void
{ {
DB::transaction(function () use ($tenant) { $this->centralDatabase->transaction(function () use ($tenant) {
Tenants::find($tenant->id)->putMany($tenant->data); Tenants::find($tenant->id)->putMany($tenant->data);
$original_domains = Domains::where('tenant_id', $tenant->id)->get()->map(function ($model) { $original_domains = Domains::where('tenant_id', $tenant->id)->get()->map(function ($model) {
@ -111,7 +113,7 @@ class DatabaseStorageDriver implements StorageDriver
public function deleteTenant(Tenant $tenant): void public function deleteTenant(Tenant $tenant): void
{ {
DB::transacton(function () use ($tenant) { $this->centralDatabase->transaction(function () use ($tenant) {
Tenants::find($tenant->id)->delete(); Tenants::find($tenant->id)->delete();
Domains::where('tenant_id', $tenant->id)->delete(); Domains::where('tenant_id', $tenant->id)->delete();
}); });

View file

@ -5,13 +5,14 @@ declare(strict_types=1);
namespace Stancl\Tenancy\StorageDrivers\Database; namespace Stancl\Tenancy\StorageDrivers\Database;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Stancl\Tenancy\DatabaseManager;
/** /**
* @internal Class is subject to breaking changes in minor and patch versions. * @internal Class is subject to breaking changes in minor and patch versions.
*/ */
class DomainModel extends Model class DomainModel extends Model
{ {
use CentralConnection;
protected $guarded = []; protected $guarded = [];
protected $primaryKey = 'id'; protected $primaryKey = 'id';
public $incrementing = false; public $incrementing = false;
@ -21,9 +22,4 @@ class DomainModel extends Model
{ {
return config('tenancy.storage.db.table_names.DomainModel', 'domains'); return config('tenancy.storage.db.table_names.DomainModel', 'domains');
} }
public function getConnectionName()
{
return config('tenancy.storage.db.connection') ?? app(DatabaseManager::class)->originalDefaultConnectionName;
}
} }

View file

@ -5,13 +5,14 @@ declare(strict_types=1);
namespace Stancl\Tenancy\StorageDrivers\Database; namespace Stancl\Tenancy\StorageDrivers\Database;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Stancl\Tenancy\DatabaseManager;
/** /**
* @internal Class is subject to breaking changes in minor and patch versions. * @internal Class is subject to breaking changes in minor and patch versions.
*/ */
class TenantModel extends Model class TenantModel extends Model
{ {
use CentralConnection;
protected $guarded = []; protected $guarded = [];
protected $primaryKey = 'id'; protected $primaryKey = 'id';
public $incrementing = false; public $incrementing = false;
@ -32,11 +33,6 @@ class TenantModel extends Model
return config('tenancy.storage.db.custom_columns', []); return config('tenancy.storage.db.custom_columns', []);
} }
public function getConnectionName()
{
return config('tenancy.storage.db.connection') ?? app(DatabaseManager::class)->originalDefaultConnectionName;
}
public static function getAllTenants(array $ids) public static function getAllTenants(array $ids)
{ {
$tenants = $ids ? static::findMany($ids) : static::all(); $tenants = $ids ? static::findMany($ids) : static::all();

View file

@ -50,7 +50,6 @@ class QueueTenancyBootstrapper implements TenancyBootstrapper
'tenant_id' => $id, 'tenant_id' => $id,
'tags' => [ 'tags' => [
"tenant:$id", "tenant:$id",
// todo3 domain
], ],
]; ];
} }

View file

@ -17,7 +17,7 @@ class QueueTest extends TestCase
/** @test */ /** @test */
public function queues_use_non_tenant_db_connection() public function queues_use_non_tenant_db_connection()
{ {
// todo2 finish this test. requires using the db driver // requires using the db driver
$this->markTestIncomplete(); $this->markTestIncomplete();
} }

View file

@ -15,14 +15,13 @@ class TenantAssetTest extends TestCase
// response()->file() returns BinaryFileResponse whose content is // response()->file() returns BinaryFileResponse whose content is
// inaccessible via getContent, so ->assertSee() can't be used // inaccessible via getContent, so ->assertSee() can't be used
// $this->get(tenant_asset($filename))->assertSuccessful(); // todo2 commented assertions $this->get(tenant_asset($filename))->assertSuccessful();
// $this->assertFileExists($path); // todo2 commented assertions $this->assertFileExists($path);
$f = fopen($path, 'r'); $f = fopen($path, 'r');
$content = fread($f, filesize($path)); $content = fread($f, filesize($path));
fclose($f); fclose($f);
// $this->assertSame('bar', $content); // todo2 commented assertions $this->assertSame('bar', $content);
$this->assertTrue(true);
} }
} }

View file

@ -17,7 +17,6 @@ class TenantClassTest extends TestCase
/** @test */ /** @test */
public function data_cache_works_properly() public function data_cache_works_properly()
{ {
// todo constructor dependencies
// $spy = Mockery::spy(config('tenancy.storage_driver'))->makePartial(); // $spy = Mockery::spy(config('tenancy.storage_driver'))->makePartial();
// $this->instance(StorageDriver::class, $spy); // $this->instance(StorageDriver::class, $spy);