use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Auth; use App\Http\Controllers\Auth\LoginController; /** * ------------------------------------------------- * HOME (single source of truth) * ------------------------------------------------- * If your file is resources/views/home.blade.php use 'home'. * If it's resources/views/home/index.blade.php, switch to 'home.index'. */ Route::view('/', 'home')->name('home'); // Route::view('/', 'home.index')->name('home'); // <- use this instead if your view is home/index.blade.php /** * ------------------------------------------------- * PUBLIC * ------------------------------------------------- */ Route::get('/careers', [\App\Http\Controllers\CareersController::class, 'index'])->name('careers.index'); Route::get('/life', [\App\Http\Controllers\LifeController::class, 'index'])->name('life.index'); Route::get('/ads', [\App\Http\Controllers\AdsController::class, 'index'])->name('ads.index'); Route::get('/suppliers', [\App\Http\Controllers\SuppliersController::class, 'index'])->name('suppliers.index'); Route::get('/assistant', [\App\Http\Controllers\AssistantController::class, 'index'])->name('assistant.index'); Route::get('/admin-test', fn () => 'admin ok'); Route::get('/member/dashboard-test', fn () => 'member ok'); /** Legal (canonical short paths + redirects from /legal/*) */ Route::redirect('/legal/terms', '/terms', 301); Route::redirect('/legal/cookies', '/cookies', 301); Route::redirect('/legal/privacy', '/privacy', 301); Route::get('/terms', [\App\Http\Controllers\LegalController::class, 'terms'])->name('legal.terms'); Route::get('/privacy', [\App\Http\Controllers\LegalController::class, 'privacy'])->name('legal.privacy'); Route::get('/cookies', [\App\Http\Controllers\LegalController::class, 'cookies'])->name('legal.cookies'); /** * ------------------------------------------------- * ADMIN (pages) * ------------------------------------------------- */ Route::prefix('admin')->group(function () { // Dashboard Route::get('/', [\App\Http\Controllers\Admin\DashboardController::class, 'index'])->name('admin.dashboard'); // Analytics Route::get('/analytics', [\App\Http\Controllers\Admin\AnalyticsController::class, 'index'])->name('admin.analytics.index'); Route::post('/analytics', [\App\Http\Controllers\Admin\AnalyticsController::class, 'save']); // Payments Route::get('/payments', [\App\Http\Controllers\Admin\PaymentsController::class, 'index'])->name('admin.payments.index'); Route::post('/payments', [\App\Http\Controllers\Admin\PaymentsController::class, 'save']); // Domains Route::get('/domains', [\App\Http\Controllers\Admin\DomainsController::class, 'index'])->name('admin.domains.index'); Route::post('/domains', [\App\Http\Controllers\Admin\DomainsController::class, 'save']); // Maintenance Route::get('/maintenance', [\App\Http\Controllers\Admin\MaintenanceController::class, 'index'])->name('admin.maintenance.index'); Route::post('/maintenance/toggle', [\App\Http\Controllers\Admin\MaintenanceController::class, 'toggle']); // Maps Route::get('/maps', [\App\Http\Controllers\Admin\MapsController::class, 'index']); Route::post('/maps', [\App\Http\Controllers\Admin\MapsController::class, 'save']); // Providers (generic) Route::get('/providers', [\App\Http\Controllers\Admin\ProvidersController::class, 'index']); Route::post('/providers', [\App\Http\Controllers\Admin\ProvidersController::class, 'save']); Route::get('/providers/extra', [\App\Http\Controllers\Admin\ProvidersExtraController::class,'index']); Route::post('/providers/extra', [\App\Http\Controllers\Admin\ProvidersExtraController::class,'save']); // Provider OAuth Route::get('/providers/oauth', [\App\Http\Controllers\Admin\ProviderAuthController::class,'index']); Route::post('/providers/oauth/{provider}', [\App\Http\Controllers\Admin\ProviderAuthController::class,'auth']); // Locations Route::get('/locations', [\App\Http\Controllers\Admin\LocationsController::class, 'index']); Route::post('/locations/import', [\App\Http\Controllers\Admin\LocationsController::class, 'import']); // Bookings Route::get('/bookings', [\App\Http\Controllers\Admin\BookingsController::class, 'index'])->name('admin.bookings.index'); Route::post('/bookings/{orderId}/refund', [\App\Http\Controllers\Admin\BookingsController::class,'refund']); Route::post('/bookings/create-user', [\App\Http\Controllers\Admin\BookingsController::class,'createUser']); // Public API config (internal) Route::get('/public-api', [\App\Http\Controllers\Admin\PublicApiController::class,'index']); Route::post('/public-api', [\App\Http\Controllers\Admin\PublicApiController::class,'save']); // Performance Route::get('/performance', [\App\Http\Controllers\Admin\PerformanceController::class,'index']); Route::post('/performance',[\App\Http\Controllers\Admin\PerformanceController::class,'save']); // Currency (admin UI) Route::get('/currency', [\App\Http\Controllers\Admin\CurrencyController::class,'index']); Route::post('/currency',[\App\Http\Controllers\Admin\CurrencyController::class,'save']); // Roles Route::get('/roles', [\App\Http\Controllers\Admin\RolesController::class,'index']); Route::post('/roles/user-role', [\App\Http\Controllers\Admin\RolesController::class,'setUserRole']); Route::post('/roles/role-perm', [\App\Http\Controllers\Admin\RolesController::class,'setRolePerm']); // Agent console Route::get('/agent', [\App\Http\Controllers\Admin\AgentConsoleController::class,'index']); Route::post('/agent/client', [\App\Http\Controllers\Admin\AgentConsoleController::class,'saveClient']); Route::get('/agent/bulk-pnr', [\App\Http\Controllers\Admin\BulkPnrController::class,'index']); Route::post('/agent/bulk-pnr', [\App\Http\Controllers\Admin\BulkPnrController::class,'upload']); Route::get('/agent/quote', [\App\Http\Controllers\Admin\QuoteBuilderController::class,'index']); Route::post('/agent/quote', [\App\Http\Controllers\Admin\QuoteBuilderController::class,'make']); // UGC moderation Route::get('/ugc', [\App\Http\Controllers\Admin\UgcModerationController::class,'index']); Route::post('/ugc/{type}/{id}', [\App\Http\Controllers\Admin\UgcModerationController::class,'set']); // Queue Route::post('/queue', [\App\Http\Controllers\Admin\QueueController::class,'save']); Route::get('/queue', [\App\Http\Controllers\Admin\QueueController::class,'index']); // Verticals > Hotels Route::get('/verticals/hotels', [\App\Http\Controllers\Admin\Verticals\HotelsController::class, 'index']) ->name('admin.verticals.hotels'); // Admin UI previews Route::view('/ui', 'admin.dashboard_ui')->name('admin.ui'); Route::view('/ui-pro', 'admin.dashboard_ui_pro')->name('admin.ui-pro'); /** * Settings > Integrations (Chatbot/I18n/Currency) * Semicolons & names included to avoid parse issues. */ Route::get('/settings/integrations', [\App\Http\Controllers\Admin\IntegrationsController::class,'index']) ->name('admin.settings.integrations'); Route::post('/settings/integrations', [\App\Http\Controllers\Admin\IntegrationsController::class,'save']) ->name('admin.settings.integrations.save'); /** * Chatbot settings (single block) */ Route::get('/chatbot', [\App\Http\Controllers\Admin\ChatbotController::class,'index']) ->name('admin.chatbot'); Route::post('/chatbot', [\App\Http\Controllers\Admin\ChatbotController::class,'save']) ->name('admin.chatbot.save'); }); /** * ------------------------------------------------- * MEMBER * ------------------------------------------------- */ Route::prefix('member')->group(function () { Route::get('/dashboard', [\App\Http\Controllers\Member\ProfileController::class, 'dashboard'])->name('member.dashboard'); Route::get('/loyalty', [\App\Http\Controllers\Member\LoyaltyController::class, 'index'])->name('member.loyalty.index'); Route::get('/trips', [\App\Http\Controllers\Member\TripsController::class, 'index'])->name('member.trips.index'); Route::get('/history', [\App\Http\Controllers\Member\HistoryController::class, 'index'])->name('member.history.index'); Route::get('/receipts', [\App\Http\Controllers\Member\ReceiptsController::class, 'index'])->name('member.receipts.index'); // placeholders Route::get('/offers', fn() => view('member.dashboard')); Route::get('/payment-methods', fn() => view('member.dashboard')); }); /** Member landing + avatar upload */ Route::get('/member', fn() => view('member.dashboard'))->name('member.home'); Route::middleware(['web','auth','can:admin'])->post( '/member/profile/photo', [\App\Http\Controllers\Member\MediaController::class, 'uploadAvatar'] )->name('member.photo.upload'); /** * ------------------------------------------------- * SEARCH / PDP / MISC (views must exist) * ------------------------------------------------- */ Route::get('/search/hotels', fn () => view('search.hotels')); Route::get('/search/flights', fn () => view('search.flights')); Route::get('/search/cars', fn () => view('search.cars')); Route::get('/search/cruises', fn () => view('search.cruises')); Route::get('/search/activities', fn () => view('search.activities')); Route::get('/search/packages', fn () => view('search.packages')); Route::get('/search/buses', fn () => view('search.buses')); Route::get('/search/transfers', fn () => view('search.transfers')); Route::get('/hotel', fn () => view('pdp.hotel')); Route::get('/flight', fn () => view('pdp.flight')); Route::get('/car', fn () => view('pdp.car')); Route::get('/cruise', fn () => view('pdp.cruise')); /** Sitemaps */ Route::get('/sitemap.xml', [\App\Http\Controllers\SitemapController::class,'index']); Route::get('/sitemaps/hotels.xml', [\App\Http\Controllers\SitemapController::class,'hotels']); /** SRP JSON APIs */ Route::get('/api/srp/hotels', [\App\Http\Controllers\SearchController::class,'hotels']); Route::get('/api/srp/flights', [\App\Http\Controllers\SearchController::class,'flights']); Route::get('/api/srp/cars', [\App\Http\Controllers\SearchController::class,'cars']); Route::get('/api/srp/cruises', [\App\Http\Controllers\SearchController::class,'cruises']); /** Map hotels JSON + page */ Route::get('/api/srp/hotels/map', [\App\Http\Controllers\MapHotelsController::class,'json']); Route::get('/hotels/map', [\App\Http\Controllers\MapHotelsController::class,'view']); /** * ------------------------------------------------- * ADMIN EXPORTS (CSV) * ------------------------------------------------- */ Route::get('/admin/bookings/export/csv', [\App\Http\Controllers\Admin\ExportsController::class,'bookingsCsv']); Route::get('/admin/payments/export/csv', [\App\Http\Controllers\Admin\ExportsController::class,'paymentsCsv']); Route::post('/admin/bookings/{ref}/resend', \App\Http\Controllers\Admin\ResendBookingController::class); /** * ------------------------------------------------- * EMAIL TEMPLATES mini‑CRUD + Test Send * ------------------------------------------------- */ Route::prefix('admin/marketing/emails')->group(function () { Route::get('/', function () { $rows = DB::table('email_templates')->orderBy('id', 'desc')->get(); return view('admin.marketing.email_list', ['rows' => $rows]); })->name('email-templates.index'); Route::get('/new', fn () => view('admin.marketing.email_edit'))->name('email-templates.new'); Route::post('/', function(\Illuminate\Http\Request $req) { $data = $req->validate([ 'name' => 'required|string|max:255', 'subject' => 'required|string|max:255', 'body' => 'nullable|string', ]); $id = DB::table('email_templates')->insertGetId([ 'name' => $data['name'], 'subject' => $data['subject'], 'body' => $data['body'] ?? null, 'created_at' => now(), 'updated_at' => now(), ]); return redirect("/admin/marketing/emails/{$id}/edit")->with('ok', 'Saved'); })->name('email-templates.store'); Route::get('/{id}/edit', function ($id) { $t = DB::table('email_templates')->where('id', $id)->first(); abort_unless($t, 404); return view('admin.marketing.email_edit', ['template' => $t]); })->name('email-templates.edit'); Route::put('/{id}', function(\Illuminate\Http\Request $req, $id) { $data = $req->validate([ 'name' => 'required|string|max:255', 'subject' => 'required|string|max:255', 'body' => 'nullable|string', ]); DB::table('email_templates')->where('id', $id)->update([ 'name' => $data['name'], 'subject' => $data['subject'], 'body' => $data['body'] ?? null, 'updated_at' => now(), ]); return back()->with('ok', 'Updated'); })->name('email-templates.update'); Route::delete('/{id}', function ($id) { DB::table('email_templates')->where('id', $id)->delete(); return redirect()->route('email-templates.index')->with('ok', 'Deleted'); })->name('email-templates.destroy'); Route::post('/{id}/test-send', function ($id) { request()->validate(['to' => 'required|email']); $tpl = DB::table('email_templates')->where('id', $id)->first(); abort_unless($tpl, 404); $vars = ['name' => 'Test User']; $body = preg_replace_callback('/{{\s*(\w+)\s*}}/', fn($m) => $vars[$m[1]] ?? '', $tpl->body ?? ''); Mail::html($body, function ($m) use ($tpl) { $m->to(request('to'))->subject($tpl->subject ?: 'Test'); }); return back()->with('status', 'Test email sent to ' . request('to')); })->name('email-templates.test-send'); }); /** * ------------------------------------------------- * LOCALIZATION (lang/currency) – FQN Request avoids "use" collisions * ------------------------------------------------- */ Route::match(['get','post'], '/lang/{locale?}', function(\Illuminate\Http\Request $req, $locale = null) { $allowed = ['en','es','pt']; $locale = $locale ?: $req->input('locale'); if (!in_array($locale, $allowed)) { abort(404); } $req->session()->put('locale', $locale); app()->setLocale($locale); return back(); })->name('lang.set'); Route::match(['get','post'], '/currency/{code?}', function(\Illuminate\Http\Request $req, $code = null) { $allowed = ['USD','EUR','BRL']; $code = strtoupper($code ?: $req->input('currency')); if (!in_array($code, $allowed)) { abort(404); } $req->session()->put('currency', $code); return back(); })->name('currency.set'); /** * ------------------------------------------------- * WEBHOOKS * ------------------------------------------------- */ Route::post('/webhooks/stripe', [\App\Http\Controllers\WebhooksController::class,'stripe']); Route::post('/webhooks/pix', [\App\Http\Controllers\WebhooksController::class,'pix']); Route::post('/webhooks/boleto', [\App\Http\Controllers\WebhooksController::class,'boleto']); Route::post('/webhooks/provider/{provider}', [\App\Http\Controllers\WebhooksController::class,'provider']); /** * ------------------------------------------------- * UTILITIES * ------------------------------------------------- */ Route::get('/admin/locations/reseed', function () { $p = base_path('../schema/viagens_demo.sql'); if ($p && file_exists($p)) { DB::unprepared(file_get_contents($p)); return 'Reseeded demo locations.'; } return 'Demo SQL not found'; }); /** One‑click installer (idempotent) */ Route::get('/install', function () { try { Artisan::call('migrate', ['--force' => true]); Artisan::call('config:clear'); Artisan::call('cache:clear'); Artisan::call('route:clear'); Artisan::call('view:clear'); return response()->json(['status' => 'ok', 'message' => 'Installation complete.']); } catch (\Throwable $e) { return response()->json(['status' => 'error', 'message' => $e->getMessage()], 500); } }); /** Canary routes — should be 200 if Laravel is reached */ Route::get('/zz-allow', fn() => response('ok', 200)); Route::get('/hb-open', fn() => response('hb-open-ok', 200)); Route::get('/hb-json', fn() => response()->json(['ok' => true])); /** * ------------------------------------------------- * HOTELBEDS (Admin + temporary fallbacks) * ------------------------------------------------- */ Route::middleware(['web','auth','can:admin']) ->prefix('admin/providers') ->name('admin.providers.hotelbeds.') ->group(function () { Route::get('hotelbeds', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'show'])->name('show'); Route::post('hotelbeds', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'save'])->name('save'); Route::post('hotelbeds/test', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'test'])->name('test'); }); /** Public fallback while /admin might be blocked by host/WAF */ Route::prefix('setup/p')->group(function () { Route::get('hb-ping', fn() => response('hb-ping-ok', 200)); Route::get('hotelbeds', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'show']) ->withoutMiddleware([\Illuminate\Auth\Middleware\Authenticate::class]); Route::post('hotelbeds', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'save']) ->withoutMiddleware([\Illuminate\Auth\Middleware\Authenticate::class]); Route::match(['get','post'],'hotelbeds/test', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'test']) ->withoutMiddleware([\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken::class,\Illuminate\Auth\Middleware\Authenticate::class]); Route::get('hb-raw', function () { try { $hb = new \App\Services\HotelbedsClient(); return response()->json($hb->testConnection(), 200); } catch (\Throwable $e) { return response("HB ERROR: ".$e->getMessage(), 500)->header('Content-Type','text/plain'); } })->withoutMiddleware([\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken::class,\Illuminate\Auth\Middleware\Authenticate::class]); }); /** * ------------------------------------------------- * AUTH * ------------------------------------------------- */ Route::middleware('web')->group(function () { Route::get('/login', [LoginController::class, 'showLoginForm'])->name('login'); Route::post('/login', [LoginController::class, 'login'])->name('login.attempt'); Route::post('/logout',[LoginController::class, 'logout'])->name('logout'); }); /** * ------------------------------------------------- * MODULE INCLUDES (safe order, won’t fail if missing) * ------------------------------------------------- */ if (file_exists(base_path('backend_stubs/routes/web.php'))) { require base_path('backend_stubs/routes/web.php'); } if (file_exists(base_path('web_installer/install.php'))) { require base_path('web_installer/install.php'); } foreach (glob(base_path('modules') . '/*/routes/web.php') as $modRoute) { require $modRoute; } /** * Admin → Verticals → Hotels → Providers → Hotelbeds * (mount Hotelbeds settings under the Hotels vertical) */ Route::middleware(['web','auth','can:admin']) ->prefix('admin/verticals/hotels/providers') ->name('admin.verticals.hotels.providers.') ->group(function () { Route::get('hotelbeds', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'show']) ->name('hotelbeds.show'); Route::post('hotelbeds', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'save']) ->name('hotelbeds.save'); Route::post('hotelbeds/test', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'test']) ->name('hotelbeds.test'); }); /** Admin → Verticals → Hotels → Providers → Placeholders */ Route::middleware(['web']) // switch back to ['web','auth','can:admin'] after setup ->prefix('admin/verticals/hotels/providers') ->group(function () { Route::get('amadeus', function () { return view('admin.providers.placeholder', ['name' => 'Amadeus']); }); Route::get('expedia', function () { return view('admin.providers.placeholder', ['name' => 'Expedia']); }); }); /** Admin → Verticals → Hotels → Providers → Hotelbeds (direct, no redirect) */ Route::middleware(['web'])->prefix('admin/verticals/hotels/providers')->group(function () { Route::get('hotelbeds', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'show']) ->name('admin.verticals.hotels.providers.hotelbeds.show'); Route::post('hotelbeds', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'save']) ->name('admin.verticals.hotels.providers.hotelbeds.save'); Route::match(['get','post'],'hotelbeds/test', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'test']) ->name('admin.verticals.hotels.providers.hotelbeds.test'); }); /** Convenience redirect: Hotels → Providers → Hotelbeds */ Route::get('/admin/verticals/hotels/providers/hotelbeds', function () { return redirect('/admin/providers/hotelbeds', 302); }); // ===== Admin → Verticals → Hotels → Providers ===== Route::middleware(['web','auth','can:admin']) ->prefix('admin/verticals/hotels/providers') ->name('admin.hotels.providers.') ->group(function () { // Reuse your existing Hotelbeds controller Route::get('hotelbeds', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'show']) ->name('hotelbeds.show'); Route::post('hotelbeds', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'save']) ->name('hotelbeds.save'); Route::post('hotelbeds/test', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'test']) ->name('hotelbeds.test'); // Placeholders you can wire later (safe, simple views below) Route::view('amadeus', 'admin.verticals.hotels.providers.amadeus')->name('amadeus'); Route::view('expedia', 'admin.verticals.hotels.providers.expedia')->name('expedia'); Route::view('siteminder', 'admin.verticals.hotels.providers.siteminder')->name('siteminder'); }); // Convenience redirect: legacy Hotelbeds admin → new location Route::get('/admin/providers/hotelbeds', function () { return redirect('/admin/verticals/hotels/providers/hotelbeds', 302); }); // ====== Legacy → New (early shim; add ABOVE any gated legacy blocks) ====== Route::any('/admin/providers/hotelbeds{any?}', function(){ return redirect('/admin/verticals/hotels/providers/hotelbeds', 302); })->where('any','.*'); Route::any('/setup/p/hotelbeds{any?}', function(){ return redirect('/admin/verticals/hotels/providers/hotelbeds', 302); })->where('any','.*'); /** * ====================================================================== * ADMIN → VERTICALS → PROVIDERS (Unified, de‑duped, ungated for setup) * Change middleware to ['web','auth','can:admin'] once setup is done. * ====================================================================== */ // -------------------- Hotels providers -------------------- Route::middleware(['web']) ->prefix('admin/verticals/hotels/providers') ->name('admin.hotels.providers.') ->group(function () { // Hotelbeds (real controller) Route::get('hotelbeds', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'show']) ->name('hotelbeds.show'); Route::post('hotelbeds', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'save']) ->name('hotelbeds.save'); Route::match(['get','post'], 'hotelbeds/test', [\App\Http\Controllers\Admin\Providers\HotelbedsController::class, 'test']) ->name('hotelbeds.test'); // Common placeholders you can wire next Route::view('amadeus', 'admin.verticals.hotels.providers.amadeus')->name('amadeus'); Route::view('expedia', 'admin.verticals.hotels.providers.expedia')->name('expedia'); // EPS Route::view('booking', 'admin.verticals.hotels.providers.booking')->name('booking'); // Booking.com Route::view('priceline', 'admin.verticals.hotels.providers.priceline')->name('priceline'); Route::view('despegar', 'admin.verticals.hotels.providers.despegar')->name('despegar'); Route::view('hoteldo', 'admin.verticals.hotels.providers.hoteldo')->name('hoteldo'); Route::view('siteminder', 'admin.verticals.hotels.providers.siteminder')->name('siteminder'); Route::view('omnibees', 'admin.verticals.hotels.providers.omnibees')->name('omnibees'); Route::view('dedge', 'admin.verticals.hotels.providers.dedge')->name('dedge'); // D-EDGE Route::view('derbysoft', 'admin.verticals.hotels.providers.derbysoft')->name('derbysoft'); }); // -------------------- Flights providers -------------------- Route::middleware(['web']) ->prefix('admin/verticals/flights/providers') ->name('admin.flights.providers.') ->group(function () { Route::view('amadeus', 'admin.verticals.flights.providers.amadeus')->name('amadeus'); Route::view('sabre', 'admin.verticals.flights.providers.sabre')->name('sabre'); Route::view('travelport','admin.verticals.flights.providers.travelport')->name('travelport'); Route::view('kiwi', 'admin.verticals.flights.providers.kiwi')->name('kiwi'); Route::view('skyscanner','admin.verticals.flights.providers.skyscanner')->name('skyscanner'); Route::view('latam', 'admin.verticals.flights.providers.latam')->name('latam'); Route::view('gol', 'admin.verticals.flights.providers.gol')->name('gol'); }); // -------------------- Buses (Brazil) -------------------- Route::middleware(['web']) ->prefix('admin/verticals/buses/providers') ->name('admin.buses.providers.') ->group(function () { Route::view('clickbus', 'admin.verticals.buses.providers.clickbus')->name('clickbus'); Route::view('wemobi', 'admin.verticals.buses.providers.wemobi')->name('wemobi'); Route::view('guichevirtual', 'admin.verticals.buses.providers.guichevirtual')->name('guichevirtual'); }); // -------------------- Payments -------------------- Route::middleware(['web']) ->prefix('admin/payments/providers') ->name('admin.payments.providers.') ->group(function () { Route::view('paypal', 'admin.payments.providers.paypal')->name('paypal'); Route::view('mercadopago', 'admin.payments.providers.mercadopago')->name('mercadopago'); Route::view('pagseguro', 'admin.payments.providers.pagseguro')->name('pagseguro'); Route::view('pix', 'admin.payments.providers.pix')->name('pix'); Route::view('stripe', 'admin.payments.providers.stripe')->name('stripe'); }); /** * TEMP: Translation test */ Route::get('/zz/translate-test', function (\Illuminate\Http\Request $req) { $t = app(\App\Services\Translator\OpenAITranslator::class); $txt = $req->get('q', 'Bom dia, tudo bem?'); return response()->json([ 'src' => $txt, 'to' => 'en', 'out' => $t->translate($txt, 'en', 'pt'), ]); }); /** Admin i18n: translate via OpenAI (enable auth later) */ Route::post('/admin/i18n/translate', [\App\Http\Controllers\Admin\TranslatorController::class, 'translate'])->middleware(['web','auth','can:admin'])->name('admin.i18n.translate'); // Admin → Modules (Installer) Route::middleware(['web'])->prefix('admin/modules')->name('admin.modules.') ->group(function () { Route::get('/', [\App\Http\Controllers\Admin\ModulesController::class,'index'])->name('index'); Route::post('{slug}/install', [\App\Http\Controllers\Admin\ModulesController::class,'install'])->name('install'); Route::post('{slug}/enable', [\App\Http\Controllers\Admin\ModulesController::class,'enable'])->name('enable'); Route::post('{slug}/disable', [\App\Http\Controllers\Admin\ModulesController::class,'disable'])->name('disable'); Route::post('{slug}/uninstall', [\App\Http\Controllers\Admin\ModulesController::class,'uninstall'])->name('uninstall'); }); // ==== Admin → Module Installer actions (enable/disable/install/delete) ==== Route::middleware(['web','auth','can:admin']) ->prefix('admin/modules') ->name('admin.modules.') ->group(function () { Route::get('/', [\App\Http\Controllers\Admin\ModulesController::class,'index'])->name('index'); Route::post('{slug}/enable', [\App\Http\Controllers\Admin\ModulesController::class,'enable'])->name('enable'); Route::post('{slug}/disable', [\App\Http\Controllers\Admin\ModulesController::class,'disable'])->name('disable'); // Install will run migrations/seeds that live inside the module Route::post('{slug}/install', [\App\Http\Controllers\Admin\ModulesController::class,'install'])->name('install'); // Hard delete (optional): removes module folder (if allowed) Route::delete('{slug}', [\App\Http\Controllers\Admin\ModulesController::class,'destroy'])->name('destroy'); }); /** * Admin → Modules (Installer) * NOTE: switch to ['web','auth','can:admin'] when auth/Gate is stable */ Route::middleware(['web'])->prefix('admin/modules')->name('admin.modules.')->group(function () { Route::get('/', [\App\Http\Controllers\Admin\ModulesController::class, 'index'])->name('index'); Route::post('/{slug}/install', [\App\Http\Controllers\Admin\ModulesController::class, 'install'])->name('install'); Route::post('/{slug}/enable', [\App\Http\Controllers\Admin\ModulesController::class, 'enable'])->name('enable'); Route::post('/{slug}/disable', [\App\Http\Controllers\Admin\ModulesController::class, 'disable'])->name('disable'); Route::delete('/{slug}', [\App\Http\Controllers\Admin\ModulesController::class, 'destroy'])->name('destroy'); }); /** * ------------------------------------------------- * ADMIN → Modules (Installer) * ------------------------------------------------- */ Route::middleware(['web','auth','can:admin']) ->prefix('admin/modules') ->name('admin.modules.') ->group(function () { Route::get('/', [\App\Http\Controllers\Admin\ModulesController::class, 'index'])->name('index'); Route::post('/install/{slug}', [\App\Http\Controllers\Admin\ModulesController::class, 'install'])->name('install'); Route::post('/enable/{slug}', [\App\Http\Controllers\Admin\ModulesController::class, 'enable'])->name('enable'); Route::post('/disable/{slug}', [\App\Http\Controllers\Admin\ModulesController::class, 'disable'])->name('disable'); Route::delete('/{slug}', [\App\Http\Controllers\Admin\ModulesController::class, 'destroy'])->name('destroy'); // ZIP upload installer Route::post('/upload', [\App\Http\Controllers\Admin\ModulesController::class, 'uploadZip']) ->name('upload'); }); /** * White-Label placeholder (fix 404) */ Route::middleware(['web','auth','can:admin']) ->get('/admin/whitelabel', fn() => view('admin.whitelabel.index')) ->name('admin.whitelabel.index'); Route::middleware(['web','auth','can:admin']) ->prefix('admin/modules') ->name('admin.modules.') ->group(function () { Route::get('/', [\App\Http\Controllers\Admin\ModulesController::class,'index'])->name('index'); Route::post('/{slug}/install', [\App\Http\Controllers\Admin\ModulesController::class,'install'])->name('install'); Route::post('/{slug}/enable', [\App\Http\Controllers\Admin\ModulesController::class,'enable'])->name('enable'); Route::post('/{slug}/disable', [\App\Http\Controllers\Admin\ModulesController::class,'disable'])->name('disable'); Route::delete('/{slug}', [\App\Http\Controllers\Admin\ModulesController::class,'destroy'])->name('destroy'); }); Route::middleware(['web','auth','can:admin']) ->prefix('admin/modules') ->name('admin.modules.') ->group(function () { Route::get('/', [\App\Http\Controllers\Admin\ModulesController::class,'index'])->name('index'); Route::post('/{slug}/install', [\App\Http\Controllers\Admin\ModulesController::class,'install'])->name('install'); Route::post('/{slug}/enable', [\App\Http\Controllers\Admin\ModulesController::class,'enable'])->name('enable'); Route::post('/{slug}/disable', [\App\Http\Controllers\Admin\ModulesController::class,'disable'])->name('disable'); Route::delete('/{slug}', [\App\Http\Controllers\Admin\ModulesController::class,'destroy'])->name('destroy'); }); Route::middleware(['web','auth','can:admin']) ->prefix('admin/modules') ->name('admin.modules.') ->group(function () { Route::get('/', [\App\Http\Controllers\Admin\ModulesController::class,'index'])->name('index'); Route::post('/{slug}/install', [\App\Http\Controllers\Admin\ModulesController::class,'install'])->name('install'); Route::post('/{slug}/enable', [\App\Http\Controllers\Admin\ModulesController::class,'enable'])->name('enable'); Route::post('/{slug}/disable', [\App\Http\Controllers\Admin\ModulesController::class,'disable'])->name('disable'); Route::delete('/{slug}', [\App\Http\Controllers\Admin\ModulesController::class,'destroy'])->name('destroy'); }); Route::middleware(['web','auth','can:admin']) ->prefix('admin/modules') ->name('admin.modules.') ->group(function () { Route::get('/', [\App\Http\Controllers\Admin\ModulesController::class,'index'])->name('index'); Route::post('/{slug}/install', [\App\Http\Controllers\Admin\ModulesController::class,'install'])->name('install'); Route::post('/{slug}/enable', [\App\Http\Controllers\Admin\ModulesController::class,'enable'])->name('enable'); Route::post('/{slug}/disable', [\App\Http\Controllers\Admin\ModulesController::class,'disable'])->name('disable'); Route::delete('/{slug}', [\App\Http\Controllers\Admin\ModulesController::class,'destroy'])->name('destroy'); });