From 64383b4c5615b9652dc7cbc4c429b121d254b291 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samuel=20=C5=A0tancl?= Date: Tue, 12 May 2020 03:32:28 +0200 Subject: [PATCH] Refactor DB config & Tenant DB managers --- .../ModifiesDatabaseNameForConnection.php | 13 ------------- src/Contracts/TenantDatabaseManager.php | 16 +++++++++------- src/DatabaseConfig.php | 14 +++----------- .../MySQLDatabaseManager.php | 7 +++++++ .../PermissionControlledMySQLDatabaseManager.php | 7 +++++++ .../PostgreSQLDatabaseManager.php | 13 ++++++++++--- .../PostgreSQLSchemaManager.php | 13 ++++++++++--- .../SQLiteDatabaseManager.php | 9 +++++---- 8 files changed, 51 insertions(+), 41 deletions(-) delete mode 100644 src/Contracts/ModifiesDatabaseNameForConnection.php diff --git a/src/Contracts/ModifiesDatabaseNameForConnection.php b/src/Contracts/ModifiesDatabaseNameForConnection.php deleted file mode 100644 index 713aa3be..00000000 --- a/src/Contracts/ModifiesDatabaseNameForConnection.php +++ /dev/null @@ -1,13 +0,0 @@ -getTemplateConnectionName(); - $templateConnection = config("database.connections.{$template}"); - // todo move a lot of this logic to the tenant DB manager so that we dont have to deal with the separators & modifying DB names here - $databaseName = $this->getName(); - if (($manager = $this->manager()) instanceof ModifiesDatabaseNameForConnection) { - /** @var ModifiesDatabaseNameForConnection $manager */ - $databaseName = $manager->getDatabaseNameForConnection($databaseName); - } - - return array_merge($templateConnection, $this->tenantConfig(), [ - $this->manager()->getSeparator() => $databaseName, - ]); + return $this->manager()->makeConnectionConfig( + array_merge($templateConnection, $this->tenantConfig()), $this->getName() + ); } /** diff --git a/src/TenantDatabaseManagers/MySQLDatabaseManager.php b/src/TenantDatabaseManagers/MySQLDatabaseManager.php index 569e280c..2c920f43 100644 --- a/src/TenantDatabaseManagers/MySQLDatabaseManager.php +++ b/src/TenantDatabaseManagers/MySQLDatabaseManager.php @@ -54,4 +54,11 @@ class MySQLDatabaseManager implements TenantDatabaseManager, CanSetConnection { return (bool) $this->database()->select("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$name'"); } + + public function makeConnectionConfig(array $baseConfig, string $databaseName): array + { + $baseConfig['database'] = $databaseName; + + return $baseConfig; + } } diff --git a/src/TenantDatabaseManagers/PermissionControlledMySQLDatabaseManager.php b/src/TenantDatabaseManagers/PermissionControlledMySQLDatabaseManager.php index 3ce51568..7a247c6c 100644 --- a/src/TenantDatabaseManagers/PermissionControlledMySQLDatabaseManager.php +++ b/src/TenantDatabaseManagers/PermissionControlledMySQLDatabaseManager.php @@ -59,4 +59,11 @@ class PermissionControlledMySQLDatabaseManager extends MySQLDatabaseManager impl { return (bool) $this->database()->select("SELECT count(*) FROM mysql.user WHERE user = '$username'")[0]->{'count(*)'}; } + + public function makeConnectionConfig(array $baseConfig, string $databaseName): array + { + $baseConfig['database'] = $databaseName; + + return $baseConfig; + } } diff --git a/src/TenantDatabaseManagers/PostgreSQLDatabaseManager.php b/src/TenantDatabaseManagers/PostgreSQLDatabaseManager.php index f189e232..d9b5534a 100644 --- a/src/TenantDatabaseManagers/PostgreSQLDatabaseManager.php +++ b/src/TenantDatabaseManagers/PostgreSQLDatabaseManager.php @@ -9,7 +9,7 @@ use Illuminate\Database\Connection; use Illuminate\Support\Facades\DB; use Stancl\Tenancy\Contracts\Future\CanSetConnection; use Stancl\Tenancy\Contracts\TenantDatabaseManager; -use Stancl\Tenancy\Tenant; +use Stancl\Tenancy\Contracts\TenantWithDatabase; class PostgreSQLDatabaseManager implements TenantDatabaseManager, CanSetConnection { @@ -36,12 +36,12 @@ class PostgreSQLDatabaseManager implements TenantDatabaseManager, CanSetConnecti $this->connection = $connection; } - public function createDatabase(Tenant $tenant): bool + public function createDatabase(TenantWithDatabase $tenant): bool { return $this->database()->statement("CREATE DATABASE \"{$tenant->database()->getName()}\" WITH TEMPLATE=template0"); } - public function deleteDatabase(Tenant $tenant): bool + public function deleteDatabase(TenantWithDatabase $tenant): bool { return $this->database()->statement("DROP DATABASE \"{$tenant->database()->getName()}\""); } @@ -50,4 +50,11 @@ class PostgreSQLDatabaseManager implements TenantDatabaseManager, CanSetConnecti { return (bool) $this->database()->select("SELECT datname FROM pg_database WHERE datname = '$name'"); } + + public function makeConnectionConfig(array $baseConfig, string $databaseName): array + { + $baseConfig['database'] = $databaseName; + + return $baseConfig; + } } diff --git a/src/TenantDatabaseManagers/PostgreSQLSchemaManager.php b/src/TenantDatabaseManagers/PostgreSQLSchemaManager.php index 819daf09..3463ca5d 100644 --- a/src/TenantDatabaseManagers/PostgreSQLSchemaManager.php +++ b/src/TenantDatabaseManagers/PostgreSQLSchemaManager.php @@ -9,7 +9,7 @@ use Illuminate\Database\Connection; use Illuminate\Support\Facades\DB; use Stancl\Tenancy\Contracts\Future\CanSetConnection; use Stancl\Tenancy\Contracts\TenantDatabaseManager; -use Stancl\Tenancy\Tenant; +use Stancl\Tenancy\Contracts\TenantWithDatabase; class PostgreSQLSchemaManager implements TenantDatabaseManager, CanSetConnection { @@ -36,12 +36,12 @@ class PostgreSQLSchemaManager implements TenantDatabaseManager, CanSetConnection $this->connection = $connection; } - public function createDatabase(Tenant $tenant): bool + public function createDatabase(TenantWithDatabase $tenant): bool { return $this->database()->statement("CREATE SCHEMA \"{$tenant->database()->getName()}\""); } - public function deleteDatabase(Tenant $tenant): bool + public function deleteDatabase(TenantWithDatabase $tenant): bool { return $this->database()->statement("DROP SCHEMA \"{$tenant->database()->getName()}\""); } @@ -50,4 +50,11 @@ class PostgreSQLSchemaManager implements TenantDatabaseManager, CanSetConnection { return (bool) $this->database()->select("SELECT schema_name FROM information_schema.schemata WHERE schema_name = '$name'"); } + + public function makeConnectionConfig(array $baseConfig, string $databaseName): array + { + $baseConfig['schema'] = $databaseName; + + return $baseConfig; + } } diff --git a/src/TenantDatabaseManagers/SQLiteDatabaseManager.php b/src/TenantDatabaseManagers/SQLiteDatabaseManager.php index f3c110d5..8a7e445a 100644 --- a/src/TenantDatabaseManagers/SQLiteDatabaseManager.php +++ b/src/TenantDatabaseManagers/SQLiteDatabaseManager.php @@ -4,11 +4,10 @@ declare(strict_types=1); namespace Stancl\Tenancy\TenantDatabaseManagers; -use Stancl\Tenancy\Contracts\ModifiesDatabaseNameForConnection; use Stancl\Tenancy\Contracts\TenantDatabaseManager; use Stancl\Tenancy\Contracts\TenantWithDatabase; -class SQLiteDatabaseManager implements TenantDatabaseManager, ModifiesDatabaseNameForConnection +class SQLiteDatabaseManager implements TenantDatabaseManager { public function getSeparator(): string { @@ -38,8 +37,10 @@ class SQLiteDatabaseManager implements TenantDatabaseManager, ModifiesDatabaseNa return file_exists(database_path($name)); } - public function getDatabaseNameForConnection(string $original): string + public function makeConnectionConfig(array $baseConfig, string $databaseName): array { - return database_path($original); + $baseConfig['database'] = database_path($databaseName);; + + return $baseConfig; } }