auth()->check() ? redirect()->route('link.dashboard') : redirect()->route('sso.connect'))->name('link.root'); Route::get('/login', [SsoLoginController::class, 'connect'])->name('login'); Route::get('/sso/connect', [SsoLoginController::class, 'connect'])->name('sso.connect'); Route::get('/sso/callback', [SsoLoginController::class, 'callback'])->name('sso.callback'); Route::post('/logout', [SsoLoginController::class, 'logout'])->name('logout'); Route::get('/sso/logout-bridge', [SsoLoginController::class, 'logoutBridge'])->name('sso.logout-bridge'); Route::get('/sso/logout-frontchannel', [SsoLoginController::class, 'frontchannelLogout'])->name('sso.logout-frontchannel'); Route::get('/sso/platform-signed-out', [SsoLoginController::class, 'platformSignedOut'])->name('sso.platform-signed-out'); Route::get('/signed-out', fn () => auth()->check() ? redirect()->route('link.dashboard') : view('links.signed-out'))->name('link.signed-out'); Route::middleware(['auth', 'platform.session'])->group(function () { Route::get('/wallet/balance', [WalletBalanceController::class, 'balance'])->name('wallet.balance'); Route::post('/wallet/topup', [WalletTopupController::class, 'store'])->name('user.wallet.topup'); Route::get('/notifications', [NotificationController::class, 'index'])->name('notifications.index'); Route::get('/notifications/unread', [NotificationController::class, 'unread'])->name('notifications.unread'); Route::post('/notifications/{id}/read', [NotificationController::class, 'markAsRead'])->name('notifications.mark-read'); Route::post('/notifications/mark-all-read', [NotificationController::class, 'markAllAsRead'])->name('notifications.mark-all-read'); Route::get('/dashboard', [OverviewController::class, 'index'])->name('link.dashboard'); Route::get('/analytics', [AnalyticsController::class, 'index'])->name('link.analytics.index'); Route::get('/domains', [CustomDomainController::class, 'index'])->name('link.domains.index'); Route::post('/domains', [CustomDomainController::class, 'store'])->name('link.domains.store'); Route::post('/domains/{customDomain}/verify', [CustomDomainController::class, 'verify'])->name('link.domains.verify'); Route::post('/domains/{customDomain}/default', [CustomDomainController::class, 'makeDefault'])->name('link.domains.default'); Route::delete('/domains/{customDomain}', [CustomDomainController::class, 'destroy'])->name('link.domains.destroy'); Route::get('/settings', [SettingsController::class, 'index'])->name('link.settings'); Route::put('/settings/default-domain', [SettingsController::class, 'updateDefaultDomain'])->name('link.settings.default-domain'); Route::get('/links', [LinkController::class, 'index'])->name('user.links.index'); Route::get('/links/create', [LinkController::class, 'create'])->name('user.links.create'); Route::post('/links', [LinkController::class, 'store'])->name('user.links.store'); Route::get('/links/check-slug', [LinkController::class, 'checkSlug'])->name('user.links.check-slug'); Route::get('/links/{link}', [LinkController::class, 'show'])->name('user.links.show'); Route::patch('/links/{link}', [LinkController::class, 'update'])->name('user.links.update'); Route::delete('/links/{link}', [LinkController::class, 'destroy'])->name('user.links.destroy'); Route::get('/wallet', fn () => redirect()->away(ladill_account_url('/wallet')))->name('account.wallet'); Route::get('/billing', fn () => redirect()->away(ladill_account_url('/billing')))->name('account.billing'); }); // Public short-link resolution — must be last so app routes are not shadowed. Route::match(['GET', 'POST', 'PATCH', 'DELETE'], '/{slug}/{path?}', [LinkRedirectController::class, 'resolve']) ->where('slug', '[a-z0-9][a-z0-9-]{1,30}[a-z0-9]') ->where('path', '.*') ->name('link.public.resolve');