diff --git a/src/Contracts/TenantDatabaseManager.php b/src/Contracts/TenantDatabaseManager.php index 8439894d..5e5bc696 100644 --- a/src/Contracts/TenantDatabaseManager.php +++ b/src/Contracts/TenantDatabaseManager.php @@ -21,4 +21,12 @@ interface TenantDatabaseManager * @return bool */ public function deleteDatabase(string $name): bool; + + /** + * Does a database exist. + * + * @param string $name + * @return boolean + */ + public function databaseExists(string $name): bool; } diff --git a/src/DatabaseManagerv2.php b/src/DatabaseManagerv2.php index 79532121..bd437053 100644 --- a/src/DatabaseManagerv2.php +++ b/src/DatabaseManagerv2.php @@ -8,6 +8,7 @@ use Illuminate\Foundation\Application; use Stancl\Tenancy\Jobs\QueuedTenantDatabaseCreator; use Illuminate\Database\DatabaseManager as BaseDatabaseManager; use Stancl\Tenancy\Exceptions\DatabaseManagerNotRegisteredException; +use Stancl\Tenancy\Exceptions\TenantDatabaseAlreadyExistsException; class DatabaseManagerv2 { @@ -95,7 +96,11 @@ class DatabaseManagerv2 */ public function canCreate(Tenant $tenant) { - // todo + if ($this->getTenantDatabaseManager($tenant)->databaseExists($database = $tenant->getDatabaseName())) { + return new TenantDatabaseAlreadyExistsException($database); + } + + return true; } public function createDatabase(Tenant $tenant) @@ -129,7 +134,7 @@ class DatabaseManagerv2 $databaseManagers = $this->app['config']['tenancy.database_managers']; - if (! \array_key_exists($driver, $databaseManagers)) { + if (! array_key_exists($driver, $databaseManagers)) { throw new DatabaseManagerNotRegisteredException($driver); } diff --git a/src/Exceptions/TenantDatabaseAlreadyExistsException.php b/src/Exceptions/TenantDatabaseAlreadyExistsException.php new file mode 100644 index 00000000..f42fdc63 --- /dev/null +++ b/src/Exceptions/TenantDatabaseAlreadyExistsException.php @@ -0,0 +1,23 @@ +database} already exists."; + } + + public function __construct(string $database) + { + parent::__construct(); + + $this->database = $database; + } +} \ No newline at end of file diff --git a/src/TenantDatabaseManagers/MySQLDatabaseManager.php b/src/TenantDatabaseManagers/MySQLDatabaseManager.php index e1f79dd7..f68a7771 100644 --- a/src/TenantDatabaseManagers/MySQLDatabaseManager.php +++ b/src/TenantDatabaseManagers/MySQLDatabaseManager.php @@ -5,7 +5,7 @@ declare(strict_types=1); namespace Stancl\Tenancy\TenantDatabaseManagers; use Illuminate\Support\Facades\DB; -use Stancl\Tenancy\Interfaces\TenantDatabaseManager; +use Stancl\Tenancy\Contracts\TenantDatabaseManager; class MySQLDatabaseManager implements TenantDatabaseManager { @@ -18,4 +18,9 @@ class MySQLDatabaseManager implements TenantDatabaseManager { return DB::statement("DROP DATABASE `$name`"); } + + public function databaseExists(string $name): bool + { + return (bool) DB::select("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$name'"); + } } diff --git a/src/TenantDatabaseManagers/PostgreSQLDatabaseManager.php b/src/TenantDatabaseManagers/PostgreSQLDatabaseManager.php index 60a27395..6cb48124 100644 --- a/src/TenantDatabaseManagers/PostgreSQLDatabaseManager.php +++ b/src/TenantDatabaseManagers/PostgreSQLDatabaseManager.php @@ -5,7 +5,7 @@ declare(strict_types=1); namespace Stancl\Tenancy\TenantDatabaseManagers; use Illuminate\Support\Facades\DB; -use Stancl\Tenancy\Interfaces\TenantDatabaseManager; +use Stancl\Tenancy\Contracts\TenantDatabaseManager; class PostgreSQLDatabaseManager implements TenantDatabaseManager { @@ -18,4 +18,9 @@ class PostgreSQLDatabaseManager implements TenantDatabaseManager { return DB::statement("DROP DATABASE \"$name\""); } + + public function databaseExists(string $name): bool + { + return (bool) DB::select("SELECT datname FROM pg_database WHERE datname = '$name'"); + } } diff --git a/src/TenantDatabaseManagers/SQLiteDatabaseManager.php b/src/TenantDatabaseManagers/SQLiteDatabaseManager.php index 849e5692..5d681ded 100644 --- a/src/TenantDatabaseManagers/SQLiteDatabaseManager.php +++ b/src/TenantDatabaseManagers/SQLiteDatabaseManager.php @@ -4,14 +4,14 @@ declare(strict_types=1); namespace Stancl\Tenancy\TenantDatabaseManagers; -use Stancl\Tenancy\Interfaces\TenantDatabaseManager; +use Stancl\Tenancy\Contracts\TenantDatabaseManager; class SQLiteDatabaseManager implements TenantDatabaseManager { public function createDatabase(string $name): bool { try { - return \fclose(\fopen(database_path($name), 'w')); + return fclose(fopen(database_path($name), 'w')); } catch (\Throwable $th) { return false; } @@ -20,9 +20,14 @@ class SQLiteDatabaseManager implements TenantDatabaseManager public function deleteDatabase(string $name): bool { try { - return \unlink(database_path($name)); + return unlink(database_path($name)); } catch (\Throwable $th) { return false; } } + + public function databaseExists(string $name): bool + { + return file_exists(database_path($name)); + } } diff --git a/tests/TenantDatabaseManagerTest.php b/tests/TenantDatabaseManagerTest.php index 149b6dca..5b857e45 100644 --- a/tests/TenantDatabaseManagerTest.php +++ b/tests/TenantDatabaseManagerTest.php @@ -12,6 +12,8 @@ use Stancl\Tenancy\Jobs\QueuedTenantDatabaseDeleter; class TenantDatabaseManagerTest extends TestCase { + // todo use data providers and TenantDatabaseManager::databaseExists() + /** @test */ public function sqlite_database_can_be_created_and_deleted() {