File: /home/u756937133/domains/swingersnest.com/public_html/routes/web.php
<?php
use App\Http\Controllers\Web\HomeController;
use App\Http\Controllers\Web\MessageController;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Artisan;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
// Clear Cache facade value:
Route::get('/clear', function () {
$exitCode = Artisan::call('cache:clear');
$exitCode = Artisan::call('optimize');
$exitCode = Artisan::call('route:cache');
$exitCode = Artisan::call('route:clear');
$exitCode = Artisan::call('view:clear');
$exitCode = Artisan::call('config:cache');
$exitCode = Artisan::call('config:clear');
return '<h1>Cache facade value cleared</h1>';
});
Route::get('/migrations', function () {
Artisan::call('migrate');
return 'Migrations executed successfully!';
});
Route::get('/seed', function () {
Artisan::call('db:seed', ['--force' => true]);
return 'Database seeded successfully!';
});
// Route::get('/update-created-by', function () {
// try {
// // Find admin user by email
// $admin = \App\Models\User::where('email', 'admin@gmail.com')->first();
// if (!$admin) {
// return '<h1 style="color: red;">Error: Admin user with email "admin@gmail.com" not found!</h1>';
// }
// // Update all users' created_by field to admin ID
// // Exclude the admin itself
// $updated = \App\Models\User::where('id', '!=', $admin->id)
// ->update(['created_by' => $admin->id]);
// return '<h1 style="color: green;">Success!</h1>
// <p>Updated <strong>' . $updated . '</strong> users with created_by = ' . $admin->id . ' (Admin: ' . $admin->name . ' - ' . $admin->email . ')</p>
// <p><a href="/">Go to Home</a></p>';
// } catch (\Exception $e) {
// return '<h1 style="color: red;">Error: ' . $e->getMessage() . '</h1>';
// }
// })->name('update.created-by');
Route::get('/rotate-users-online', function () {
try {
// Get all users where created_by is not null
$users = \App\Models\User::whereNotNull('created_by')
->where('is_active', true)
->orderBy('id')
->get();
$totalUsers = $users->count();
if ($totalUsers == 0) {
return '<h1 style="color: orange;">No users found with created_by field set!</h1>
<p>Please run <a href="/update-created-by">/update-created-by</a> first.</p>';
}
// Calculate 30% of users to be online per hour
$usersPerHour = (int) ceil($totalUsers * 0.30);
// Get current hour (0-23) and current time
$currentHour = (int) now()->format('H');
$currentTime = now();
$todayStart = $currentTime->copy()->startOfDay();
// Set all users offline first (only last_seen_at, let existing system handle scheduled_offline_at)
\App\Models\User::whereNotNull('created_by')
->where('is_active', true)
->update([
'last_seen_at' => now()->subHours(10) // Set to offline (more than 5 minutes ago)
]);
// Create schedule for all 24 hours using deterministic round-robin
$userIds = $users->pluck('id')->toArray();
$totalUserIds = count($userIds);
$schedule = [];
// For each hour (0-23), calculate which users should be online
for ($hour = 0; $hour < 24; $hour++) {
$onlineUserIds = [];
// Use round-robin to select users for this hour
// This ensures even distribution and rotation
for ($i = 0; $i < $usersPerHour; $i++) {
// Calculate index using modulo to cycle through users
$userIndex = ($hour * $usersPerHour + $i) % $totalUserIds;
$onlineUserIds[] = $userIds[$userIndex];
}
// Remove duplicates (in case of wrap-around)
$onlineUserIds = array_unique($onlineUserIds);
// If we have fewer users than needed due to duplicates, fill with additional users
while (count($onlineUserIds) < $usersPerHour && count($onlineUserIds) < $totalUserIds) {
$additionalIndex = (count($onlineUserIds) + $hour * 10) % $totalUserIds;
if (!in_array($userIds[$additionalIndex], $onlineUserIds)) {
$onlineUserIds[] = $userIds[$additionalIndex];
} else {
break; // Avoid infinite loop
}
}
$hourStart = $todayStart->copy()->addHours($hour);
$hourEnd = $hourStart->copy()->addHour();
$schedule[$hour] = [
'user_ids' => array_slice($onlineUserIds, 0, $usersPerHour),
'start' => $hourStart,
'end' => $hourEnd,
'count' => min(count($onlineUserIds), $usersPerHour)
];
}
// Apply schedule: Set users online for current hour and schedule for remaining hours
$currentHourData = $schedule[$currentHour];
$currentOnlineUserIds = $currentHourData['user_ids'];
// Set current hour users online (only update last_seen_at)
// Existing activity system will handle making them offline automatically
\App\Models\User::whereIn('id', $currentOnlineUserIds)
->update([
'last_seen_at' => now() // Set to now (within 5 minutes = online)
]);
$currentOnlineCount = count($currentOnlineUserIds);
// Build schedule display table
$scheduleHtml = '<table style="width: 100%; border-collapse: collapse; margin: 20px 0; font-size: 12px;">
<tr style="background: #333; color: white;">
<th style="padding: 8px; border: 1px solid #555; text-align: left;">Hour</th>
<th style="padding: 8px; border: 1px solid #555; text-align: left;">Time Range</th>
<th style="padding: 8px; border: 1px solid #555; text-align: center;">Users</th>
<th style="padding: 8px; border: 1px solid #555; text-align: center;">Status</th>
</tr>';
foreach ($schedule as $hour => $data) {
$isCurrent = $hour == $currentHour;
$isPast = $hour < $currentHour;
$rowStyle = $isCurrent
? 'background: #2d5016; color: #90ee90; font-weight: bold;'
: ($isPast ? 'background: #1a1a1a; color: #666;' : 'background: #1a1a1a; color: #ccc;');
$status = $isCurrent
? '<span style="color: #90ee90;">● ACTIVE NOW</span>'
: ($isPast ? '<span style="color: #666;">Past</span>' : '<span style="color: #4a9eff;">Scheduled</span>');
$scheduleHtml .= '<tr style="' . $rowStyle . '">
<td style="padding: 6px; border: 1px solid #555;">' . str_pad($hour, 2, '0', STR_PAD_LEFT) . ':00</td>
<td style="padding: 6px; border: 1px solid #555;">' . $data['start']->format('H:i') . ' - ' . $data['end']->format('H:i') . '</td>
<td style="padding: 6px; border: 1px solid #555; text-align: center;">' . $data['count'] . '</td>
<td style="padding: 6px; border: 1px solid #555; text-align: center;">' . $status . '</td>
</tr>';
}
$scheduleHtml .= '</table>';
return '<h1 style="color: green;">Daily User Rotation Scheduled!</h1>
<div style="margin: 20px 0; padding: 15px; background: #1a1a1a; border-radius: 8px;">
<h2 style="color: #90ee90; margin-top: 0;">Statistics:</h2>
<ul style="list-style: none; padding: 0; color: #ccc;">
<li style="margin: 8px 0;"><strong style="color: white;">Total Users:</strong> ' . $totalUsers . '</li>
<li style="margin: 8px 0;"><strong style="color: white;">Users Online Per Hour (30%):</strong> <span style="color: #90ee90;">' . $usersPerHour . ' users</span></li>
<li style="margin: 8px 0;"><strong style="color: white;">Current Hour:</strong> ' . str_pad($currentHour, 2, '0', STR_PAD_LEFT) . ':00 - ' . str_pad($currentHour + 1, 2, '0', STR_PAD_LEFT) . ':00</li>
<li style="margin: 8px 0; color: #90ee90;"><strong>Users Online Now:</strong> ' . $currentOnlineCount . '</li>
<li style="margin: 8px 0;"><strong style="color: white;">Schedule Duration:</strong> Complete 24-hour day</li>
</ul>
</div>
<div style="margin: 20px 0;">
<h3 style="color: white;">24-Hour Schedule:</h3>
' . $scheduleHtml . '
</div>
<div style="margin: 20px 0; padding: 15px; background: #1a1a1a; border-radius: 8px; color: #ccc;">
<h3 style="color: white; margin-top: 0;">How it works:</h3>
<p>✅ <strong style="color: #90ee90;">30% of users</strong> (' . $usersPerHour . ' users) will be online each hour</p>
<p>✅ Users rotate throughout the day using round-robin distribution</p>
<p>✅ Schedule is calculated for the <strong style="color: white;">entire day</strong> (24 hours)</p>
<p>✅ Current hour is <strong style="color: #90ee90;">active now</strong> - users are online</p>
<p>✅ Users will automatically go offline based on existing activity system (no activity = offline)</p>
<p>⚠️ <em style="color: #ffa500;">Note: For automatic hourly rotation, set up a cron job to run this route every hour. The existing activity system will handle making users offline automatically.</em></p>
</div>
<p style="margin-top: 20px;"><a href="/" style="color: #4a9eff; text-decoration: none; margin-right: 15px;">← Go to Home</a> <a href="/rotate-users-online" style="color: #4a9eff; text-decoration: none;">🔄 Refresh Schedule</a></p>';
} catch (\Exception $e) {
return '<h1 style="color: red;">Error: ' . $e->getMessage() . '</h1>
<pre style="background: #f5f5f5; padding: 10px; margin: 10px 0;">' . $e->getTraceAsString() . '</pre>';
}
})->name('rotate.users.online');
// Language Switcher Route
Route::get('/language/{locale}', [\App\Http\Controllers\Web\LanguageController::class, 'switch'])->name('language.switch');
// Home (Landing Page)
// Route::get('/', [HomeController::class, 'home1'])->name('home');
// Home2 Page
Route::get('/', [HomeController::class, 'home2'])->name('home');
// Dashboard - feeds layout with separate routes: /dashboard/feeds, /dashboard/members, etc.
Route::middleware('auth')->prefix('dashboard')->name('dashboard')->group(function () {
Route::get('/feeds', [\App\Http\Controllers\Web\FeedsController::class, 'index'])->name('.feeds');
Route::get('/members', [\App\Http\Controllers\Web\FeedsController::class, 'members'])->name('.members');
Route::get('/api/members', [\App\Http\Controllers\Web\FeedsController::class, 'membersApi'])->name('.api.members');
Route::get('/online-users', [\App\Http\Controllers\Web\FeedsController::class, 'onlineUsers'])->name('.online-users');
Route::get('/speed-dates', [\App\Http\Controllers\Web\FeedsController::class, 'speedDates'])->name('.speed-dates');
Route::get('/slow-dates', [\App\Http\Controllers\Web\FeedsController::class, 'slowDates'])->name('.slow-dates');
Route::get('/visits', [\App\Http\Controllers\Web\FeedsController::class, 'visits'])->name('.visits');
Route::get('/pending-tasks', [\App\Http\Controllers\Web\FeedsController::class, 'pendingTasks'])->name('.pending-tasks');
Route::get('/search', [\App\Http\Controllers\Web\FeedsController::class, 'search'])->name('.search');
Route::get('/upgrade', [\App\Http\Controllers\Web\FeedsController::class, 'upgrade'])->name('.upgrade');
Route::get('/groups', [\App\Http\Controllers\Web\FeedsController::class, 'groups'])->name('.groups');
Route::get('/photos-videos', [\App\Http\Controllers\Web\FeedsController::class, 'photosVideos'])->name('.photos-videos');
Route::get('/events-travel', [\App\Http\Controllers\Web\FeedsController::class, 'eventsTravel'])->name('.events-travel');
Route::get('/pages', [\App\Http\Controllers\Web\FeedsController::class, 'pages'])->name('.pages');
});
// Explicit friends route so dashboard.friends is always registered (avoids RouteNotFoundException when cache is stale)
Route::middleware('auth')->get('/dashboard/friends', [\App\Http\Controllers\Web\FeedsController::class, 'friends'])->name('dashboard.friends');
// User Profile (Public)
Route::get('/user/{username}', [HomeController::class, 'showProfile'])->name('user.profile');
Route::get('/user/{username}/load-more-members', [HomeController::class, 'loadMoreMembers'])->name('user.profile.load-more');
// Messaging
Route::middleware('auth')->group(function () {
Route::get('/messages', [MessageController::class, 'index'])->name('messages.index');
Route::get('/messages/recent', [MessageController::class, 'recent'])->name('messages.recent');
Route::get('/messages/{user}', [MessageController::class, 'show'])->name('messages.show')->whereNumber('user');
Route::post('/messages/{user}', [MessageController::class, 'store'])->name('messages.store')->whereNumber('user');
Route::get('/messages/{user}/poll', [MessageController::class, 'poll'])->name('messages.poll')->whereNumber('user');
Route::post('/messages/{user}/clear', [MessageController::class, 'clearChat'])->name('messages.clear')->whereNumber('user');
Route::delete('/messages/message/{message}', [MessageController::class, 'destroy'])->name('messages.destroy')->whereNumber('message');
Route::post('/messages/{user}/block', [MessageController::class, 'blockUser'])->name('messages.block')->whereNumber('user');
});
// Likes and Dislikes
Route::middleware('auth')->group(function () {
Route::post('/users/{user}/like', [\App\Http\Controllers\Web\LikeController::class, 'toggleLike'])->name('users.like')->whereNumber('user');
Route::post('/users/{user}/dislike', [\App\Http\Controllers\Web\LikeController::class, 'toggleDislike'])->name('users.dislike')->whereNumber('user');
});
// Posts & Stories
Route::middleware('auth')->group(function () {
Route::post('/posts', [\App\Http\Controllers\Web\PostController::class, 'store'])->name('posts.store');
Route::put('/posts/{post}', [\App\Http\Controllers\Web\PostController::class, 'update'])->name('posts.update')->whereNumber('post');
Route::delete('/posts/{post}', [\App\Http\Controllers\Web\PostController::class, 'destroy'])->name('posts.destroy')->whereNumber('post');
Route::post('/posts/{post}/like', [\App\Http\Controllers\Web\PostController::class, 'toggleLike'])->name('posts.like')->whereNumber('post');
Route::post('/posts/{post}/comment', [\App\Http\Controllers\Web\PostController::class, 'addComment'])->name('posts.comment')->whereNumber('post');
Route::put('/posts/comments/{comment}', [\App\Http\Controllers\Web\PostController::class, 'updateComment'])->name('posts.comments.update')->whereNumber('comment');
Route::delete('/posts/comments/{comment}', [\App\Http\Controllers\Web\PostController::class, 'destroyComment'])->name('posts.comments.destroy')->whereNumber('comment');
Route::post('/posts/comments/{comment}/react', [\App\Http\Controllers\Web\PostController::class, 'reactToComment'])->name('posts.comments.react')->whereNumber('comment');
Route::get('/posts/user/{user}', [\App\Http\Controllers\Web\PostController::class, 'getUserPosts'])->name('posts.user')->whereNumber('user');
Route::post('/stories', [\App\Http\Controllers\Web\FeedsController::class, 'storeStory'])->name('stories.store');
Route::delete('/stories/{story}', [\App\Http\Controllers\Web\FeedsController::class, 'destroyStory'])->name('stories.destroy')->whereNumber('story');
Route::post('/stories/{story}/react', [\App\Http\Controllers\Web\FeedsController::class, 'reactToStory'])->name('stories.react')->whereNumber('story');
});
// ============================================================================
// PAGE MANAGEMENT ROUTES
// ============================================================================
// These routes handle dynamic page management system where admins can create
// unlimited pages with custom slugs, SEO settings, and templates.
// Pages are stored in the 'pages' table and can be accessed via direct slug URLs.
// Static Page Routes (with database fallback)
// These routes provide named routes for common pages while still using database content
Route::get('/about', [\App\Http\Controllers\Web\PageController::class, 'about'])->name('about');
Route::get('/contact', [\App\Http\Controllers\Web\PageController::class, 'contact'])->name('contact');
Route::post('/contact', [\App\Http\Controllers\Web\PageController::class, 'contactSubmit'])->name('contact.submit');
Route::get('/partner-program', [\App\Http\Controllers\Web\PageController::class, 'partnerProgram'])->name('partner-program');
Route::post('/partner-program', [\App\Http\Controllers\Web\PageController::class, 'partnerProgramSubmit'])->name('partner-program.submit');
Route::get('/privacy', [\App\Http\Controllers\Web\PageController::class, 'privacy'])->name('privacy');
Route::get('/terms', [\App\Http\Controllers\Web\PageController::class, 'terms'])->name('terms');
// Dynamic Page Route (Alternative format: /page/{slug})
// Example: domain.com/page/waqar, domain.com/page/custom-page
Route::get('/page/{slug}', [\App\Http\Controllers\Web\PageController::class, 'show'])->name('page.show');
// ============================================================================
// BLOG ROUTES
// ============================================================================
// Blog listing and single post routes
Route::get('/blog', [\App\Http\Controllers\Web\BlogController::class, 'index'])->name('blog.index');
Route::get('/blog/{slug}', [\App\Http\Controllers\Web\BlogController::class, 'show'])->name('blog.show');
Route::get('/blog/category/{slug}', [\App\Http\Controllers\Web\BlogController::class, 'category'])->name('blog.category');
Route::get('/blog/tag/{slug}', [\App\Http\Controllers\Web\BlogController::class, 'tag'])->name('blog.tag');
// ============================================================================
// LISTING ROUTES
// ============================================================================
// Listing routes - clubs directory
// IMPORTANT: Order matters! More specific routes must come before less specific ones
Route::get('/listings', [\App\Http\Controllers\Web\ListingController::class, 'index'])->name('listings.index');
Route::get('/listings/clubs', [\App\Http\Controllers\Web\ListingController::class, 'getClubs'])->name('listings.clubs');
Route::get('/listings/country/{countrySlug}/state/{stateSlug}', [\App\Http\Controllers\Web\ListingController::class, 'state'])->name('listings.state');
Route::middleware('auth')->group(function () {
Route::get('/listings/create', [\App\Http\Controllers\Web\ListingController::class, 'create'])->name('listings.create');
Route::post('/listings', [\App\Http\Controllers\Web\ListingController::class, 'store'])->name('listings.store');
Route::post('/listings/{club}/review', [\App\Http\Controllers\Web\ListingController::class, 'storeReview'])->name('listings.review.store')->where('club', '[0-9]+');
});
Route::get('/listings/{clubSlug}', [\App\Http\Controllers\Web\ListingController::class, 'show'])->name('listings.show');
// Username and Email validation (accessible to all)
Route::get('/check-username', [\App\Http\Controllers\Auth\RegisterController::class, 'checkUsername'])->name('check-username');
Route::get('/check-email', [\App\Http\Controllers\Auth\RegisterController::class, 'checkEmail'])->name('check-email');
// Authentication Routes
Route::middleware('guest')->group(function () {
Route::get('/login', [\App\Http\Controllers\Auth\LoginController::class, 'showLoginForm'])->name('login');
Route::post('/login', [\App\Http\Controllers\Auth\LoginController::class, 'login']);
Route::get('/register', [\App\Http\Controllers\Auth\RegisterController::class, 'showRegistrationForm'])->name('register');
Route::post('/register', [\App\Http\Controllers\Auth\RegisterController::class, 'register']);
Route::get('/forgot-password', [\App\Http\Controllers\Auth\ForgotPasswordController::class, 'showLinkRequestForm'])->name('password.request');
Route::post('/forgot-password', [\App\Http\Controllers\Auth\ForgotPasswordController::class, 'sendResetLinkEmail'])->name('password.email');
Route::get('/reset-password/{token}', [\App\Http\Controllers\Auth\ResetPasswordController::class, 'showResetForm'])->name('password.reset');
Route::post('/reset-password', [\App\Http\Controllers\Auth\ResetPasswordController::class, 'reset'])->name('password.store');
Route::post('/send-otp', [\App\Http\Controllers\Auth\RegisterController::class, 'sendOTP'])->name('send-otp');
Route::post('/verify-otp', [\App\Http\Controllers\Auth\RegisterController::class, 'verifyOTP'])->name('verify-otp');
Route::post('/resend-otp', [\App\Http\Controllers\Auth\RegisterController::class, 'resendOTP'])->name('resend-otp');
Route::post('/store-registration-data', [\App\Http\Controllers\Auth\RegisterController::class, 'storeRegistrationData'])->name('store-registration-data');
Route::post('/store-category', [\App\Http\Controllers\Auth\RegisterController::class, 'storeCategory'])->name('store-category');
});
Route::post('/logout', [\App\Http\Controllers\Auth\LoginController::class, 'logout'])->name('logout')->middleware('auth');
// Account Routes (authenticated users)
Route::middleware('auth')->prefix('account')->name('account.')->group(function () {
Route::get('/profile', [\App\Http\Controllers\Web\ProfileController::class, 'index'])->name('profile');
Route::get('/profile/settings', [\App\Http\Controllers\Web\ProfileController::class, 'settings'])->name('profile.settings');
Route::get('/profile/edit', [\App\Http\Controllers\Web\ProfileController::class, 'edit'])->name('profile.edit');
Route::put('/profile', [\App\Http\Controllers\Web\ProfileController::class, 'update'])->name('profile.update');
Route::delete('/profile', [\App\Http\Controllers\Web\ProfileController::class, 'destroy'])->name('profile.delete');
Route::get('/coins/transactions', [\App\Http\Controllers\Web\ProfileController::class, 'coinTransactions'])->name('coins.transactions');
});
// Subscription Routes (authenticated users)
Route::middleware('auth')->prefix('subscriptions')->name('subscriptions.')->group(function () {
Route::get('/', [\App\Http\Controllers\Web\SubscriptionController::class, 'index'])->name('index');
Route::get('/checkout/{plan}', [\App\Http\Controllers\Web\SubscriptionController::class, 'checkout'])->name('checkout');
Route::post('/process-payment/{plan}', [\App\Http\Controllers\Web\SubscriptionController::class, 'processPayment'])->name('process-payment');
Route::get('/success/{subscription}', [\App\Http\Controllers\Web\SubscriptionController::class, 'success'])->name('success');
Route::get('/stripe/success/{subscription}', [\App\Http\Controllers\Web\SubscriptionController::class, 'stripeSuccess'])->name('stripe.success');
Route::post('/cancel/{subscription}', [\App\Http\Controllers\Web\SubscriptionController::class, 'cancel'])->name('cancel');
});
// Stripe Webhook (no auth required, uses signature verification)
Route::post('/stripe/webhook', [\App\Http\Controllers\Web\SubscriptionController::class, 'stripeWebhook'])->name('stripe.webhook');
// Album Routes (authenticated users)
Route::middleware('auth')->prefix('albums')->name('albums.')->group(function () {
Route::post('/create', [\App\Http\Controllers\AlbumController::class, 'store'])->name('create');
Route::get('/{id}', [\App\Http\Controllers\AlbumController::class, 'show'])->name('show');
Route::post('/{id}/verify-password', [\App\Http\Controllers\AlbumController::class, 'verifyPassword'])->name('verify-password');
Route::post('/{id}/upload-images', [\App\Http\Controllers\AlbumController::class, 'uploadImages'])->name('upload-images');
Route::delete('/{id}', [\App\Http\Controllers\AlbumController::class, 'destroy'])->name('destroy');
Route::delete('/{albumId}/images/{imageId}', [\App\Http\Controllers\AlbumController::class, 'deleteImage'])->name('delete-image');
});
// Editor Routes (restricted to editors - limited access)
Route::middleware(['auth', 'editor'])->prefix('editor')->name('editor.')->group(function () {
// Dashboard
Route::get('/', [\App\Http\Controllers\Admin\DashboardController::class, 'index'])->name('dashboard');
// Users - Editors can manage users
Route::get('/users', [\App\Http\Controllers\Admin\UserController::class, 'index'])->name('users.index');
Route::get('/users/create', [\App\Http\Controllers\Admin\UserController::class, 'create'])->name('users.create');
Route::post('/users', [\App\Http\Controllers\Admin\UserController::class, 'store'])->name('users.store');
Route::get('/users/{user}', [\App\Http\Controllers\Admin\UserController::class, 'show'])->name('users.show');
Route::get('/users/{user}/edit', [\App\Http\Controllers\Admin\UserController::class, 'edit'])->name('users.edit');
Route::put('/users/{user}', [\App\Http\Controllers\Admin\UserController::class, 'update'])->name('users.update');
Route::delete('/users/{user}', [\App\Http\Controllers\Admin\UserController::class, 'destroy'])->name('users.destroy');
Route::get('/users/{user}/data', [\App\Http\Controllers\Admin\UserController::class, 'getData'])->name('users.data');
Route::post('/users/{user}/verify', [\App\Http\Controllers\Admin\UserController::class, 'verify'])->name('users.verify');
Route::post('/users/{user}/toggle-status', [\App\Http\Controllers\Admin\UserController::class, 'toggleStatus'])->name('users.toggle-status');
Route::post('/users/{user}/toggle-online-status', [\App\Http\Controllers\Admin\UserController::class, 'toggleOnlineStatus'])->name('users.toggle-online-status');
Route::post('/users/{user}/set-scheduled-offline', [\App\Http\Controllers\Admin\UserController::class, 'setScheduledOffline'])->name('users.set-scheduled-offline');
Route::post('/users/{user}/toggle-message-block', [\App\Http\Controllers\Admin\UserController::class, 'toggleMessageBlock'])->name('users.toggle-message-block');
// Pages Management - Editors can manage pages
Route::resource('pages', \App\Http\Controllers\Admin\PageController::class);
// Blog Management - Editors can manage blogs
Route::resource('blog', \App\Http\Controllers\Admin\BlogController::class);
// Categories Management - Editors can manage categories
Route::resource('categories', \App\Http\Controllers\Admin\CategoryController::class);
// Tags Management - Editors can manage tags
Route::resource('tags', \App\Http\Controllers\Admin\TagController::class);
});
// Admin Routes (restricted to admins)
Route::middleware(['auth', 'admin'])->prefix('admin')->name('admin.')->group(function () {
Route::get('/', [\App\Http\Controllers\Admin\DashboardController::class, 'index'])->name('dashboard');
Route::post('/rotate-users-online', [\App\Http\Controllers\Admin\DashboardController::class, 'rotateUsersOnline'])->name('rotate-users-online');
// Users
Route::resource('users', \App\Http\Controllers\Admin\UserController::class);
Route::get('/users/{user}/data', [\App\Http\Controllers\Admin\UserController::class, 'getData'])->name('users.data');
Route::post('/users/{user}/verify', [\App\Http\Controllers\Admin\UserController::class, 'verify'])->name('users.verify');
Route::post('/users/{user}/toggle-status', [\App\Http\Controllers\Admin\UserController::class, 'toggleStatus'])->name('users.toggle-status');
Route::post('/users/{user}/toggle-online-status', [\App\Http\Controllers\Admin\UserController::class, 'toggleOnlineStatus'])->name('users.toggle-online-status');
Route::post('/users/{user}/set-scheduled-offline', [\App\Http\Controllers\Admin\UserController::class, 'setScheduledOffline'])->name('users.set-scheduled-offline');
Route::post('/users/{user}/toggle-message-block', [\App\Http\Controllers\Admin\UserController::class, 'toggleMessageBlock'])->name('users.toggle-message-block');
// Verification
Route::get('/verification', [\App\Http\Controllers\Admin\VerificationController::class, 'index'])->name('verification.index');
Route::post('/verification/{verification}/approve', [\App\Http\Controllers\Admin\VerificationController::class, 'approve'])->name('verification.approve');
Route::post('/verification/{verification}/reject', [\App\Http\Controllers\Admin\VerificationController::class, 'reject'])->name('verification.reject');
// Listings Management
Route::get('/listings', [\App\Http\Controllers\Admin\ListingController::class, 'index'])->name('listings.index');
Route::get('/listings/{club}', [\App\Http\Controllers\Admin\ListingController::class, 'show'])->name('listings.show');
Route::post('/listings/{club}/approve', [\App\Http\Controllers\Admin\ListingController::class, 'approve'])->name('listings.approve');
Route::post('/listings/{club}/reject', [\App\Http\Controllers\Admin\ListingController::class, 'reject'])->name('listings.reject');
Route::delete('/listings/{club}', [\App\Http\Controllers\Admin\ListingController::class, 'destroy'])->name('listings.destroy');
// Location Management (Countries, States, Cities)
Route::resource('countries', \App\Http\Controllers\Admin\CountryController::class);
Route::resource('states', \App\Http\Controllers\Admin\StateController::class);
Route::resource('cities', \App\Http\Controllers\Admin\CityController::class);
Route::get('/states-by-country/{countryId}', function ($countryId) {
$states = \App\Models\State::where('country_id', $countryId)
->where('is_active', true)
->orderBy('name')
->get(['id', 'name']);
return response()->json($states);
})->name('states-by-country');
// Photo Moderation
Route::get('/photo-moderation', [\App\Http\Controllers\Admin\PhotoModerationController::class, 'index'])->name('photo-moderation.index');
Route::post('/photo-moderation/{id}/approve', [\App\Http\Controllers\Admin\PhotoModerationController::class, 'approve'])->name('photo-moderation.approve');
Route::post('/photo-moderation/{id}/reject', [\App\Http\Controllers\Admin\PhotoModerationController::class, 'reject'])->name('photo-moderation.reject');
// Content Management
Route::get('/content-management', [\App\Http\Controllers\Admin\ContentManagementController::class, 'index'])->name('content-management.index');
Route::get('/content-management/{id}/edit', [\App\Http\Controllers\Admin\ContentManagementController::class, 'edit'])->name('content-management.edit');
Route::put('/content-management/{id}', [\App\Http\Controllers\Admin\ContentManagementController::class, 'update'])->name('content-management.update');
Route::get('/content-management/{id}/preview', [\App\Http\Controllers\Admin\ContentManagementController::class, 'preview'])->name('content-management.preview');
// Registration Control
Route::get('/registration-control', [\App\Http\Controllers\Admin\RegistrationControlController::class, 'index'])->name('registration-control.index');
Route::put('/registration-control', [\App\Http\Controllers\Admin\RegistrationControlController::class, 'update'])->name('registration-control.update');
// Reported Users
Route::get('/reported-users', [\App\Http\Controllers\Admin\ReportedUsersController::class, 'index'])->name('reported-users.index');
Route::get('/reported-users/{id}/review', [\App\Http\Controllers\Admin\ReportedUsersController::class, 'review'])->name('reported-users.review');
// Slides Management
Route::resource('slides', \App\Http\Controllers\Admin\SlideController::class);
// Pages Management
Route::resource('pages', \App\Http\Controllers\Admin\PageController::class);
// Blog Management
Route::resource('blog', \App\Http\Controllers\Admin\BlogController::class);
// Categories Management
Route::resource('categories', \App\Http\Controllers\Admin\CategoryController::class);
// Tags Management
Route::resource('tags', \App\Http\Controllers\Admin\TagController::class);
// Subscription Plans Management
Route::resource('subscription-plans', \App\Http\Controllers\Admin\SubscriptionPlanController::class)->except(['show']);
// Language Translations Management
Route::get('/languages', [\App\Http\Controllers\Admin\LanguageController::class, 'index'])->name('languages.index');
Route::get('/languages/edit', [\App\Http\Controllers\Admin\LanguageController::class, 'edit'])->name('languages.edit');
Route::put('/languages/{locale}', [\App\Http\Controllers\Admin\LanguageController::class, 'update'])->name('languages.update')->where('locale', '[a-z]{2}');
// Media Library
Route::get('/media', [\App\Http\Controllers\Admin\MediaController::class, 'index'])->name('media.index');
Route::post('/media', [\App\Http\Controllers\Admin\MediaController::class, 'store'])->name('media.store');
Route::get('/media/all', [\App\Http\Controllers\Admin\MediaController::class, 'getAll'])->name('media.all');
Route::get('/media/{filename}', [\App\Http\Controllers\Admin\MediaController::class, 'show'])->name('media.show')->where('filename', '[^/]+');
Route::put('/media/{filename}', [\App\Http\Controllers\Admin\MediaController::class, 'update'])->name('media.update')->where('filename', '[^/]+');
Route::delete('/media/{filename}', [\App\Http\Controllers\Admin\MediaController::class, 'destroy'])->name('media.destroy')->where('filename', '[^/]+');
// Database Management
Route::get('/database', [\App\Http\Controllers\Admin\DatabaseController::class, 'index'])->name('database.index');
Route::get('/database/download', [\App\Http\Controllers\Admin\DatabaseController::class, 'download'])->name('database.download');
Route::get('/database/clear', [\App\Http\Controllers\Admin\DatabaseController::class, 'clear'])->name('database.clear');
Route::post('/database/clear', [\App\Http\Controllers\Admin\DatabaseController::class, 'clear'])->name('database.clear.store');
Route::get('/database/{table}', [\App\Http\Controllers\Admin\DatabaseController::class, 'show'])->name('database.show')->where('table', '[a-z0-9_]+');
// Backup Management
Route::get('/backup', [\App\Http\Controllers\Admin\BackupController::class, 'index'])->name('backup.index');
Route::post('/backup/files', [\App\Http\Controllers\Admin\BackupController::class, 'createFilesBackup'])->name('backup.files.create');
Route::get('/backup/download/complete', [\App\Http\Controllers\Admin\BackupController::class, 'downloadCompleteProject'])->name('backup.download.complete');
Route::get('/backup/download/{filename}', [\App\Http\Controllers\Admin\BackupController::class, 'downloadFilesBackup'])->name('backup.download.files')->where('filename', '[a-z0-9._-]+');
Route::delete('/backup/{filename}', [\App\Http\Controllers\Admin\BackupController::class, 'deleteBackup'])->name('backup.delete')->where('filename', '[a-z0-9._-]+');
// .htaccess Management
Route::get('/htaccess', [\App\Http\Controllers\Admin\HtaccessController::class, 'index'])->name('htaccess.index');
Route::put('/htaccess', [\App\Http\Controllers\Admin\HtaccessController::class, 'update'])->name('htaccess.update');
Route::post('/htaccess/reset', [\App\Http\Controllers\Admin\HtaccessController::class, 'reset'])->name('htaccess.reset');
// Logs Management
Route::get('/logs', [\App\Http\Controllers\Admin\LogController::class, 'index'])->name('logs.index');
Route::get('/logs/download/{filename}', [\App\Http\Controllers\Admin\LogController::class, 'download'])->name('logs.download')->where('filename', '[a-z0-9._-]+');
Route::post('/logs/clear', [\App\Http\Controllers\Admin\LogController::class, 'clear'])->name('logs.clear');
Route::post('/logs/delete', [\App\Http\Controllers\Admin\LogController::class, 'delete'])->name('logs.delete');
// Payment Gateways
Route::get('/payment-gateways', [\App\Http\Controllers\Admin\PaymentGatewayController::class, 'index'])->name('payment-gateways.index');
Route::put('/payment-gateways/{gateway}', [\App\Http\Controllers\Admin\PaymentGatewayController::class, 'update'])->name('payment-gateways.update')->where('gateway', '[a-z_]+');
// Settings
Route::prefix('settings')->name('settings.')->group(function () {
Route::get('/general', [\App\Http\Controllers\Admin\SettingsController::class, 'general'])->name('general');
Route::post('/general', [\App\Http\Controllers\Admin\SettingsController::class, 'updateGeneral'])->name('general.update');
Route::post('/password', [\App\Http\Controllers\Admin\SettingsController::class, 'updatePassword'])->name('password.update');
Route::get('/website', [\App\Http\Controllers\Admin\SettingsController::class, 'website'])->name('website');
Route::post('/website', [\App\Http\Controllers\Admin\SettingsController::class, 'updateWebsite'])->name('website.update');
Route::get('/robots', [\App\Http\Controllers\Admin\SettingsController::class, 'robots'])->name('robots');
Route::post('/robots', [\App\Http\Controllers\Admin\SettingsController::class, 'updateRobots'])->name('robots.update');
Route::get('/sitemap', [\App\Http\Controllers\Admin\SettingsController::class, 'sitemap'])->name('sitemap');
Route::post('/sitemap', [\App\Http\Controllers\Admin\SettingsController::class, 'updateSitemap'])->name('sitemap.update');
});
// Deployment
Route::get('/deployment', [\App\Http\Controllers\Admin\DeploymentController::class, 'index'])->name('deployment.index');
Route::post('/deployment', [\App\Http\Controllers\Admin\DeploymentController::class, 'deploy'])->name('deployment.deploy');
});
// Public Deployment Route (with token authentication)
Route::post('/deploy/{token}', [\App\Http\Controllers\Admin\DeploymentController::class, 'deployPublic'])->name('deployment.public');
// API Routes
Route::get('/api/health', function () {
return response()->json(['status' => 'ok']);
});
// ============================================================================
// DYNAMIC PAGE ROUTE (Direct Slug Access)
// ============================================================================
// This route enables direct slug access for pages created in the admin panel.
// Example: domain.com/waqar, domain.com/custom-page, domain.com/terms
//
// IMPORTANT: This route MUST be placed at the very end of the routes file
// to avoid conflicts with other routes. It acts as a catch-all for page slugs.
//
// How it works:
// 1. Checks if the slug is in the reserved routes list (if yes, returns 404)
// 2. Queries the database for an active page with matching slug
// 3. If found, displays the page using the selected template
// 4. If not found, returns 404
//
// Reserved routes are protected to prevent conflicts with system routes.
Route::get('/{slug}', function ($slug) {
// List of reserved routes that should not be treated as page slugs
$reservedRoutes = [
'login',
'register',
'logout',
'dashboard',
'messages',
'account',
'albums',
'api',
'admin',
'editor',
'clear',
'migrations',
'seed',
'rotate-users-online',
'check-username',
'check-email',
'forgot-password',
'reset-password',
'send-otp',
'verify-otp',
'resend-otp',
'store-category',
'about',
'contact',
'privacy',
'terms',
'page',
'user',
'deploy',
'language',
'home2',
'partner-program',
'feeds'
];
// If slug matches a reserved route, return 404
if (in_array($slug, $reservedRoutes)) {
abort(404);
}
// Check if a page exists with this slug in the database
$page = \App\Models\Page::where('slug', $slug)
->where('is_active', true)
->first();
// If page found, display it using the PageController
if ($page) {
return app(\App\Http\Controllers\Web\PageController::class)->show($slug);
}
// If no page found, return 404
abort(404);
})->where('slug', '[a-z0-9-]+'); // Only allow alphanumeric and hyphens in slugs