name('newsletter.unsubscribe'); // Legacy Cyclos payment link (no locale prefix) - as used by Lekkernasuh market payment links // Redirects to the localized version so the auth/localization middleware applies correctly Route::get('/do/member/payment', function (\Illuminate\Http\Request $request) { $locale = app()->getLocale(); $query = $request->getQueryString(); $url = "/{$locale}/do/member/payment" . ($query ? "?{$query}" : ''); return redirect($url); })->name('legacy.cyclos-payment'); /* |-------------------------------------------------------------------------- / DEBUG AND TESTING ROUTES / These are not localized and should not have the secret prefix. |-------------------------------------------------------------------------- */ if (App::environment(['local', 'development', 'testing'])) { // Broadcast test with manual authorization Route::get('/test/broadcast', function () { // manually authorize user 2 $user = User::find(2); $toUserId = 2; Auth::login($user); return view('test.broadcast', compact(['user', 'toUserId'])); }); // IpLocation test Route::get('/test/ip-location', [TestController::class, 'viewIpLocation'])->name('ip-location'); // Debug sandbox 1 Route::get('/test/debug-1', [TestController::class, 'viewDebug1'])->name('debug-1'); // Debug sandbox 2 Route::get('/test/debug-2', [TestController::class, 'viewDebug2'])->name('debug-2'); // Clear cache Route::get('/test/clear-cache', [TestController::class, 'clearCache'])->name('clear-cache'); // Optimize clear Route::get('/test/opt-clear', [TestController::class, 'optimizeClear'])->name('optimize-clear'); // Forcefully clear session and locale cookie Route::get('/test/reset-my-session', function () { session()->flush(); // Create a response that redirects to the homepage $response = redirect('/'); // Explicitly create a new cookie that immediately expires the old one $response->withCookie(cookie()->forget('laravel_localization')); // Return the response to the browser return $response; }); // Test error pages to check logging of errors and LogError middleware Route::get('/test-error-page', function () { abort(404); }); // Simulate a 500 Internal Server Error Route::get('/test-500', function () { throw new \Exception('Simulated server error'); }); } /* |-------------------------------------------------------------------------- | Email Routes (No Locale Prefix) |-------------------------------------------------------------------------- */ Route::get('/email/verify/{type}/{id}/{hash}', function (ProfileEmailVerificationRequest $request) { \Log::info('Email verification route HIT', [ 'type' => request()->route('type'), 'id' => request()->route('id'), 'hash' => request()->route('hash'), 'authenticated' => auth()->check(), 'user_id' => auth()->id(), ]); // Get the user's current lang_preference from the profile model $profileModel = $request->profileModel; $userLocale = $profileModel->lang_preference ?? config('app.fallback_locale'); if (empty($userLocale)) { $userLocale = config('app.fallback_locale'); } // Store in session before fulfilling (in case fulfill triggers any locale changes) if (!session()->has('verification_original_locale')) { session(['verification_original_locale' => $userLocale]); } $request->fulfill(); // Build the localized URL for the verification.verified route $localizedUrl = '/' . $userLocale . '/email/verified'; \Log::info('Email verification redirect', [ 'profile_type' => get_class($profileModel), 'profile_id' => $profileModel->id, 'userLocale' => $userLocale, 'redirect_url' => $localizedUrl, ]); return redirect($localizedUrl); })->middleware(['auth', 'signed'])->name('verification.verify'); Route::get('/js/lang.js', [LangJsController::class, 'js'])->name('lang.js'); // Tags async select API (used by WireUI async-data) Route::get('/api/tags/select', function (\Illuminate\Http\Request $request) { $locale = app()->getLocale(); $search = $request->get('search', ''); $query = \Illuminate\Support\Facades\DB::table('taggable_tags as tt') ->join('taggable_locale_context as tlc', 'tt.tag_id', '=', 'tlc.tag_id') ->join('taggable_contexts as tc', 'tlc.context_id', '=', 'tc.id') ->join('categories as c', 'tc.category_id', '=', 'c.id') ->join('categories as croot', \Illuminate\Support\Facades\DB::raw('COALESCE(c.parent_id, c.id)'), '=', 'croot.id') ->join('taggable_locales as tl', 'tt.tag_id', '=', 'tl.taggable_tag_id') ->where('tl.locale', $locale) ->select('tt.tag_id', 'tt.name', 'croot.color') ->distinct() ->orderBy('tt.name'); if ($search) { $query->where('tt.name', 'like', '%' . $search . '%'); } else { $query->limit(50); } return $query->get()->map(function ($t) { $color = $t->color ?? 'gray'; return [ 'label' => $t->name, 'value' => $t->tag_id, 'color' => $color, 'html' => '' . e($t->name) . '', ]; }); })->name('api.tags.select'); Route::get('/profile/settings/no-locale', [ProfileController::class, 'settingsNoLocale']) ->middleware(['auth']) ->name('profile.settings.no_locale'); /* |-------------------------------------------------------------------------- | Main Localized Application Routes |-------------------------------------------------------------------------- */ Route::group([ 'prefix' => LaravelLocalization::setLocale(), 'middleware' => ['localeSessionRedirect', 'localizationRedirect', 'localeViewPath'] ], function () { /** ADD ALL LOCALIZED ROUTES INSIDE THIS GROUP **/ //----- Non-Auth routes accessible for guests -----// // Fix 404 error when caching routes in combination with Livewire 3 Livewire::setUpdateRoute(function ($handle) { return Route::post('/livewire/update', $handle)->name('default.livewire.update'); }); // Broadcasting authentication route - manually registered inside localized group // Uses custom controller to support multi-guard authentication Route::match(['get', 'post'], '/broadcasting/auth', '\App\Http\Controllers\BroadcastController@authenticate') ->middleware(['auth.any:admin,bank,organization,web']); Route::get('/', function () { return view('welcome'); })->name('welcome'); Route::get('/goodbye', function () { return view('goodbye-deleted-user'); })->name('goodbye-deleted-user'); // Store intended URL for redirect after login Route::post('/store-intended-url', function(\Illuminate\Http\Request $request) { $url = $request->input('url'); if ($url) { session(['url.intended' => $url]); } return response()->json(['success' => true]); })->name('store-intended-url'); // Fortify login routes Route::get(LaravelLocalization::transRoute('routes.login'), [\Laravel\Fortify\Http\Controllers\AuthenticatedSessionController::class, 'create']) ->middleware(['guest']) ->name('login'); Route::post(LaravelLocalization::transRoute('routes.login'), [\Laravel\Fortify\Http\Controllers\AuthenticatedSessionController::class, 'store']) ->middleware(['guest']); Route::get( LaravelLocalization::transRoute('routes.password.request'), [\Laravel\Fortify\Http\Controllers\PasswordResetLinkController::class, 'create'] )->middleware(['guest'])->name('password.request'); Route::post( LaravelLocalization::transRoute('routes.password.email'), [\Laravel\Fortify\Http\Controllers\PasswordResetLinkController::class, 'store'] )->middleware(['guest'])->name('password.email'); // User Direct Login Route - accessible to both guests and authenticated users // Handles redirect to login for guests, or profile access for authenticated users Route::get('/user/{userId}/login', [UserLoginController::class, 'directLogin'])->name('user.direct-login'); Route::get( LaravelLocalization::transRoute('routes.password.reset'), [\Laravel\Fortify\Http\Controllers\NewPasswordController::class, 'create'] )->middleware(['guest'])->name('password.reset'); Route::post( LaravelLocalization::transRoute('routes.password.update'), [\Laravel\Fortify\Http\Controllers\NewPasswordController::class, 'store'] )->middleware(['guest'])->name('password.update'); Route::view(LaravelLocalization::transRoute('routes.register'), 'auth.register') ->middleware(['guest']) ->name('register'); Route::post(LaravelLocalization::transRoute('routes.logout'), [CustomLogoutController::class, 'destroy']) ->middleware(['auth']) ->name('logout'); /* Static Site Content */ Route::view(LaravelLocalization::transRoute('routes.static.getting-started'), 'static.getting-started')->name('static-getting-started'); Route::view(LaravelLocalization::transRoute('routes.static.faq'), 'static.faq')->name('static-faq'); Route::view(LaravelLocalization::transRoute('routes.static.privacy'), 'static.privacy')->name('static-privacy'); Route::get('privacy-policy-download', [StaticController::class, 'downloadPrivacyPolicy'])->name('static-privacy-download'); Route::view(LaravelLocalization::transRoute('routes.static.organizations'), 'static.organizations')->name('static-organizations'); Route::view(LaravelLocalization::transRoute('routes.static.principles'), 'static.principles')->name('static-principles'); Route::view(LaravelLocalization::transRoute('routes.static.report-issue'), 'static.report-issue')->name('static-report-issue'); Route::view(LaravelLocalization::transRoute('routes.static.events'), 'static.events')->name('static-events'); Route::view(LaravelLocalization::transRoute('routes.static.the-hague'), 'static.the-hague')->name('static-the-hague'); Route::view(LaravelLocalization::transRoute('routes.static.lekkernassuh'), 'static.lekkernassuh')->name('static-lekkernassuh'); Route::view(LaravelLocalization::transRoute('routes.static.amst-brus-lisb'), 'static.amst-brus-lisb')->name('static-amst-brus-lisb'); Route::view(LaravelLocalization::transRoute('routes.static.work-w-us'), 'static.work-w-us')->name('static-work-w-us'); Route::view(LaravelLocalization::transRoute('routes.static.philosophy'), 'static.philosophy')->name('static-philosophy'); Route::view(LaravelLocalization::transRoute('routes.static.open-source'), 'static.open-source')->name('static-open-source'); Route::view(LaravelLocalization::transRoute('routes.static.timebank-organization'), 'static.timebank-organization')->name('static-timebank-organization'); Route::view(LaravelLocalization::transRoute('routes.static.history'), 'static.history')->name('static-history'); Route::view(LaravelLocalization::transRoute('routes.static.press-media'), 'static.press-media')->name('static-press-media'); Route::view(LaravelLocalization::transRoute('routes.static.economics-and-research'), 'static.research')->name('static-research'); Route::view(LaravelLocalization::transRoute('routes.static.team'), 'static.team')->name('static-team'); Route::view(LaravelLocalization::transRoute('routes.static.messenger'), 'static.messenger')->name('static-messenger'); Route::view(LaravelLocalization::transRoute('routes.static.report-error'), 'static.report-error')->name('static-report-error'); /* Public Call Routes */ Route::get(LaravelLocalization::transRoute('routes.call.show'), 'App\Http\Controllers\CallController@showById') ->where(['id' => '[0-9]+']) ->name('call.show'); /* Public Post Routes - accessible to both guests and authenticated users */ Route::get(LaravelLocalization::transRoute('routes.post.show'), 'App\Http\Controllers\PostController@showById') ->where(['id' => '[0-9]+']) // Add constraint: only numbers allowed ->name('post.show') ->missing(function () { return view('post.not_found'); }); Route::get(LaravelLocalization::transRoute('routes.post.show_by_id_international'), 'App\Http\Controllers\PostController@showById') ->name('post.show_by_id_international') ->missing(function () { return view('post.not_found'); }); Route::get(LaravelLocalization::transRoute('routes.post.show_by_slug'), 'App\Http\Controllers\PostController@showBySlug') ->name('post.show_by_slug') ->missing(function () { return view('post.not_found'); }); // Manually Registered WireChat Routes Route::group(['prefix' => 'chats', 'middleware' => ['auth.any:admin,bank,organization,web'],], function () { Route::get('/', WireChatsListPage::class)->name('chats'); // Start conversation with specific profile route - must come BEFORE {conversation} to prevent route conflict Route::get('/{profileType}/{id}', [ChatController::class, 'startConversationWith']) ->where('profileType', 'user|organization|bank|admin') ->name('chat.start'); Route::get('/{conversation}', WireChatPage::class)->middleware('belongsToConversation')->name('chat'); }); // Profile Settings... (Native vendor Jetstream view) // Should be outside verified middleware to prevent lockout: email address can still be changes if verification email is not received. Route::middleware(['auth:web', config('jetstream.auth_session')])->group(function () { Route::get( LaravelLocalization::transRoute('routes.profile.settings'), [ProfileController::class, 'settings'] )->name('profile.settings'); }); //----- Protected auth verified routes -----// Route::middleware(['auth:web'])->group(function () { Route::middleware(['auth:web', config('jetstream.auth_session'), 'verified'])->group(function () { Route::group(['middleware' => ['registration-complete', 'principles-accepted']], function () { // 6. Routes for AJAX presence calls Route::post('/presence/heartbeat', [PresenceController::class, 'heartbeat'])->name('presence.heartbeat'); Route::post('/presence/offline', [PresenceController::class, 'setOffline'])->name('presence.offline'); Route::get('/presence/online', [PresenceController::class, 'getOnlineUsers'])->name('presence.online'); Route::get('/main-page', function () { return redirect()->route('main'); }); Route::get(LaravelLocalization::transRoute('routes.main'), function () { return view('main-page'); })->name('main'); Route::get(LaravelLocalization::transRoute('routes.pay'), 'App\Http\Controllers\TransactionController@pay')->name('pay'); Route::get(LaravelLocalization::transRoute('routes.pay-to-name'), 'App\Http\Controllers\TransactionController@payToName') ->name('pay-to-name') ->missing(function () { return view('pay.profile_not_found'); }); Route::get(LaravelLocalization::transRoute('routes.pay-amount-to-name'), 'App\Http\Controllers\TransactionController@payAmountToName') ->name('pay-amount-to-name') ->missing(function () { return view('pay.profile_not_found'); }); Route::get(LaravelLocalization::transRoute('routes.pay-amount-to-name-description'), 'App\Http\Controllers\TransactionController@payAmountToNameWithDescr') ->name('pay-amount-to-name-description') ->missing(function () { return view('pay.profile_not_found'); }); // Legacy Cyclos payment link, as used by Lekkernasuh Route::get('/do/member/payment', [TransactionController::class, 'doCyclosPayment']); Route::get(LaravelLocalization::transRoute('routes.transactions'), 'App\Http\Controllers\TransactionController@transactions')->name('transactions'); Route::get(LaravelLocalization::transRoute('routes.contacts'), function () { return view('contacts.show'); })->name('contacts'); Route::get(LaravelLocalization::transRoute('routes.calls.manage'), 'App\Http\Controllers\CallController@manage')->name('calls.manage'); Route::get(LaravelLocalization::transRoute('routes.reports'), 'App\Http\Controllers\ReportController@reports')->name('reports'); Route::get('/reports/pdf', 'App\Http\Controllers\ReportController@downloadPdf')->name('reports.pdf'); Route::get(LaravelLocalization::transRoute('routes.statement'), 'App\Http\Controllers\TransactionController@statement') ->where(['transactionId' => '[0-9]+']) // Add constraint: only numbers allowed ->name('transaction.show'); Route::group(['middleware' => ['user.can:manage posts']], function () { Route::get(LaravelLocalization::transRoute('routes.posts.manage'), 'App\Http\Controllers\PostController@manage')->name('posts.manage'); Route::get('/posts/backup-download/{filename}', function (string $filename) { // Sanitize filename to prevent directory traversal $filename = basename($filename); $fullPath = storage_path('app/backups/' . $filename); if (!file_exists($fullPath)) { abort(404); } return response()->download($fullPath, $filename)->deleteFileAfterSend(true); })->where('filename', '[a-zA-Z0-9_\-\.]+')->name('posts.backup-download'); Route::post('/posts/backup-upload/chunk', [BackupChunkUploadController::class, 'uploadChunk'])->name('posts.backup-upload-chunk'); Route::post('/posts/backup-upload/finalize', [BackupChunkUploadController::class, 'finalize'])->name('posts.backup-upload-finalize'); }); // Mailings management routes (Admin and Bank only) Route::group(['middleware' => ['user.can:manage posts']], function () { Route::get('/mailings', [MailingsController::class, 'index'])->name('mailings.index'); Route::post('/mailings', [MailingsController::class, 'store'])->name('mailings.store'); Route::put('/mailings/{mailing}', [MailingsController::class, 'update'])->name('mailings.update'); Route::delete('/mailings/{mailing}', [MailingsController::class, 'destroy'])->name('mailings.destroy'); Route::post('/mailings/{mailing}/send', [MailingsController::class, 'send'])->name('mailings.send'); Route::post('/mailings/{mailing}/schedule', [MailingsController::class, 'schedule'])->name('mailings.schedule'); Route::post('/mailings/{mailing}/cancel', [MailingsController::class, 'cancel'])->name('mailings.cancel'); Route::get('/mailings/{mailing}/preview', [MailingsController::class, 'preview'])->name('mailings.preview'); Route::get('/mailings/{mailing}/preview-render', [MailingsController::class, 'previewRender'])->name('mailings.preview_render'); }); Route::get(LaravelLocalization::transRoute('routes.profile.show'), 'App\Http\Controllers\ProfileController@show') ->where(['id' => '[0-9]+']) // Add constraint: only numbers allowed ->name('profile.show_by_type_and_id') ->missing(function () { return view('profile.not_found'); }); Route::get(LaravelLocalization::transRoute('routes.profile.show_active'), 'App\Http\Controllers\ProfileController@showActive') ->name('profile.show_active'); Route::get(LaravelLocalization::transRoute('routes.organization.show'), 'App\Http\Controllers\OrganizationController@show') ->where(['orgId' => '[0-9]+']) // Add constraint: only numbers allowed ->name('organization.show') ->missing(function () { return view('profile-organization.not_found'); }); Route::get(LaravelLocalization::transRoute('routes.bank.show'), 'App\Http\Controllers\BankController@show') ->where(['bankId' => '[0-9]+']) // Add constraint: only numbers allowed ->name('bank.show') ->missing(function () { return view('profile.not_found'); }); Route::get(LaravelLocalization::transRoute('routes.admin.show'), 'App\Http\Controllers\AdminController@show') ->where(['orgId' => '[0-9]+']) // Add constraint: only numbers allowed ->name('admin.show') ->missing(function () { return view('profile.not_found'); }); Route::get(LaravelLocalization::transRoute('routes.profile.edit'), 'App\Http\Controllers\ProfileController@edit')->name('profile.edit'); Route::group(['middleware' => ['user.can:manage users']], function () { Route::get(LaravelLocalization::transRoute('routes.users.manage'), 'App\Http\Controllers\ProfileController@index')->name('users-overview'); }); Route::group(['middleware' => ['user.can:manage categories']], function () { Route::get(LaravelLocalization::transRoute('routes.categories.manage'), 'App\Http\Controllers\CategoryController@manage')->name('categories.manage'); }); Route::group(['middleware' => ['user.can:manage tags']], function () { Route::get(LaravelLocalization::transRoute('routes.tags.manage'), 'App\Http\Controllers\TagController@manage')->name('tags.manage'); }); Route::group(['middleware' => ['user.can:manage profiles']], function () { Route::get(LaravelLocalization::transRoute('routes.profiles.manage'), 'App\Http\Controllers\ProfileController@manage')->name('profiles.manage'); }); Route::group(['middleware' => ['user.can:manage permissions']], function () { Route::get(LaravelLocalization::transRoute('routes.permissions.manage'), 'App\Http\Controllers\PermissionController@manage')->name('permissions.manage'); }); Route::group(['middleware' => ['user.can:manage roles']], function () { Route::get(LaravelLocalization::transRoute('routes.roles.manage'), 'App\Http\Controllers\RoleController@manage')->name('roles.manage'); }); Route::get(LaravelLocalization::transRoute('routes.search.show'), [SearchController::class, 'show'])->name('search.show'); Route::get('/email/verified', function () { // Restore the original locale from session $originalLocale = session('verification_original_locale'); $locale = $originalLocale ?: LaravelLocalization::getCurrentLocale(); // Restore the user's original lang_preference in the database if ($originalLocale && auth()->check()) { $user = auth()->user(); $user->lang_preference = $originalLocale; $user->save(); \Log::info('Restored original locale after verification', [ 'user_id' => $user->id, 'restored_locale' => $originalLocale, ]); } // Clear the session variable session()->forget('verification_original_locale'); $localizedRoute = LaravelLocalization::getURLFromRouteNameTranslated($locale, 'routes.main'); \Log::info('verification.verified route', [ 'current_locale' => LaravelLocalization::getCurrentLocale(), 'restored_locale' => $originalLocale, 'redirect_locale' => $locale, 'localized_route' => $localizedRoute, ]); return redirect($localizedRoute ?: route('main')); })->name('verification.verified'); // Jetstream routes (copied from vendor/laravel/jetstream/routes/livewire.php, to overrule, and to include in Laravel-localization class) Route::group(['middleware' => config('jetstream.middleware', ['web'])], function () { if (Jetstream::hasTermsAndPrivacyPolicyFeature()) { Route::get(LaravelLocalization::transRoute('routes.terms.show'), [TermsOfServiceController::class, 'show'])->name('app.terms.show'); Route::get(LaravelLocalization::transRoute('routes.policy.show'), [PrivacyPolicyController::class, 'show'])->name('app.policy.show'); } $authMiddleware = config('jetstream.guard') ? 'auth:' . config('jetstream.guard') : 'auth'; $authSessionMiddleware = config('jetstream.auth_session', false) ? config('jetstream.auth_session') : null; Route::group(['middleware' => array_values(array_filter([$authMiddleware, $authSessionMiddleware]))], function () { // Organization & Profile... (Custom view) Route::group(['middleware' => ['user.can:manage organizations']], function () { Route::get(LaravelLocalization::transRoute('routes.profile.organization.show'), [OrganizationController::class, 'settings'])->name('profile.organization.settings'); }); // Bank & Profile... (Custom view) Route::group(['middleware' => ['user.can:manage banks']], function () { Route::get(LaravelLocalization::transRoute('routes.profile.bank.show'), [BankController::class, 'settings'])->name('profile.bank.settings'); }); // Admin & Profile... (Custom view) Route::group(['middleware' => ['user.can:manage admins']], function () { Route::get(LaravelLocalization::transRoute('routes.profile.admin.show'), [AdminController::class, 'settings'])->name('profile.admin.settings'); }); Route::group(['middleware' => 'verified'], function () { // API... if (Jetstream::hasApiFeatures()) { Route::get('/user/api-tokens', [ApiTokenController::class, 'index'])->name('api-tokens.index'); } // Exports Route::get('export-test/', [ExportController::class, 'allUsersExport'])->name('export-test'); }); }); }); // Organization Routes // Direct link to organization login (for emails, etc.) Route::get('/organization/{organizationId}/login', [OrganizationLoginController::class, 'directLogin'])->name('organization.direct-login'); Route::get(LaravelLocalization::transRoute('routes.organization.login'), [OrganizationLoginController::class, 'showLoginForm'])->name('organization.login'); Route::post(LaravelLocalization::transRoute('routes.organization.login'), [OrganizationLoginController::class, 'login'])->name('organization.login.post'); Route::get(LaravelLocalization::transRoute('routes.organization.logout'), [OrganizationLoginController::class, 'logout'])->name('organization.logout.get'); Route::post(LaravelLocalization::transRoute('routes.organization.logout'), [OrganizationLoginController::class, 'logout'])->name('organization.logout.post'); Route::group(['middleware' => ['web', 'organization.auth']], function () { Route::get('/organization/main-page', function () { return view('main-page'); })->name('organization.main'); }); // Bank Routes // Direct link to bank login (for emails, etc.) Route::get('/bank/{bankId}/login', [BankLoginController::class, 'directLogin'])->name('bank.direct-login'); Route::get(LaravelLocalization::transRoute('routes.bank.login'), [BankLoginController::class, 'showLoginForm'])->name('bank.login'); Route::post(LaravelLocalization::transRoute('routes.bank.login'), [BankLoginController::class, 'login'])->name('bank.login.post'); Route::get(LaravelLocalization::transRoute('routes.bank.logout'), [BankLoginController::class, 'logout'])->name('bank.logout.get'); Route::post(LaravelLocalization::transRoute('routes.bank.logout'), [BankLoginController::class, 'logout'])->name('bank.logout.post'); Route::group(['middleware' => ['web', 'bank.auth']], function () { Route::get('/bank/main-page', function () { return view('main-page'); })->name('bank.main'); }); // Admin Routes // Direct link to admin login (for emails, etc.) Route::get('/admin/{adminId}/login', [AdminLoginController::class, 'directLogin'])->name('admin.direct-login'); Route::get(LaravelLocalization::transRoute('routes.admin.login'), [AdminLoginController::class, 'showLoginForm'])->name('admin.login'); Route::post(LaravelLocalization::transRoute('routes.admin.login'), [AdminLoginController::class, 'login'])->name('admin.login.post'); Route::get(LaravelLocalization::transRoute('routes.admin.logout'), [AdminLoginController::class, 'logout'])->name('admin.logout.get'); Route::post(LaravelLocalization::transRoute('routes.admin.logout'), [AdminLoginController::class, 'logout'])->name('admin.logout.post'); Route::group(['middleware' => ['web', 'admin.auth']], function () { Route::get('/admin/main-page', function () { return view('main-page'); })->name('admin.main'); }); // Non-User Password Reset Routes Route::prefix('{profileType}/password') ->whereIn('profileType', ['admin', 'bank', 'organization']) // Add all relevant profile types ->name('non-user.password.') ->group(function () { Route::get('/reset', [ResetNonUserPasswordController::class, 'showLinkRequestForm'])->name('request'); // e.g., admin/password/reset Route::post('/email', [ResetNonUserPasswordController::class, 'sendResetLinkEmail'])->name('email'); // e.g., POST admin/password/email Route::get('/reset/{token}', [ResetNonUserPasswordController::class, 'showResetForm'])->name('reset'); // e.g., admin/password/reset/TOKEN Route::post('/reset', [ResetNonUserPasswordController::class, 'reset'])->name('update'); // e.g., POST admin/password/reset }); }); // Registration-compete middleware group ends here }); }); }); // End