mirror of
https://github.com/archtechx/tenancy.git
synced 2025-12-12 06:44:04 +00:00
add prompts to tenant:tinker
This commit is contained in:
parent
4cc9fbe7ea
commit
489fbb9402
3 changed files with 72 additions and 12 deletions
|
|
@ -24,7 +24,8 @@
|
||||||
"ramsey/uuid": "^4.7.3",
|
"ramsey/uuid": "^4.7.3",
|
||||||
"stancl/jobpipeline": "2.0.0-rc2",
|
"stancl/jobpipeline": "2.0.0-rc2",
|
||||||
"stancl/virtualcolumn": "dev-master",
|
"stancl/virtualcolumn": "dev-master",
|
||||||
"spatie/invade": "^1.1"
|
"spatie/invade": "^1.1",
|
||||||
|
"laravel/prompts": "^0.1.17"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"laravel/framework": "^10.1|^11.2",
|
"laravel/framework": "^10.1|^11.2",
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,10 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace Stancl\Tenancy\Commands;
|
namespace Stancl\Tenancy\Commands;
|
||||||
|
|
||||||
|
use function Laravel\Prompts\search;
|
||||||
|
use function Laravel\Prompts\select;
|
||||||
use Laravel\Tinker\Console\TinkerCommand as BaseTinker;
|
use Laravel\Tinker\Console\TinkerCommand as BaseTinker;
|
||||||
|
use Stancl\Tenancy\Resolvers\DomainTenantResolver;
|
||||||
use Symfony\Component\Console\Input\InputArgument;
|
use Symfony\Component\Console\Input\InputArgument;
|
||||||
|
|
||||||
class Tinker extends BaseTinker
|
class Tinker extends BaseTinker
|
||||||
|
|
@ -20,11 +23,58 @@ class Tinker extends BaseTinker
|
||||||
|
|
||||||
public function handle()
|
public function handle()
|
||||||
{
|
{
|
||||||
// ?: to support empty strings so that the original argument (`include`) can be reached even with a falsy tenant argument
|
/** @var string|int|null $tenantKey */
|
||||||
|
$tenantKey = $this->argument('tenant');
|
||||||
|
|
||||||
/** @var \Stancl\Tenancy\Contracts\Tenant|string|int $tenantKey */
|
/** @var (\Stancl\Tenancy\Contracts\Tenant&\Illuminate\Database\Eloquent\Model)|null $firstTenant */
|
||||||
$tenantKey = $this->argument('tenant') ?: tenancy()->model()::first();
|
$firstTenant = tenancy()->model()::first();
|
||||||
tenancy()->initialize($tenantKey);
|
|
||||||
|
/** @var string|int|null $firstTenantKey */
|
||||||
|
$firstTenantKey = $firstTenant?->getTenantKey();
|
||||||
|
|
||||||
|
$tenant = null;
|
||||||
|
|
||||||
|
if (! $tenantKey) {
|
||||||
|
$select = select('Which tenant do you want to run Tinker as?', [
|
||||||
|
'first' => "First tenant ($firstTenantKey)",
|
||||||
|
'searchById' => 'Search by id',
|
||||||
|
'searchByDomain' => 'Search by domain',
|
||||||
|
]);
|
||||||
|
|
||||||
|
if ($select === 'first') {
|
||||||
|
$tenant = $firstTenant;
|
||||||
|
} elseif ($select === 'searchById') {
|
||||||
|
/** @var string $tenantKey */
|
||||||
|
$tenantKey = search(
|
||||||
|
'Enter the tenant key:',
|
||||||
|
fn (string $search) => strlen($search) > 0
|
||||||
|
? tenancy()->model()::where(tenancy()->model()->getTenantKeyName(), 'like', "$search%")->pluck(tenancy()->model()->getTenantKeyName())->all()
|
||||||
|
: []
|
||||||
|
);
|
||||||
|
|
||||||
|
$tenant = tenancy()->find($tenantKey);
|
||||||
|
} elseif ($select === 'searchByDomain') {
|
||||||
|
/** @var string $domain */
|
||||||
|
$domain = search(
|
||||||
|
'Enter the tenant domain:',
|
||||||
|
fn (string $search) => strlen($search) > 0
|
||||||
|
? config('tenancy.models.domain')::where('domain', 'like', "$search%")->pluck('domain')->all()
|
||||||
|
: []
|
||||||
|
);
|
||||||
|
|
||||||
|
$tenant = DomainTenantResolver::findTenantByDomain($domain);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$tenant = tenancy()->find($tenantKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (! $tenant) {
|
||||||
|
$this->components->error('No tenant found.');
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tenancy()->initialize($tenant);
|
||||||
|
|
||||||
return parent::handle();
|
return parent::handle();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,20 @@ class DomainTenantResolver extends Contracts\CachedTenantResolver
|
||||||
{
|
{
|
||||||
$domain = $args[0];
|
$domain = $args[0];
|
||||||
|
|
||||||
|
$tenant = static::findTenantByDomain($domain);
|
||||||
|
|
||||||
|
/** @var (Tenant&Model)|null $tenant */
|
||||||
|
if ($tenant) {
|
||||||
|
static::setCurrentDomain($tenant, $domain);
|
||||||
|
|
||||||
|
return $tenant;
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new TenantCouldNotBeIdentifiedOnDomainException($domain);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function findTenantByDomain(string $domain): (Tenant&Model)|null
|
||||||
|
{
|
||||||
/** @var Tenant&Model $tenantModel */
|
/** @var Tenant&Model $tenantModel */
|
||||||
$tenantModel = tenancy()->model();
|
$tenantModel = tenancy()->model();
|
||||||
|
|
||||||
|
|
@ -36,13 +50,8 @@ class DomainTenantResolver extends Contracts\CachedTenantResolver
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @var (Tenant&Model)|null $tenant */
|
/** @var (Tenant&Model)|null $tenant */
|
||||||
if ($tenant) {
|
|
||||||
$this->setCurrentDomain($tenant, $domain);
|
|
||||||
|
|
||||||
return $tenant;
|
return $tenant;
|
||||||
}
|
|
||||||
|
|
||||||
throw new TenantCouldNotBeIdentifiedOnDomainException($domain);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function resolved(Tenant $tenant, mixed ...$args): void
|
public function resolved(Tenant $tenant, mixed ...$args): void
|
||||||
|
|
@ -50,7 +59,7 @@ class DomainTenantResolver extends Contracts\CachedTenantResolver
|
||||||
$this->setCurrentDomain($tenant, $args[0]);
|
$this->setCurrentDomain($tenant, $args[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function setCurrentDomain(Tenant $tenant, string $domain): void
|
protected static function setCurrentDomain(Tenant $tenant, string $domain): void
|
||||||
{
|
{
|
||||||
/** @var Tenant&Model $tenant */
|
/** @var Tenant&Model $tenant */
|
||||||
if (! $tenant instanceof SingleDomainTenant) {
|
if (! $tenant instanceof SingleDomainTenant) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue