name('admin.consent.callback'); Route::get('/admin/consent/start', TenantOnboardingController::class) ->name('admin.consent.start'); // Panel root override: keep the app's workspace-first flow. // Avoid Filament's tenancy root redirect which otherwise sends users into legacy flows. // when no default tenant can be resolved. Route::middleware([ 'web', 'panel:admin', 'ensure-correct-guard:web', DenyNonMemberTenantAccess::class, DisableBladeIconComponents::class, DispatchServingFilamentEvent::class, FilamentAuthenticate::class, 'ensure-workspace-selected', ]) ->get('/admin', function (Request $request) { $workspaceId = app(WorkspaceContext::class)->currentWorkspaceId($request); $user = $request->user(); if (! $user instanceof User) { return redirect()->to('/admin/choose-workspace'); } if ($workspaceId === null) { return redirect()->to('/admin/choose-workspace'); } $workspace = Workspace::query()->whereKey($workspaceId)->first(); if (! $workspace instanceof Workspace) { return redirect()->to('/admin/choose-workspace'); } $tenantsQuery = $user->tenants() ->where('workspace_id', $workspace->getKey()) ->where('status', 'active'); $tenantCount = (int) $tenantsQuery->count(); if ($tenantCount === 0) { return redirect()->route('admin.workspace.managed-tenants.onboarding', ['workspace' => $workspace->slug ?? $workspace->getKey()]); } if ($tenantCount === 1) { $tenant = $tenantsQuery->first(); if ($tenant !== null) { return redirect()->to(TenantDashboard::getUrl(tenant: $tenant)); } } return redirect()->to('/admin/choose-tenant'); }) ->name('admin.home'); Route::get('/admin/rbac/start', [RbacDelegatedAuthController::class, 'start']) ->name('admin.rbac.start'); Route::get('/admin/rbac/callback', [RbacDelegatedAuthController::class, 'callback']) ->name('admin.rbac.callback'); Route::get('/auth/entra/redirect', [EntraController::class, 'redirect']) ->name('auth.entra.redirect'); Route::get('/auth/entra/callback', [EntraController::class, 'callback']) ->middleware('throttle:entra-callback') ->name('auth.entra.callback'); Route::middleware(['web', 'auth', 'ensure-correct-guard:web']) ->post('/admin/switch-workspace', SwitchWorkspaceController::class) ->name('admin.switch-workspace'); Route::middleware(['web', 'auth', 'ensure-correct-guard:web', 'ensure-workspace-selected']) ->post('/admin/select-tenant', SelectTenantController::class) ->name('admin.select-tenant'); Route::bind('workspace', function (string $value): Workspace { /** @var WorkspaceResolver $resolver */ $resolver = app(WorkspaceResolver::class); $workspace = $resolver->resolve($value); abort_unless($workspace instanceof Workspace, 404); return $workspace; }); Route::middleware(['web', 'auth', 'ensure-workspace-member']) ->prefix('/admin/w/{workspace}') ->group(function (): void { Route::get('/', fn () => redirect()->route('admin.workspace.managed-tenants.index', ['workspace' => request()->route('workspace')])) ->name('admin.workspace.home'); Route::get('/ping', fn () => response()->noContent())->name('admin.workspace.ping'); }); Route::middleware([ 'web', 'panel:admin', 'ensure-correct-guard:web', DisableBladeIconComponents::class, DispatchServingFilamentEvent::class, FilamentAuthenticate::class, 'ensure-workspace-member', ]) ->get('/admin/w/{workspace}/managed-tenants/onboarding', \App\Filament\Pages\Workspaces\ManagedTenantOnboardingWizard::class) ->name('admin.workspace.managed-tenants.onboarding'); Route::middleware([ 'web', 'panel:admin', 'ensure-correct-guard:web', DenyNonMemberTenantAccess::class, DisableBladeIconComponents::class, DispatchServingFilamentEvent::class, FilamentAuthenticate::class, 'ensure-workspace-member', 'ensure-filament-tenant-selected', ]) ->get('/admin/w/{workspace}/managed-tenants', \App\Filament\Pages\Workspaces\ManagedTenantsLanding::class) ->name('admin.workspace.managed-tenants.index'); if (app()->runningUnitTests()) { Route::middleware(['web', 'auth', 'ensure-workspace-selected']) ->get('/admin/_test/workspace-context', function (Request $request) { $workspaceId = app(\App\Support\Workspaces\WorkspaceContext::class)->currentWorkspaceId($request); return response()->json([ 'workspace_id' => $workspaceId, ]); }); }