diff --git a/src/DatabaseCreators/MySQLDatabaseCreator.php b/src/DatabaseCreators/MySQLDatabaseCreator.php deleted file mode 100644 index 745143d5..00000000 --- a/src/DatabaseCreators/MySQLDatabaseCreator.php +++ /dev/null @@ -1,14 +0,0 @@ -createTenantConnection($name); $driver = $driver ?: $this->getDriver(); - $databaseCreators = config('tenancy.database_creators'); + $databaseManagers = config('tenancy.database_managers'); - if (! array_key_exists($driver, $databaseCreators)) { - throw new \Exception("Database could not be created: no database creator for driver $driver is registered."); + if (! array_key_exists($driver, $databaseManagers)) { + throw new \Exception("Database could not be created: no database manager for driver $driver is registered."); } if (config('tenancy.queue_database_creation', false)) { - QueuedDatabaseCreator::dispatch(app($databaseCreators[$driver]), $name); + QueuedTenantDatabaseCreator::dispatch(app($databaseManagers[$driver]), $name, 'create'); } else { - app($databaseCreators[$driver])->createDatabase($name); + app($databaseManagers[$driver])->createDatabase($name); } } - public function delete() + public function delete(string $name, string $driver = null) { - // todo: delete database. similar to create() + $this->createTenantConnection($name); + $driver = $driver ?: $this->getDriver(); + + $databaseManagers = config('tenancy.database_managers'); + + if (! array_key_exists($driver, $databaseManagers)) { + throw new \Exception("Database could not be deleted: no database manager for driver $driver is registered."); + } + + if (config('tenancy.queue_database_deletion', false)) { + QueuedTenantDatabaseDeleter::dispatch(app($databaseManagers[$driver]), $name, 'delete'); + } else { + app($databaseManagers[$driver])->deleteDatabase($name); + } } public function getDriver(): ?string diff --git a/src/Interfaces/DatabaseCreator.php b/src/Interfaces/DatabaseCreator.php deleted file mode 100644 index 9b6fd52a..00000000 --- a/src/Interfaces/DatabaseCreator.php +++ /dev/null @@ -1,14 +0,0 @@ -databaseCreator = $databaseCreator; + $this->databaseManager = $databaseManager; $this->databaseName = $databaseName; } @@ -33,6 +37,6 @@ class QueuedDatabaseCreator implements ShouldQueue */ public function handle() { - $this->databaseCreator->createDatabase($databaseName); + $this->databaseManager->createDatabase($databaseName); } } diff --git a/src/Jobs/QueuedTenantDatabaseDeleter.php b/src/Jobs/QueuedTenantDatabaseDeleter.php new file mode 100644 index 00000000..4dbdf4bc --- /dev/null +++ b/src/Jobs/QueuedTenantDatabaseDeleter.php @@ -0,0 +1,42 @@ +databaseManager = $databaseManager; + $this->databaseName = $databaseName; + } + + /** + * Execute the job. + * + * @return void + */ + public function handle() + { + $this->databaseManager->deleteDatabase($databaseName); + } +} diff --git a/src/TenantDatabaseManagers/MySQLDatabaseManager.php b/src/TenantDatabaseManagers/MySQLDatabaseManager.php new file mode 100644 index 00000000..f0feff25 --- /dev/null +++ b/src/TenantDatabaseManagers/MySQLDatabaseManager.php @@ -0,0 +1,19 @@ + [ - 'sqlite' => 'Stancl\Tenancy\DatabaseCreators\SQLiteDatabaseCreator', - 'mysql' => 'Stancl\Tenancy\DatabaseCreators\MySQLDatabaseCreator', + 'database_managers' => [ + 'sqlite' => 'Stancl\Tenancy\TenantDatabaseManagers\SQLiteDatabaseManager', + 'mysql' => 'Stancl\Tenancy\TenantDatabaseManagers\MySQLDatabaseManager', ], 'queue_database_creation' => false, + 'queue_database_deletion' => false, ]; diff --git a/tests/DatabaseCreationTest.php b/tests/DatabaseCreationTest.php deleted file mode 100644 index 9b1428d0..00000000 --- a/tests/DatabaseCreationTest.php +++ /dev/null @@ -1,45 +0,0 @@ -randomString(10) . '.sqlite'; - app(DatabaseManager::class)->create($db_name, 'sqlite'); - $this->assertFileExists(database_path($db_name)); - } - - /** @test */ - public function mysql_database_is_created() - { - if (! $this->isTravis()) { - $this->markTestSkipped('As to not bloat your MySQL instance with test databases, this test is not run by default.'); - } - - config()->set('database.default', 'mysql'); - - $db_name = 'testdatabase' . $this->randomString(10); - app(DatabaseManager::class)->create($db_name, 'mysql'); - $this->assertNotEmpty(DB::select("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$db_name'")); - } - - /** @test */ - public function database_creation_can_be_queued() - { - Queue::fake(); - - config()->set('tenancy.queue_database_creation', true); - $db_name = 'testdatabase' . $this->randomString(10) . '.sqlite'; - app(DatabaseManager::class)->create($db_name, 'sqlite'); - - Queue::assertPushed(QueuedDatabaseCreator::class); - } -} diff --git a/tests/TenantDatabaseManagerTest.php b/tests/TenantDatabaseManagerTest.php new file mode 100644 index 00000000..42905497 --- /dev/null +++ b/tests/TenantDatabaseManagerTest.php @@ -0,0 +1,86 @@ +randomString(10) . '.sqlite'; + app(DatabaseManager::class)->create($db_name, 'sqlite'); + $this->assertFileExists(database_path($db_name)); + } + + /** @test */ + public function mysql_database_is_created() + { + if (! $this->isTravis()) { + $this->markTestSkipped('As to not bloat your MySQL instance with test databases, this test is not run by default.'); + } + + config()->set('database.default', 'mysql'); + + $db_name = 'testdatabase' . $this->randomString(10); + app(DatabaseManager::class)->create($db_name, 'mysql'); + $this->assertNotEmpty(DB::select("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$db_name'")); + } + + /** @test */ + public function database_creation_can_be_queued() + { + Queue::fake(); + + config()->set('tenancy.queue_database_creation', true); + $db_name = 'testdatabase' . $this->randomString(10) . '.sqlite'; + app(DatabaseManager::class)->create($db_name, 'sqlite'); + + Queue::assertPushed(QueuedTenantDatabaseCreator::class); + } + + /** @test */ + public function sqlite_database_is_deleted() + { + $db_name = 'testdatabase' . $this->randomString(10) . '.sqlite'; + app(DatabaseManager::class)->create($db_name, 'sqlite'); + $this->assertFileExists(database_path($db_name)); + + app(DatabaseManager::class)->delete($db_name, 'sqlite'); + $this->assertFileNotExists(database_path($db_name)); + } + + /** @test */ + public function mysql_database_is_deleted() + { + if (! $this->isTravis()) { + $this->markTestSkipped('As to not bloat your MySQL instance with test databases, this test is not run by default.'); + } + + config()->set('database.default', 'mysql'); + + $db_name = 'testdatabase' . $this->randomString(10); + app(DatabaseManager::class)->create($db_name, 'mysql'); + $this->assertNotEmpty(DB::select("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$db_name'")); + + app(DatabaseManager::class)->delete($db_name, 'mysql'); + $this->assertEmpty(DB::select("SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$db_name'")); + } + + /** @test */ + public function database_deletion_can_be_queued() + { + Queue::fake(); + + config()->set('tenancy.queue_database_deletion', true); + $db_name = 'testdatabase' . $this->randomString(10) . '.sqlite'; + app(DatabaseManager::class)->delete($db_name, 'sqlite'); + + Queue::assertPushed(QueuedTenantDatabaseDeleter::class); + } +}