From e5cf5c0f82911cafa92b93370bfbc0920d1ec958 Mon Sep 17 00:00:00 2001 From: Abrar Ahmad Date: Wed, 26 Oct 2022 12:41:40 +0500 Subject: [PATCH] replace hostManager with manager --- src/Database/DatabaseConfig.php | 59 ++++++++++++++--------------- src/Database/DatabaseManager.php | 2 +- src/Jobs/CreateDatabase.php | 2 +- src/Jobs/DeleteDatabase.php | 2 +- tests/TenantDatabaseManagerTest.php | 2 +- 5 files changed, 32 insertions(+), 35 deletions(-) diff --git a/src/Database/DatabaseConfig.php b/src/Database/DatabaseConfig.php index fe146694..c448aa3a 100644 --- a/src/Database/DatabaseConfig.php +++ b/src/Database/DatabaseConfig.php @@ -11,6 +11,8 @@ use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Str; use Stancl\Tenancy\Database\Contracts\TenantWithDatabase as Tenant; +use Stancl\Tenancy\Database\Exceptions\DatabaseManagerNotRegisteredException; +use Stancl\Tenancy\Database\Exceptions\NoConnectionSetException; class DatabaseConfig { @@ -85,7 +87,7 @@ class DatabaseConfig { $this->tenant->setInternal('db_name', $this->getName()); - if ($this->manager() instanceof Contracts\ManagesDatabaseUsers) { + if ($this->getManagerClassFromConnectionDriver($this->getTemplateConnectionName()) instanceof Contracts\ManagesDatabaseUsers) { $this->tenant->setInternal('db_username', $this->getUsername() ?? (static::$usernameGenerator)($this->tenant)); $this->tenant->setInternal('db_password', $this->getPassword() ?? (static::$passwordGenerator)($this->tenant)); } @@ -130,7 +132,7 @@ class DatabaseConfig $template = $this->getTemplateConnectionName(); $templateConnection = config("database.connections.{$template}"); - if ($this->manager() instanceof Contracts\ManagesDatabaseUsers) { + if ($this->getManagerClassFromConnectionDriver($template) instanceof Contracts\ManagesDatabaseUsers) { // We're removing the username and password because user with these credentials is not created yet // If you need to provide username and password when using PermissionControlledMySQLDatabaseManager, // consider creating a new connection and use it as `tenancy_db_connection` tenant config key @@ -181,29 +183,11 @@ class DatabaseConfig }, []); } - /** Get the TenantDatabaseManager for this tenant's connection. */ + /** Get the TenantDatabaseManager for this tenant's connection. + * + * @throws NoConnectionSetException|DatabaseManagerNotRegisteredException + */ public function manager(): Contracts\TenantDatabaseManager - { - $driver = config("database.connections.{$this->getTemplateConnectionName()}.driver"); - - $databaseManagers = config('tenancy.database.managers'); - - if (! array_key_exists($driver, $databaseManagers)) { - throw new Exceptions\DatabaseManagerNotRegisteredException($driver); - } - - /** @var Contracts\TenantDatabaseManager $databaseManager */ - $databaseManager = app($databaseManagers[$driver]); - - if ($databaseManager instanceof Contracts\StatefulTenantDatabaseManager) { - $databaseManager->setConnection($this->getTemplateConnectionName()); - } - - return $databaseManager; - } - - /** Get the TenantDatabaseManager for this tenant's connection. */ - public function hostManager(): Contracts\TenantDatabaseManager { // Laravel caches the previous PDO connection, so we purge it to be able to change the connection details $this->purgeHostConnection(); // todo come up with a better name @@ -212,18 +196,31 @@ class DatabaseConfig $tenantHostConnectionName = $this->getTenantHostConnectionName(); config(["database.connections.{$tenantHostConnectionName}" => $this->hostConnection()]); - $driver = config("database.connections.{$tenantHostConnectionName}.driver"); + $manager = $this->getManagerClassFromConnectionDriver($tenantHostConnectionName); + + if ($manager instanceof Contracts\StatefulTenantDatabaseManager) { + $manager->setConnection($tenantHostConnectionName); + } + + return $manager; + } + + /** + * todo come up with a better name + * Get database manager class from the given connection config's driver. + * + * @throws DatabaseManagerNotRegisteredException + */ + protected function getManagerClassFromConnectionDriver(string $connectionName): Contracts\TenantDatabaseManager + { + $driver = config("database.connections.{$connectionName}.driver"); + $databaseManagers = config('tenancy.database.managers'); if (! array_key_exists($driver, $databaseManagers)) { throw new Exceptions\DatabaseManagerNotRegisteredException($driver); } - /** @var Contracts\TenantDatabaseManager $databaseManager */ - $databaseManager = app($databaseManagers[$driver]); - - $databaseManager->setConnection($tenantHostConnectionName); - - return $databaseManager; + return app($databaseManagers[$driver]); } } diff --git a/src/Database/DatabaseManager.php b/src/Database/DatabaseManager.php index 0366fda5..ce9219d5 100644 --- a/src/Database/DatabaseManager.php +++ b/src/Database/DatabaseManager.php @@ -69,7 +69,7 @@ class DatabaseManager */ public function ensureTenantCanBeCreated(TenantWithDatabase $tenant): void { - $manager = $tenant->database()->hostManager(); + $manager = $tenant->database()->manager(); if ($manager->databaseExists($database = $tenant->database()->getName())) { throw new Exceptions\TenantDatabaseAlreadyExistsException($database); diff --git a/src/Jobs/CreateDatabase.php b/src/Jobs/CreateDatabase.php index e7d91b0a..dbc4b097 100644 --- a/src/Jobs/CreateDatabase.php +++ b/src/Jobs/CreateDatabase.php @@ -35,7 +35,7 @@ class CreateDatabase implements ShouldQueue $this->tenant->database()->makeCredentials(); $databaseManager->ensureTenantCanBeCreated($this->tenant); - $this->tenant->database()->hostManager()->createDatabase($this->tenant); + $this->tenant->database()->manager()->createDatabase($this->tenant); event(new DatabaseCreated($this->tenant)); diff --git a/src/Jobs/DeleteDatabase.php b/src/Jobs/DeleteDatabase.php index d6acd99e..71358f74 100644 --- a/src/Jobs/DeleteDatabase.php +++ b/src/Jobs/DeleteDatabase.php @@ -27,7 +27,7 @@ class DeleteDatabase implements ShouldQueue { event(new DeletingDatabase($this->tenant)); - $this->tenant->database()->hostManager()->deleteDatabase($this->tenant); + $this->tenant->database()->manager()->deleteDatabase($this->tenant); event(new DatabaseDeleted($this->tenant)); } diff --git a/tests/TenantDatabaseManagerTest.php b/tests/TenantDatabaseManagerTest.php index 1da10151..a8fa668a 100644 --- a/tests/TenantDatabaseManagerTest.php +++ b/tests/TenantDatabaseManagerTest.php @@ -362,7 +362,7 @@ test('tenant database can be created by using the username and password from ten ]); /** @var MySQLDatabaseManager $manager */ - $manager = $tenant->database()->hostManager(); + $manager = $tenant->database()->manager(); expect($manager->database()->getConfig('username'))->toBe($username); // user created for the HOST connection expect($manager->databaseExists($name))->toBeTrue();