=== File: api.php === get('/user', function (Request $request) { return $request->user(); }); // API routes for MVP (protected by auth:sanctum middleware) Route::middleware('auth:sanctum')->group(function () { // Trips Route::get('/trips', function (Request $request) { return $request->user()->trips()->latest()->get(); }); Route::get('/trips/{trip}', function (Request $request, Trip $trip) { // Check if user is member of the trip if (!$trip->members()->where('users.id', $request->user()->id)->exists() && $trip->creator_id !== $request->user()->id) { return response()->json(['error' => 'Unauthorized'], 403); } return $trip->load(['creator', 'members', 'itineraries', 'savingsWallet']); }); // Trip members Route::get('/trips/{trip}/members', function (Request $request, Trip $trip) { // Check if user is member of the trip if (!$trip->members()->where('users.id', $request->user()->id)->exists() && $trip->creator_id !== $request->user()->id) { return response()->json(['error' => 'Unauthorized'], 403); } return $trip->members; }); // Savings wallet Route::get('/trips/{trip}/savings', function (Request $request, Trip $trip) { // Check if user is member of the trip if (!$trip->members()->where('users.id', $request->user()->id)->exists() && $trip->creator_id !== $request->user()->id) { return response()->json(['error' => 'Unauthorized'], 403); } return $trip->savingsWallet->load('transactions'); }); // Notifications Route::get('/notifications', function (Request $request) { return $request->user()->notifications()->latest()->take(20)->get(); }); }); === File: bundle_code.py === import os EXCLUDED_DIRS = {"node_modules", "vendor", "tests", "storage"} EXCLUDED_EXTENSIONS = {".jpg", ".jpeg", ".png", ".gif", ".webp", ".pdf", ".xml"} EXCLUDED_FILES = {"package-lock.json", "composer.lock"} OUTPUT_FILE = "bundled_code.txt" def is_hidden(path): return any(part.startswith('.') for part in path.split(os.sep)) def should_skip_file(filepath, root): filename = os.path.basename(filepath) ext = os.path.splitext(filename)[1].lower() # Skip hidden files if is_hidden(os.path.relpath(filepath)): return True # Skip excluded files and extensions if ext in EXCLUDED_EXTENSIONS or filename in EXCLUDED_FILES: return True # Skip files in excluded dirs for part in os.path.relpath(root).split(os.sep): if part in EXCLUDED_DIRS: return True # Skip empty files if os.path.getsize(filepath) == 0: return True return False with open(OUTPUT_FILE, "w", encoding="utf-8") as output: for root, dirs, files in os.walk("."): # Skip hidden directories dirs[:] = [d for d in dirs if not d.startswith(".") and d not in EXCLUDED_DIRS] for file in files: filepath = os.path.join(root, file) if should_skip_file(filepath, root): continue try: with open(filepath, "r", encoding="utf-8") as f: output.write(f"\n\n=== File: {os.path.relpath(filepath)} ===\n\n") output.write(f.read()) except Exception as e: print(f"Skipped {filepath} due to error: {e}") === File: auth.php === group(function () { Route::middleware('guest')->group(function () { // Registration routes with explicit CSRF handling Route::get('/register', function () { return view('auth.register'); })->name('register'); Route::post('/register', [RegisteredUserController::class, 'store']) ->middleware(['csrf']); // Login routes with explicit CSRF handling Route::get('/login', function () { return view('auth.login'); })->name('login'); Route::post('/login', [AuthenticatedSessionController::class, 'store']) ->middleware(['csrf']); // Social auth routes - excluded from CSRF verification Route::get('/auth/{provider}', [SocialAuthController::class, 'redirectToProvider']) ->name('auth.provider') ->where('provider', 'google|facebook'); Route::get('/auth/{provider}/callback', [SocialAuthController::class, 'handleProviderCallback']) ->name('auth.callback') ->where('provider', 'google|facebook') ->withoutMiddleware(['csrf']); // Direct named routes for social auth Route::get('auth/google', [SocialAuthController::class, 'redirectToProvider']) ->name('auth.google') ->defaults('provider', 'google'); Route::get('auth/facebook', [SocialAuthController::class, 'redirectToProvider']) ->name('auth.facebook') ->defaults('provider', 'facebook'); }); // Auth required routes Route::middleware('auth')->group(function () { Route::post('/logout', [AuthenticatedSessionController::class, 'destroy']) ->name('logout') ->middleware(['csrf']); }); }); === File: console.php === comment(Inspiring::quote()); })->purpose('Display an inspiring quote'); === File: csrf-debug.php === environment('local')) { Route::get('/debug-csrf', function (Request $request) { return response()->json([ 'csrf_token' => csrf_token(), 'session_id' => session()->getId(), 'session_data' => [ 'has_token' => session()->has('_token'), 'token_matches' => session()->token() === csrf_token(), ], 'cookies' => $request->cookies->all(), 'session_config' => [ 'driver' => config('session.driver'), 'lifetime' => config('session.lifetime'), 'cookie' => config('session.cookie'), 'path' => config('session.path'), 'domain' => config('session.domain'), 'secure' => config('session.secure'), 'same_site' => config('session.same_site'), ], 'middleware_applied' => array_map(function ($middleware) { return get_class($middleware); }, app(\Illuminate\Contracts\Http\Kernel::class)->getMiddleware()), ]); }); // Test form submission Route::view('/csrf-test-form', 'csrf-test-form'); Route::post('/csrf-test-submit', function () { return ['success' => true, 'message' => 'Form submitted successfully!']; })->name('csrf.test.submit'); } === File: web.php === environment('local')) { require __DIR__.'/csrf-debug.php'; } // Language switcher route Route::get('language/{locale}', function ($locale) { app()->make(App\Services\LanguageService::class)->setLanguage($locale); return back(); })->name('language.switch'); // Landing page route Route::get('/', function () { return view('welcome'); })->name('home'); // Public pages // Product Route::get('/features', function () { return view('pages.features'); })->name('features'); Route::get('/pricing', function () { return view('pages.pricing'); })->name('pricing'); Route::get('/mobile-app', function () { return view('pages.mobile-app'); })->name('mobile-app'); Route::get('/destinations', function () { return view('pages.destinations'); })->name('destinations'); // Resources Route::get('/travel-guides', function () { return view('pages.travel-guides'); })->name('travel-guides'); Route::get('/trip-ideas', function () { return view('pages.trip-ideas'); })->name('trip-ideas'); Route::get('/blog', function () { return view('pages.blog'); })->name('blog'); Route::get('/support', function () { return view('pages.support'); })->name('support'); // Company Route::get('/about', function () { return view('pages.about'); })->name('about'); Route::get('/careers', function () { return view('pages.careers'); })->name('careers'); Route::get('/press', function () { return view('pages.press'); })->name('press'); Route::get('/contact', function () { return view('pages.contact'); })->name('contact'); // Legal Route::get('/privacy', function () { return view('pages.privacy'); })->name('privacy'); Route::get('/terms', function () { return view('pages.terms'); })->name('terms'); Route::get('/cookies', function () { return view('pages.cookies'); })->name('cookies'); // API Routes (for AJAX requests in trip creation) Route::prefix('api')->name('api.')->group(function () { Route::get('suggestions/get/{id}', function ($id) { // Mock API for the demo return response()->json([ 'success' => true, 'id' => $id, 'name' => $id == 1 ? 'Kecak Fire Dance at Uluwatu' : 'Seafood Dinner at Jimbaran Bay', 'location' => $id == 1 ? 'Uluwatu Temple' : 'Jimbaran Beach', 'cost' => $id == 1 ? 15 : 30, 'category' => $id == 1 ? 'cultural' : 'food', 'description' => $id == 1 ? 'Experience the mesmerizing Kecak Fire Dance at sunset with dramatic clifftop ocean views.' : 'Enjoy fresh seafood grilled to perfection while watching the sunset over Jimbaran Bay.', ]); })->name('suggestions.get'); }); // Dashboard Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard'); // Profile routes Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit'); Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update'); Route::delete('/profile', [ProfileController::class, 'destroy'])->name('profile.destroy'); // Trip routes Route::get('/trips', [TripController::class, 'index'])->name('trips.index'); Route::post('/trips', [TripController::class, 'store'])->name('trips.store'); // Trip detail routes Route::get('/trips/{trip}', [TripController::class, 'show'])->name('trips.show'); Route::get('/trips/{trip}/edit', [TripController::class, 'edit'])->name('trips.edit'); Route::put('/trips/{trip}', [TripController::class, 'update'])->name('trips.update'); Route::delete('/trips/{trip}', [TripController::class, 'destroy'])->name('trips.destroy'); Route::post('/trips/{trip}/invite', [TripController::class, 'invite'])->name('trips.invite'); // Trip Planning Routes (Main entry point) Route::get('/plan', function() { // Force clear any previous trip planning session data to start fresh Session::forget([ 'selected_trip_type', 'selected_trip_template', 'selected_destination', 'trip_details', 'trip_activities', 'trip_invites' ]); // Use the view that exists in your project return view('livewire.pages.trips.create'); })->name('trips.plan'); // Make sure create route also clears session Route::get('/plan/create', function() { // Force clear any previous trip planning session data to start fresh Session::forget([ 'selected_trip_type', 'selected_trip_template', 'selected_destination', 'trip_details', 'trip_activities', 'trip_invites' ]); // Use the view that exists in your project return view('livewire.pages.trips.create'); })->name('trips.create'); // Pre-planned trip templates - NEW ROUTES FOR DUAL PATH Route::get('/trip-templates', [TripController::class, 'browseTemplates'])->name('trips.templates'); Route::get('/trip-templates/{template}', [TripController::class, 'showTemplate'])->name('trips.templates.show'); // Trip Planning Steps - Direct access routes for debugging if needed Route::get('/plan/type-selection', function () { return view('livewire.trips.trip-type-selection'); })->name('trips.type-selection'); Route::get('/plan/destination', function () { return view('livewire.trips.destination-selection'); })->name('trips.destination'); Route::get('/plan/pre-planned', function () { return view('livewire.trips.pre-planned-trip-selection'); })->name('trips.pre-planned'); Route::get('/plan/details', function () { return view('livewire.trips.trip-details'); })->name('trips.details'); Route::get('/plan/invite', function () { return view('livewire.trips.invite-friends'); })->name('trips.invite-friends'); Route::get('/plan/itinerary', function () { return view('livewire.trips.itinerary-planning'); })->name('trips.itinerary-planning'); Route::get('/plan/review', function () { return view('livewire.trips.review'); })->name('trips.review'); // Map View Route::get('/trips/{trip}/map', [TripController::class, 'map'])->name('trips.map'); // Finalize Trip Route::get('/trips/{trip}/finalize', [TripController::class, 'finalize'])->name('trips.finalize'); // Trip Downloads and Exports Route::get('/trips/{trip}/download', [TripController::class, 'download'])->name('trips.download'); Route::get('/trips/{trip}/print', [TripController::class, 'print'])->name('trips.print'); // Trip Review Route::get('/trips/{trip}/review', [TripController::class, 'review'])->name('trips.review'); // Itineraries Route::get('/trips/{trip}/itinerary', [ItineraryController::class, 'index'])->name('trips.itinerary'); Route::get('/trips/{trip}/itinerary/day/{day}', [ItineraryController::class, 'day'])->name('trips.itinerary.day'); Route::get('/trips/{trip}/itinerary/edit', [ItineraryController::class, 'edit'])->name('trips.itinerary.edit'); // Activities Route::post('/trips/{trip}/day/{day}', [ActivityController::class, 'store'])->name('trips.activities.store'); Route::put('/activities/{activity}', [ActivityController::class, 'update'])->name('trips.activities.update'); Route::delete('/activities/{activity}', [ActivityController::class, 'destroy'])->name('trips.activities.destroy'); // Savings Wallet Route::get('/trips/{trip}/savings', [SavingsWalletController::class, 'show'])->name('trips.savings'); Route::get('/trips/{trip}/savings/start', [SavingsWalletController::class, 'start'])->name('trips.savings.start'); Route::post('/trips/{trip}/savings/contribute', [SavingsWalletController::class, 'contribute'])->name('trips.savings.contribute'); Route::post('/trips/{trip}/savings/withdraw', [SavingsWalletController::class, 'withdraw'])->name('trips.savings.withdraw'); Route::get('/trips/{trip}/savings/transactions', [SavingsWalletController::class, 'transactions'])->name('trips.savings.transactions'); // Notifications Route::get('/notifications', [NotificationController::class, 'index'])->name('notifications.index'); Route::post('/notifications/{notification}/read', [NotificationController::class, 'markAsRead'])->name('notifications.read'); Route::post('/notifications/read-all', [NotificationController::class, 'markAllAsRead'])->name('notifications.read-all'); // Trip helpers Route::get('/api/suggestions/{id}', [ActivityController::class, 'getSuggestion'])->name('api.suggestions.get');