1
0
Fork 0
mirror of https://github.com/archtechx/tenancy.git synced 2026-02-05 19:34:04 +00:00

Fix issue 515: Cannot create a new tenant with a different different db host

This commit is contained in:
Babis Papakonstantinou 2021-05-15 15:02:51 +03:00
parent 54a33f93a8
commit 254b1b3f84
4 changed files with 45 additions and 1 deletions

View file

@ -72,6 +72,23 @@ class DatabaseManager
$this->app['config']['database.connections.tenant'] = $tenant->database()->connection();
}
/**
* Create the tenant's host database connection.
*/
public function createHostConnection(TenantWithDatabase $tenant)
{
$this->originalTemplate = $this->app['config']["database.connections.{$tenant->database()->getTemplateConnectionName()}"];
$this->app['config']["database.connections.{$tenant->database()->getTemplateConnectionName()}"] = $tenant->database()->hostConnection();
}
/**
* Reset the tenant database connection.
*/
public function resetTenantConnection(TenantWithDatabase $tenant)
{
$this->app['config']["database.connections.{$tenant->database()->getTemplateConnectionName()}"] = $this->originalTemplate;
}
/**
* Check if a tenant can be created.
*

View file

@ -117,6 +117,20 @@ class DatabaseConfig
);
}
/**
* Tenant host's database connection config. Used for
* creating and deleting the tenant database.
*/
public function hostConnection(): array
{
$template = $this->getTemplateConnectionName();
$templateConnection = config("database.connections.{$template}");
return $this->manager()->makeConnectionConfig(
array_merge($templateConnection, $this->tenantConfig()), $templateConnection['database']
);
}
/**
* Additional config for the database connection, specific to this tenant.
*/

View file

@ -29,6 +29,9 @@ class CreateDatabase implements ShouldQueue
public function handle(DatabaseManager $databaseManager)
{
// update the connection to use the tenant's config
$databaseManager->createHostConnection($this->tenant);
event(new CreatingDatabase($this->tenant));
// Terminate execution of this job & other jobs in the pipeline
@ -41,5 +44,8 @@ class CreateDatabase implements ShouldQueue
$this->tenant->database()->manager()->createDatabase($this->tenant);
event(new DatabaseCreated($this->tenant));
// revert the configuration to the original template
$databaseManager->resetTenantConnection($this->tenant);
}
}

View file

@ -10,6 +10,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Stancl\Tenancy\Contracts\TenantWithDatabase;
use Stancl\Tenancy\Database\DatabaseManager;
use Stancl\Tenancy\Events\DatabaseDeleted;
use Stancl\Tenancy\Events\DeletingDatabase;
@ -25,12 +26,18 @@ class DeleteDatabase implements ShouldQueue
$this->tenant = $tenant;
}
public function handle()
public function handle(DatabaseManager $databaseManager)
{
// update the connection to use the tenant's config
$databaseManager->createHostConnection($this->tenant);
event(new DeletingDatabase($this->tenant));
$this->tenant->database()->manager()->deleteDatabase($this->tenant);
event(new DatabaseDeleted($this->tenant));
// revert the configuration to the original template
$databaseManager->resetTenantConnection($this->tenant);
}
}