mirror of
https://github.com/archtechx/tenancy.git
synced 2025-12-12 09:14:03 +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",
|
||||
"stancl/jobpipeline": "2.0.0-rc2",
|
||||
"stancl/virtualcolumn": "dev-master",
|
||||
"spatie/invade": "^1.1"
|
||||
"spatie/invade": "^1.1",
|
||||
"laravel/prompts": "^0.1.17"
|
||||
},
|
||||
"require-dev": {
|
||||
"laravel/framework": "^10.1|^11.2",
|
||||
|
|
|
|||
|
|
@ -4,7 +4,10 @@ declare(strict_types=1);
|
|||
|
||||
namespace Stancl\Tenancy\Commands;
|
||||
|
||||
use function Laravel\Prompts\search;
|
||||
use function Laravel\Prompts\select;
|
||||
use Laravel\Tinker\Console\TinkerCommand as BaseTinker;
|
||||
use Stancl\Tenancy\Resolvers\DomainTenantResolver;
|
||||
use Symfony\Component\Console\Input\InputArgument;
|
||||
|
||||
class Tinker extends BaseTinker
|
||||
|
|
@ -20,11 +23,58 @@ class Tinker extends BaseTinker
|
|||
|
||||
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 */
|
||||
$tenantKey = $this->argument('tenant') ?: tenancy()->model()::first();
|
||||
tenancy()->initialize($tenantKey);
|
||||
/** @var (\Stancl\Tenancy\Contracts\Tenant&\Illuminate\Database\Eloquent\Model)|null $firstTenant */
|
||||
$firstTenant = tenancy()->model()::first();
|
||||
|
||||
/** @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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -21,6 +21,20 @@ class DomainTenantResolver extends Contracts\CachedTenantResolver
|
|||
{
|
||||
$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 */
|
||||
$tenantModel = tenancy()->model();
|
||||
|
||||
|
|
@ -36,13 +50,8 @@ class DomainTenantResolver extends Contracts\CachedTenantResolver
|
|||
}
|
||||
|
||||
/** @var (Tenant&Model)|null $tenant */
|
||||
if ($tenant) {
|
||||
$this->setCurrentDomain($tenant, $domain);
|
||||
|
||||
return $tenant;
|
||||
}
|
||||
|
||||
throw new TenantCouldNotBeIdentifiedOnDomainException($domain);
|
||||
return $tenant;
|
||||
}
|
||||
|
||||
public function resolved(Tenant $tenant, mixed ...$args): void
|
||||
|
|
@ -50,7 +59,7 @@ class DomainTenantResolver extends Contracts\CachedTenantResolver
|
|||
$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 */
|
||||
if (! $tenant instanceof SingleDomainTenant) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue