false, ]; } /** * @return Collection */ public function getTenants(): Collection { $user = auth()->user(); if (! $user instanceof User) { return Tenant::query()->whereRaw('1 = 0')->get(); } $tenants = $user->getTenants(Filament::getCurrentOrDefaultPanel()); if ($tenants instanceof Collection) { return app(TenantOperabilityService::class)->filterSelectable($tenants); } return app(TenantOperabilityService::class)->filterSelectable(collect($tenants)); } public function selectTenant(int $tenantId): void { $user = auth()->user(); if (! $user instanceof User) { abort(403); } $workspaceContext = app(WorkspaceContext::class); $workspaceId = $workspaceContext->currentWorkspaceId(request()); $tenant = null; if ($workspaceId === null) { $tenant = Tenant::query()->whereKey($tenantId)->first(); if ($tenant instanceof Tenant) { $workspace = $tenant->workspace; if ($workspace !== null && $user->canAccessTenant($tenant)) { $workspaceContext->setCurrentWorkspace($workspace, $user, request()); $workspaceId = (int) $workspace->getKey(); } } } if ($workspaceId === null) { $this->redirect(route('filament.admin.pages.choose-workspace')); return; } if (! $tenant instanceof Tenant || (int) $tenant->workspace_id !== $workspaceId) { $tenant = Tenant::query() ->where('workspace_id', $workspaceId) ->whereKey($tenantId) ->first(); } if (! $tenant instanceof Tenant) { abort(404); } if (! $user->canAccessTenant($tenant)) { abort(404); } $outcome = app(TenantOperabilityService::class)->outcomeFor( tenant: $tenant, question: TenantOperabilityQuestion::SelectorEligibility, actor: $user, workspaceId: $workspaceId, lane: TenantInteractionLane::StandardActiveOperating, ); if (! $outcome->allowed) { abort(404); } $this->persistLastTenant($user, $tenant); if (! $workspaceContext->rememberTenantContext($tenant, request())) { abort(404); } $this->redirect(TenantDashboard::getUrl(panel: 'tenant', tenant: $tenant)); } public function tenantLifecyclePresentation(Tenant $tenant): TenantLifecyclePresentation { return TenantLifecyclePresentation::fromTenant($tenant); } private function persistLastTenant(User $user, Tenant $tenant): void { if (Schema::hasColumn('users', 'last_tenant_id')) { $user->forceFill(['last_tenant_id' => $tenant->getKey()])->save(); return; } if (! Schema::hasTable('user_tenant_preferences')) { return; } UserTenantPreference::query()->updateOrCreate( ['user_id' => $user->getKey(), 'tenant_id' => $tenant->getKey()], ['last_used_at' => now()] ); } }