Your IP : 216.73.216.79


Current Path : /var/www/html/dynaweb-cms-v1/routes/
Upload File :
Current File : /var/www/html/dynaweb-cms-v1/routes/web.php

<?php

use App\Http\Helpers\SettingHelper;
use App\Http\Controllers\Backend\ActivityLogController;
use App\Http\Controllers\Backend\Auth\AuthenticatedSessionController;
use App\Http\Controllers\Backend\Auth\EmailVerificationController;
use App\Http\Controllers\Backend\BackendUserController;
use App\Http\Controllers\Backend\FrontendUserController;
use App\Http\Controllers\Backend\PermissionController;
use App\Http\Controllers\Backend\ContentApplicationController;
use App\Http\Controllers\Backend\ContentArticleController;
use App\Http\Controllers\Backend\ContentDownloadController;
use App\Http\Controllers\Backend\ContentSliderController;
use App\Http\Controllers\Backend\ContentImageController;
use App\Http\Controllers\Backend\ContentVideoController;
use App\Http\Controllers\Backend\ContentPhotoGalleryController;
use App\Http\Controllers\Backend\ContentPhotoListController;
use App\Http\Controllers\Backend\AppTranslationController;
use App\Http\Controllers\Backend\ContentFeedbackController;
use App\Http\Controllers\Backend\ContentPublicHolidayController;
use App\Http\Controllers\Backend\ContentCalendarController;
use App\Http\Controllers\Backend\ContentDirectoryDepartmentController;
use App\Http\Controllers\Backend\ContentDirectoryStaffController;
use App\Http\Controllers\Backend\AutoPermissionController;
use App\Http\Controllers\Backend\RefController;
use App\Http\Controllers\Backend\RoleController;
use App\Http\Controllers\Backend\MenuController;
use App\Http\Controllers\Backend\MenuCategoryController;
use App\Http\Controllers\Backend\FrontendMenuController;
use App\Http\Controllers\Backend\RouteController;
use App\Http\Controllers\Backend\VisitorController;
use App\Http\Controllers\Backend\FrontendSiteController;
use App\Http\Controllers\Backend\FrontendComponentController;
use App\Http\Controllers\Backend\FrontendPageController;
use App\Http\Controllers\Backend\BackendHomeController;
use App\Http\Controllers\Backend\DataDashboardController;
use App\Http\Controllers\Backend\GlobalSearchController;
use App\Http\Controllers\Backend\ArtisanGenController;
use App\Http\Controllers\Backend\ThemeRuleController;
use App\Http\Controllers\Backend\ThemeSettingController;
use App\Http\Controllers\FrontendSiteRenderController;
use App\Http\Controllers\Frontend\Auth\VerifyEmailController;
use App\Http\Controllers\Frontend\Auth\LoginController;
use App\Http\Controllers\Frontend\Auth\RegisterController;
use App\Models\Backend\BackendUser;
use Illuminate\Support\Facades\Route;


Route::get('/admin', function () {
    return redirect()->route('admin.home');
})->middleware('auth:admin');

//auto redirect ke login user bila /user
Route::get('/user', function () {
    return redirect('/' . SettingHelper::authSiteSlug() . '/login-web');
});


/*
|--------------------------------------------------------------------------
| ADMIN GUEST (NOT LOGIN)
|--------------------------------------------------------------------------
*/
Route::prefix('admin')->middleware('guest:admin')->group(function () {

    // Route::redirect('/', '/admin/login'); // Redirect /admin to /admin/login

    // login page
    Route::get('/login', [AuthenticatedSessionController::class, 'create'])
        ->name('admin.login');

    // login submit
    Route::post('/login', [AuthenticatedSessionController::class, 'store'])
        ->middleware('throttle:5,1')
        ->name('admin.login.submit');

    Route::get('/forgot-password', [AuthenticatedSessionController::class, 'forgotPassword'])
        ->name('admin.password.request');

    Route::post('/forgot-password', [AuthenticatedSessionController::class, 'sendResetLink'])
        ->name('admin.password.email');

    Route::get('/reset-password/{token}', [AuthenticatedSessionController::class, 'resetPasswordForm'])
        ->name('admin.password.reset');

    Route::post('/reset-password', [AuthenticatedSessionController::class, 'resetPassword'])
        ->name('admin.password.update');
});

//verify email backend user
// Email verification Laravel =
// “System hantar link signed URL → user click → system verify ID + hash → mark email_verified_at → redirect”
Route::get('/email/verify/{id}/{hash}', function (Request $request, $id, $hash) {

    $user = BackendUser::findOrFail($id); // ✅ FIX HERE

    if (!hash_equals($hash, sha1($user->getEmailForVerification()))) {
        abort(403, 'Invalid signature');
    }

    if (!$user->hasVerifiedEmail()) {
        $user->markEmailAsVerified();
    }

    return redirect()->route('admin.login')
        ->with('success', 'Email verified successfully. Please login.');
})->middleware(['signed'])->name('verification.verify');

/*
|--------------------------------------------------------------------------
| ADMIN AUTH (LOGIN REQUIRED)
|--------------------------------------------------------------------------
*/
Route::prefix('admin')->middleware('auth:admin')->group(function () {

    // Handle /admin → redirect ke dashboard untuk yang dah login
    // Route::redirect('/', '/admin/dashboard');

    // logout
    Route::post('/logout', [AuthenticatedSessionController::class, 'destroy'])
        ->name('admin.logout');

    /*
    |--------------------------------------------------------------------------
    | EMAIL VERIFICATION
    |--------------------------------------------------------------------------
    */
    Route::get('/email/verify', [EmailVerificationController::class, 'notice'])
        ->name('admin.verification.notice');

    Route::post('/email/verification-notification', [EmailVerificationController::class, 'resend'])
        ->middleware('throttle:6,1')
        ->name('admin.verification.send');

    Route::get('/home', [BackendHomeController::class, 'index'])->name('admin.home');

    Route::get('/global-search', [GlobalSearchController::class, 'search'])->name('admin.global-search');

    // backend-user CRUD
    Route::controller(BackendUserController::class)->group(function () {

        Route::get('/backend-user', 'index')->middleware('permission:backend-user.view,admin')->name('backend-user.index');
        Route::get('/backend-user/create', 'create')->middleware('permission:backend-user.create,admin')->name('backend-user.create');
        Route::post('/backend-user', 'store')->middleware('permission:backend-user.create,admin')->name('backend-user.store');
        Route::get('/backend-user/{id}', 'show')->middleware('permission:backend-user.view,admin')->name('backend-user.show');
        Route::get('/backend-user/{id}/edit', 'edit')->middleware('permission:backend-user.update,admin')->name('backend-user.edit');
        Route::put('/backend-user/{id}', 'update')->middleware('permission:backend-user.update,admin')->name('backend-user.update');
        Route::delete('/backend-user/{id}', 'destroy')->middleware('permission:backend-user.delete,admin')->name('backend-user.destroy');

        // Admin profile (current user) edit
        Route::get('/profile/edit', 'editProfile')->name('admin.profile.edit');
        Route::put('/profile', 'updateProfile')->name('admin.profile.update');
    });

    // frontend-user CRUD
    Route::controller(FrontendUserController::class)->group(function () {

        Route::get('/frontend-user', 'index')->middleware('permission:frontend-user.view,admin')->name('frontend-user.index');
        Route::get('/frontend-user/create', 'create')->middleware('permission:frontend-user.create,admin')->name('frontend-user.create');
        Route::post('/frontend-user', 'store')->middleware('permission:frontend-user.create,admin')->name('frontend-user.store');
        Route::get('/frontend-user/{id}', 'show')->middleware('permission:frontend-user.view,admin')->name('frontend-user.show');
        Route::get('/frontend-user/{id}/edit', 'edit')->middleware('permission:frontend-user.update,admin')->name('frontend-user.edit');
        Route::put('/frontend-user/{id}', 'update')->middleware('permission:frontend-user.update,admin')->name('frontend-user.update');
        Route::delete('/frontend-user/{id}', 'destroy')->middleware('permission:frontend-user.delete,admin')->name('frontend-user.destroy');
    });

    // ref CRUD
    Route::controller(RefController::class)->group(function () {

        Route::get('/ref', 'index')->middleware('permission:ref.view,admin')->name('ref.index');
        Route::get('/ref/create', 'create')->middleware('permission:ref.create,admin')->name('ref.create');
        Route::post('/ref', 'store')->middleware('permission:ref.create,admin')->name('ref.store');
        // Route::get('/ref/{id}', 'show')->middleware('permission:ref.view,admin')->name('ref.show');
        Route::get('/ref/{id}/edit', 'edit')->middleware('permission:ref.update,admin')->name('ref.edit');
        Route::put('/ref/{id}', 'update')->middleware('permission:ref.update,admin')->name('ref.update');
        Route::delete('/ref/{id}', 'destroy')->middleware('permission:ref.delete,admin')->name('ref.destroy');
        Route::post('/ref/reorder', 'reorder')->middleware('permission:ref.update,admin')->name('ref.reorder');
    });

    // content-application CRUD
    Route::controller(ContentApplicationController::class)->group(function () {

        Route::get('/content-application', 'index')->middleware('permission:content-application.view,admin')->name('content-application.index');
        Route::get('/content-application/create', 'create')->middleware('permission:content-application.create,admin')->name('content-application.create');
        Route::post('/content-application', 'store')->middleware('permission:content-application.create,admin')->name('content-application.store');
        Route::get('/content-application/{id}/edit', 'edit')->middleware('permission:content-application.update,admin')->name('content-application.edit');
        Route::put('/content-application/{id}', 'update')->middleware('permission:content-application.update,admin')->name('content-application.update');
        Route::delete('/content-application/{id}', 'destroy')->middleware('permission:content-application.delete,admin')->name('content-application.destroy');
        Route::post('/content-application/reorder', 'reorder')->middleware('permission:content-application.update,admin')->name('content-application.reorder');
    });

    // content-article CRUD
    Route::controller(ContentArticleController::class)->group(function () {

        Route::get('/content-article', 'index')->middleware('permission:content-article.view,admin')->name('content-article.index');
        Route::get('/content-article/create', 'create')->middleware('permission:content-article.create,admin')->name('content-article.create');
        Route::post('/content-article', 'store')->middleware('permission:content-article.create,admin')->name('content-article.store');
        Route::get('/content-article/{id}/edit', 'edit')->middleware('permission:content-article.update,admin')->name('content-article.edit');
        Route::put('/content-article/{id}', 'update')->middleware('permission:content-article.update,admin')->name('content-article.update');
        Route::delete('/content-article/{id}', 'destroy')->middleware('permission:content-article.delete,admin')->name('content-article.destroy');
        Route::post('/content-article/reorder', 'reorder')->middleware('permission:content-article.update,admin')->name('content-article.reorder');
    });

    // content-download CRUD
    Route::controller(ContentDownloadController::class)->group(function () {
        Route::get('/content-download', 'index')->middleware('permission:content-download.view,admin')->name('content-download.index');
        Route::get('/content-download/create', 'create')->middleware('permission:content-download.create,admin')->name('content-download.create');
        Route::post('/content-download', 'store')->middleware('permission:content-download.create,admin')->name('content-download.store');
        Route::get('/content-download/{id}/edit', 'edit')->middleware('permission:content-download.update,admin')->name('content-download.edit');
        Route::put('/content-download/{id}', 'update')->middleware('permission:content-download.update,admin')->name('content-download.update');
        Route::delete('/content-download/{id}', 'destroy')->middleware('permission:content-download.delete,admin')->name('content-download.destroy');
        Route::get('/content-download/{id}/add-translation', 'addTranslation')->middleware('permission:content-download.update,admin')->name('content-download.add-translation');
        Route::delete('/content-download/translation/{id}', 'deleteTranslation')->middleware('permission:content-download.delete,admin')->name('content-download.delete-translation');
    });

    // content-slider CRUD
    Route::controller(ContentSliderController::class)->group(function () {

        Route::get('/content-slider', 'index')->middleware('permission:content-slider.view,admin')->name('content-slider.index');
        Route::get('/content-slider/create', 'create')->middleware('permission:content-slider.create,admin')->name('content-slider.create');
        Route::post('/content-slider', 'store')->middleware('permission:content-slider.create,admin')->name('content-slider.store');
        Route::get('/content-slider/{id}/edit', 'edit')->middleware('permission:content-slider.update,admin')->name('content-slider.edit');
        Route::put('/content-slider/{id}', 'update')->middleware('permission:content-slider.update,admin')->name('content-slider.update');
        Route::delete('/content-slider/{id}', 'destroy')->middleware('permission:content-slider.delete,admin')->name('content-slider.destroy');
        Route::post('/content-slider/reorder', 'reorder')->middleware('permission:content-slider.update,admin')->name('content-slider.reorder');
    });

    // content-video CRUD
    Route::controller(ContentVideoController::class)->group(function () {

        Route::get('/content-video', 'index')->middleware('permission:content-video.view,admin')->name('content-video.index');
        Route::get('/content-video/create', 'create')->middleware('permission:content-video.create,admin')->name('content-video.create');
        Route::post('/content-video', 'store')->middleware('permission:content-video.create,admin')->name('content-video.store');
        Route::get('/content-video/{id}/edit', 'edit')->middleware('permission:content-video.update,admin')->name('content-video.edit');
        Route::put('/content-video/{id}', 'update')->middleware('permission:content-video.update,admin')->name('content-video.update');
        Route::delete('/content-video/{id}', 'destroy')->middleware('permission:content-video.delete,admin')->name('content-video.destroy');
    });

    // content-image CRUD
    Route::controller(ContentImageController::class)->group(function () {

        Route::get('/content-image', 'index')->middleware('permission:content-image.view,admin')->name('content-image.index');
        Route::get('/content-image/create', 'create')->middleware('permission:content-image.create,admin')->name('content-image.create');
        Route::post('/content-image', 'store')->middleware('permission:content-image.create,admin')->name('content-image.store');
        Route::get('/content-image/{id}/edit', 'edit')->middleware('permission:content-image.update,admin')->name('content-image.edit');
        Route::put('/content-image/{id}', 'update')->middleware('permission:content-image.update,admin')->name('content-image.update');
        Route::delete('/content-image/{id}', 'destroy')->middleware('permission:content-image.delete,admin')->name('content-image.destroy');
        Route::get('/content-image/{id}/add-translation', 'addTranslation')->middleware('permission:content-image.update,admin')->name('content-image.add-translation');
        Route::delete('/content-image/translation/{id}', 'deleteTranslation')->middleware('permission:content-image.delete,admin')->name('content-image.delete-translation');
        Route::post('/content-image/reorder', 'reorder')->middleware('permission:content-image.update,admin')->name('content-image.reorder');
    });

    // content-photo-gallery CRUD
    Route::controller(ContentPhotoGalleryController::class)->group(function () {

        Route::get('/content-photo-gallery', 'index')->middleware('permission:content-photo-gallery.view,admin')->name('content-photo-gallery.index');
        Route::get('/content-photo-gallery/create', 'create')->middleware('permission:content-photo-gallery.create,admin')->name('content-photo-gallery.create');
        Route::post('/content-photo-gallery', 'store')->middleware('permission:content-photo-gallery.create,admin')->name('content-photo-gallery.store');
        Route::get('/content-photo-gallery/{id}/edit', 'edit')->middleware('permission:content-photo-gallery.update,admin')->name('content-photo-gallery.edit');
        Route::put('/content-photo-gallery/{id}', 'update')->middleware('permission:content-photo-gallery.update,admin')->name('content-photo-gallery.update');
        Route::delete('/content-photo-gallery/{id}', 'destroy')->middleware('permission:content-photo-gallery.delete,admin')->name('content-photo-gallery.destroy');
    });

    // content-photo-list CRUD
    Route::controller(ContentPhotoListController::class)->group(function () {

        Route::get('/content-photo-list', 'index')->middleware('permission:content-photo-list.view,admin')->name('content-photo-list.index');
        Route::get('/content-photo-list/create', 'create')->middleware('permission:content-photo-list.create,admin')->name('content-photo-list.create');
        Route::post('/content-photo-list', 'store')->middleware('permission:content-photo-list.create,admin')->name('content-photo-list.store');
        Route::post('/content-photo-list/bulk-upload', 'bulkStore')->middleware('permission:content-photo-list.create,admin')->name('content-photo-list.bulk-store');
        Route::get('/content-photo-list/{id}/edit', 'edit')->middleware('permission:content-photo-list.update,admin')->name('content-photo-list.edit');
        Route::put('/content-photo-list/{id}', 'update')->middleware('permission:content-photo-list.update,admin')->name('content-photo-list.update');
        Route::delete('/content-photo-list/{id}', 'destroy')->middleware('permission:content-photo-list.delete,admin')->name('content-photo-list.destroy');
        Route::post('/content-photo-list/reorder', 'reorder')->middleware('permission:content-photo-list.update,admin')->name('content-photo-list.reorder');
    });

    // app-translation CRUD
    Route::controller(AppTranslationController::class)->group(function () {

        Route::get('/app-translation', 'index')->middleware('permission:app-translation.view,admin')->name('app-translation.index');
        Route::get('/app-translation/create', 'create')->middleware('permission:app-translation.create,admin')->name('app-translation.create');
        Route::post('/app-translation', 'store')->middleware('permission:app-translation.create,admin')->name('app-translation.store');
        Route::get('/app-translation/{id}/edit', 'edit')->middleware('permission:app-translation.update,admin')->name('app-translation.edit');
        Route::put('/app-translation/{id}', 'update')->middleware('permission:app-translation.update,admin')->name('app-translation.update');
        Route::delete('/app-translation/{id}', 'destroy')->middleware('permission:app-translation.delete,admin')->name('app-translation.destroy');
    });

    // Activity Log: view and API (requires admin auth)
    Route::get('/activity-log', [ActivityLogController::class, 'index'])->middleware('permission:activity-log.view,admin')->name('activity-log.index');
    // Route::get('/api/activity-logs', [ActivityLogController::class, 'indexApi'])->name('activity-log.api');

    Route::controller(RoleController::class)->group(function () {
        Route::get('/roles', 'index')->middleware('permission:role.view,admin')->name('roles.index');
        Route::get('/roles/create', 'create')->middleware('permission:role.create,admin')->name('roles.create');
        Route::post('/roles', 'store')->middleware('permission:role.create,admin')->name('roles.store');
        Route::get('/roles/{id}/edit', 'edit')->middleware('permission:role.update,admin')->name('roles.edit');
        Route::put('/roles/{id}', 'update')->middleware('permission:role.update,admin')->name('roles.update');
        Route::delete('/roles/{id}', 'destroy')->middleware('permission:role.delete,admin')->name('roles.destroy');
    });

    Route::controller(PermissionController::class)->group(function () {
        Route::get('/permissions', 'index')->middleware('permission:permission.view,admin')->name('permissions.index');
        Route::get('/permissions/create', 'create')->middleware('permission:permission.create,admin')->name('permissions.create');
        Route::post('/permissions', 'store')->middleware('permission:permission.create,admin')->name('permissions.store');
        Route::get('/permissions/{id}/edit', 'edit')->middleware('permission:permission.update,admin')->name('permissions.edit');
        Route::put('/permissions/{id}', 'update')->middleware('permission:permission.update,admin')->name('permissions.update');
        Route::delete('/permissions/{id}', 'destroy')->middleware('permission:permission.delete,admin')->name('permissions.destroy');
    });

    // auto-permissions
    Route::controller(AutoPermissionController::class)->group(function () {
        Route::get('/auto-permissions', 'index')->middleware('permission:permission.create,admin')->name('auto-permissions.index');
        Route::post('/auto-permissions/generate', 'generate')->middleware('permission:permission.create,admin')->name('auto-permissions.generate');
    });

    // Visitor
    Route::controller(VisitorController::class)->group(function () {
        Route::get('/visitor', 'index')->middleware('permission:visitor.view,admin')->name('visitor.index');
        Route::post('/visitor/toggle', 'toggle')->middleware('permission:visitor.update,admin')->name('visitor.toggle');
        Route::post('/visitor/clear', 'clear')->middleware('permission:visitor.delete,admin')->name('visitor.clear');
    });

    // Theme
    Route::controller(ThemeSettingController::class)->group(function () {
        Route::get('/theme/theme-setting', 'index')->middleware('permission:theme-setting.view,admin')->name('theme-setting.index');
        Route::post('/theme/theme-setting', 'save')->middleware('permission:theme-setting.update,admin')->name('theme-setting.save');
    });

    Route::controller(ThemeRuleController::class)->group(function () {
        Route::get('/theme/theme-rule', 'index')->middleware('permission:theme-rule.view,admin')->name('theme-rule.index');
        Route::get('/theme/theme-rule/create', 'create')->middleware('permission:theme-rule.create,admin')->name('theme-rule.create');
        Route::post('/theme/theme-rule', 'store')->middleware('permission:theme-rule.create,admin')->name('theme-rule.store');
        Route::get('/theme/theme-rule/{id}', 'show')->middleware('permission:theme-rule.view,admin')->name('theme-rule.show');
        Route::get('/theme/theme-rule/{id}/edit', 'edit')->middleware('permission:theme-rule.update,admin')->name('theme-rule.edit');
        Route::put('/theme/theme-rule/{id}', 'update')->middleware('permission:theme-rule.update,admin')->name('theme-rule.update');
        Route::post('/theme/theme-rule/delete', 'destroy')->middleware('permission:theme-rule.delete,admin')->name('theme-rule.destroy');
    });

    // Data Dashboard
    Route::controller(DataDashboardController::class)->group(function () {
        Route::get('/data-dashboard', 'index')->middleware('permission:data-dashboard.view,admin')->name('data-dashboard.index');
        Route::get('/data-dashboard/create', 'create')->middleware('permission:data-dashboard.create,admin')->name('data-dashboard.create');
        Route::post('/data-dashboard', 'store')->middleware('permission:data-dashboard.create,admin')->name('data-dashboard.store');
        Route::get('/data-dashboard/{id}/edit', 'edit')->middleware('permission:data-dashboard.update,admin')->name('data-dashboard.edit');
        Route::put('/data-dashboard/{id}', 'update')->middleware('permission:data-dashboard.update,admin')->name('data-dashboard.update');
        Route::delete('/data-dashboard/{id}', 'destroy')->middleware('permission:data-dashboard.delete,admin')->name('data-dashboard.destroy');
        Route::post('/data-dashboard/format', 'format')->middleware('permission:data-dashboard.create,admin')->name('data-dashboard.format');
        Route::post('/data-dashboard/lint', 'lint')->middleware('permission:data-dashboard.create,admin')->name('data-dashboard.lint');
        Route::post('/data-dashboard/reorder', 'reorder')->middleware('permission:data-dashboard.update,admin')->name('data-dashboard.reorder');
    });

    Route::controller(MenuController::class)->group(function () {
        Route::get('/backend-menu', 'index')->middleware('permission:backend-menu.view,admin')->name('backend-menu.index');
        Route::get('/backend-menu/create', 'create')->middleware('permission:backend-menu.create,admin')->name('backend-menu.create');
        Route::post('/backend-menu', 'store')->middleware('permission:backend-menu.create,admin')->name('backend-menu.store');
        Route::get('/backend-menu/{id}/edit', 'edit')->middleware('permission:backend-menu.update,admin')->name('backend-menu.edit');
        Route::put('/backend-menu/{id}', 'update')->middleware('permission:backend-menu.update,admin')->name('backend-menu.update');
        Route::delete('/backend-menu/{id}', 'destroy')->middleware('permission:backend-menu.delete,admin')->name('backend-menu.destroy');
        Route::post('/backend-menu/delete', 'delete')->middleware('permission:backend-menu.delete,admin')->name('backend-menu.delete');
        Route::post('/backend-menu/roledelete/{id}', 'roledelete')->middleware('permission:backend-menu.delete,admin')->name('backend-menu.roledelete');
        Route::match(['get', 'post'], '/backend-menu/assign-menu', 'assignMenu')->middleware('permission:backend-menu.update,admin')->name('backend-menu.assign');
        Route::get('/backend-menu/level/{id}/{role}/{pos}/{sort}', 'level')->middleware('permission:backend-menu.update,admin')->name('backend-menu.level');
        Route::get('/backend-menu/stub', 'stub')->middleware('permission:backend-menu.view,admin')->name('backend-menu.stub');
        Route::post('/backend-menu/disabled/{id}', 'disabled')->middleware('permission:backend-menu.update,admin')->name('backend-menu.disabled');
    });

    Route::controller(FrontendMenuController::class)->group(function () {
        Route::get('/frontend-menu', 'index')->middleware('permission:frontend-menu.view,admin')->name('frontend-menu.index');
        Route::get('/frontend-menu/create', 'create')->middleware('permission:frontend-menu.create,admin')->name('frontend-menu.create');
        Route::post('/frontend-menu', 'store')->middleware('permission:frontend-menu.create,admin')->name('frontend-menu.store');
        Route::get('/frontend-menu/{id}/edit', 'edit')->middleware('permission:frontend-menu.update,admin')->name('frontend-menu.edit');
        Route::put('/frontend-menu/{id}', 'update')->middleware('permission:frontend-menu.update,admin')->name('frontend-menu.update');
        Route::delete('/frontend-menu/{id}', 'destroy')->middleware('permission:frontend-menu.delete,admin')->name('frontend-menu.destroy');
        Route::post('/frontend-menu/delete', 'delete')->middleware('permission:frontend-menu.delete,admin')->name('frontend-menu.delete');
        Route::post('/frontend-menu/roledelete/{id}', 'roledelete')->middleware('permission:frontend-menu.delete,admin')->name('frontend-menu.roledelete');
        Route::match(['get', 'post'], '/frontend-menu/assign-menu', 'assignMenu')->middleware('permission:frontend-menu.update,admin')->name('frontend-menu.assign');
        Route::get('/frontend-menu/level/{id}/{role}/{pos}/{sort}', 'level')->middleware('permission:frontend-menu.update,admin')->name('frontend-menu.level');
        Route::post('/frontend-menu/disabled/{id}', 'disabled')->middleware('permission:frontend-menu.update,admin')->name('frontend-menu.disabled');
    Route::post('/frontend-menu/toggle-mapping/{id}', 'toggleMapping')->middleware('permission:frontend-menu.update,admin')->name('frontend-menu.toggle-mapping');
        Route::get('/frontend-menu/article-item', 'articleItem')->middleware('permission:frontend-menu.view,admin')->name('frontend-menu.article-item');
        Route::get('/frontend-menu/slider-item', 'sliderItem')->middleware('permission:frontend-menu.view,admin')->name('frontend-menu.slider-item');
    });

    Route::controller(MenuCategoryController::class)->group(function () {
        Route::get('/menu-category', 'index')->middleware('permission:menu-category.view,admin')->name('menu-category.index');
        Route::get('/menu-category/create', 'create')->middleware('permission:menu-category.create,admin')->name('menu-category.create');
        Route::post('/menu-category', 'store')->middleware('permission:menu-category.create,admin')->name('menu-category.store');
        Route::get('/menu-category/{id}/edit', 'edit')->middleware('permission:menu-category.update,admin')->name('menu-category.edit');
        Route::put('/menu-category/{id}', 'update')->middleware('permission:menu-category.update,admin')->name('menu-category.update');
        Route::delete('/menu-category/{id}', 'destroy')->middleware('permission:menu-category.delete,admin')->name('menu-category.destroy');
    });

    // ArtisanGen (DB-First Code Generator)
    Route::controller(ArtisanGenController::class)->prefix('artisan-gen')->name('artisangen.')->group(function () {
        Route::get('/', 'index')->middleware('permission:artisangen.view,admin')->name('index');

        Route::get('/migration', 'migration')->middleware('permission:artisangen.view,admin')->name('migration');
        Route::post('/preview-migration', 'previewMigration')->middleware('permission:artisangen.view,admin')->name('preview-migration');
        Route::post('/generate-migration', 'generateMigration')->middleware('permission:artisangen.view,admin')->name('generate-migration');
        Route::post('/run-migration', 'runMigration')->middleware('permission:artisangen.view,admin')->name('run-migration');

        Route::get('/model', 'model')->middleware('permission:artisangen.view,admin')->name('model');
        Route::post('/preview-model', 'previewModel')->middleware('permission:artisangen.view,admin')->name('preview-model');
        Route::post('/generate-model', 'generateModel')->middleware('permission:artisangen.view,admin')->name('generate-model');

        Route::get('/crud', 'crud')->middleware('permission:artisangen.view,admin')->name('crud');
        Route::post('/preview-crud', 'previewCrud')->middleware('permission:artisangen.view,admin')->name('preview-crud');
        Route::post('/generate-crud', 'generateCrud')->middleware('permission:artisangen.view,admin')->name('generate-crud');
    });

    //File Manager
    Route::get('/file-manager', function () {
        return view('backend.module.fileManager.index');
    })->middleware('permission:file.view,admin')->name('file-manager.index');

    /*
    |--------------------------------------------------------------------------
    | ROUTE MANAGEMENT
    |--------------------------------------------------------------------------
    */
    Route::controller(RouteController::class)->group(function () {
        Route::get('/routes', 'index')->middleware('permission:route.view,admin')->name('admin.routes.index');
        Route::get('/routes/create', 'create')->middleware('permission:route.create,admin')->name('admin.routes.create');
        Route::post('/routes', 'store')->middleware('permission:route.create,admin')->name('admin.routes.store');
        Route::get('/routes/{id}/edit', 'edit')->middleware('permission:route.update,admin')->name('admin.routes.edit');
        Route::put('/routes/{id}', 'update')->middleware('permission:route.update,admin')->name('admin.routes.update');
        Route::delete('/routes/{id}', 'destroy')->middleware('permission:route.delete,admin')->name('admin.routes.destroy');
        Route::post('/routes/generate', 'generate')->middleware('permission:route.create,admin')->name('admin.routes.generate');
        Route::get('/routes/sync', 'sync')->middleware('permission:route.create,admin')->name('admin.routes.sync');
        Route::get('/routes/refresh', 'refresh')->middleware('permission:route.view,admin')->name('admin.routes.refresh');
        Route::get('/routes/available', 'available')->middleware('permission:route.view,admin')->name('admin.routes.available');
        Route::post('/routes/bulk-delete', 'bulkDelete')->middleware('permission:route.delete,admin')->name('admin.routes.bulk_delete');
        Route::post('/routes/bulk-status/{status}', 'bulkStatus')->middleware('permission:route.update,admin')->name('admin.routes.bulk_status');
    });

    // content-feedback CRUD
    Route::controller(ContentFeedbackController::class)->group(function () {
        Route::get('/content-feedback', 'index')->middleware('permission:content-feedback.view,admin')->name('content-feedback.index');
        Route::get('/content-feedback/create', 'create')->middleware('permission:content-feedback.create,admin')->name('content-feedback.create');
        Route::post('/content-feedback', 'store')->middleware('permission:content-feedback.create,admin')->name('content-feedback.store');
        Route::get('/content-feedback/{id}/edit', 'edit')->middleware('permission:content-feedback.update,admin')->name('content-feedback.edit');
        Route::put('/content-feedback/{id}', 'update')->middleware('permission:content-feedback.update,admin')->name('content-feedback.update');
        Route::delete('/content-feedback/{id}', 'destroy')->middleware('permission:content-feedback.delete,admin')->name('content-feedback.destroy');
        Route::get('/content-feedback/export', 'export')->middleware('permission:content-feedback.export,admin')->name('content-feedback.export');
    });

    // content-public-holiday CRUD
    Route::controller(ContentPublicHolidayController::class)->group(function () {
        Route::get('/content-public-holiday', 'index')->middleware('permission:content-public-holiday.view,admin')->name('content-public-holiday.index');
        Route::get('/content-public-holiday/create', 'create')->middleware('permission:content-public-holiday.create,admin')->name('content-public-holiday.create');
        Route::post('/content-public-holiday', 'store')->middleware('permission:content-public-holiday.create,admin')->name('content-public-holiday.store');
        Route::get('/content-public-holiday/{id}/edit', 'edit')->middleware('permission:content-public-holiday.update,admin')->name('content-public-holiday.edit');
        Route::put('/content-public-holiday/{id}', 'update')->middleware('permission:content-public-holiday.update,admin')->name('content-public-holiday.update');
        Route::delete('/content-public-holiday/{id}', 'destroy')->middleware('permission:content-public-holiday.delete,admin')->name('content-public-holiday.destroy');
    });

    // content-calendar CRUD
    Route::controller(ContentCalendarController::class)->group(function () {
        Route::get('/content-calendar', 'index')->middleware('permission:content-calendar.view,admin')->name('content-calendar.index');
        Route::get('/content-calendar/create', 'create')->middleware('permission:content-calendar.create,admin')->name('content-calendar.create');
        Route::post('/content-calendar', 'store')->middleware('permission:content-calendar.create,admin')->name('content-calendar.store');
        Route::get('/content-calendar/{id}/edit', 'edit')->middleware('permission:content-calendar.update,admin')->name('content-calendar.edit');
        Route::put('/content-calendar/{id}', 'update')->middleware('permission:content-calendar.update,admin')->name('content-calendar.update');
        Route::delete('/content-calendar/{id}', 'destroy')->middleware('permission:content-calendar.delete,admin')->name('content-calendar.destroy');
    });

    // content-directory-department CRUD
    Route::controller(ContentDirectoryDepartmentController::class)->group(function () {
        Route::get('/content-directory-department', 'index')->middleware('permission:content-directory-department.view,admin')->name('content-directory-department.index');
        Route::get('/content-directory-department/create', 'create')->middleware('permission:content-directory-department.create,admin')->name('content-directory-department.create');
        Route::post('/content-directory-department', 'store')->middleware('permission:content-directory-department.create,admin')->name('content-directory-department.store');
        Route::get('/content-directory-department/{id}/edit', 'edit')->middleware('permission:content-directory-department.update,admin')->name('content-directory-department.edit');
        Route::put('/content-directory-department/{id}', 'update')->middleware('permission:content-directory-department.update,admin')->name('content-directory-department.update');
        Route::delete('/content-directory-department/{id}', 'destroy')->middleware('permission:content-directory-department.delete,admin')->name('content-directory-department.destroy');
        Route::post('/content-directory-department/reorder', 'reorder')->middleware('permission:content-directory-department.update,admin')->name('content-directory-department.reorder');
    });

    // content-directory-staff CRUD
    Route::controller(ContentDirectoryStaffController::class)->group(function () {
        Route::get('/content-directory-staff', 'index')->middleware('permission:content-directory-staff.view,admin')->name('content-directory-staff.index');
        Route::get('/content-directory-staff/create', 'create')->middleware('permission:content-directory-staff.create,admin')->name('content-directory-staff.create');
        Route::post('/content-directory-staff', 'store')->middleware('permission:content-directory-staff.create,admin')->name('content-directory-staff.store');
        Route::get('/content-directory-staff/{id}/edit', 'edit')->middleware('permission:content-directory-staff.update,admin')->name('content-directory-staff.edit');
        Route::put('/content-directory-staff/{id}', 'update')->middleware('permission:content-directory-staff.update,admin')->name('content-directory-staff.update');
        Route::delete('/content-directory-staff/{id}', 'destroy')->middleware('permission:content-directory-staff.delete,admin')->name('content-directory-staff.destroy');
        Route::post('/content-directory-staff/reorder', 'reorder')->middleware('permission:content-directory-staff.update,admin')->name('content-directory-staff.reorder');
    });

    // CMS Builder
    Route::prefix('frontend-site')->name('frontend-site.')->group(function () {
        Route::get('/', fn() => view('backend.module.frontendSite.index'))->middleware('permission:frontend-site.view,admin')->name('dashboard');

        Route::controller(FrontendSiteController::class)->group(function () {
            Route::get('/sites', 'index')->middleware('permission:frontend-site.view,admin')->name('sites.index');
            Route::get('/sites/create', 'create')->middleware('permission:frontend-site.create,admin')->name('sites.create');
            Route::post('/sites', 'store')->middleware('permission:frontend-site.create,admin')->name('sites.store');
            Route::get('/sites/{site}/edit', 'edit')->middleware('permission:frontend-site.update,admin')->name('sites.edit');
            Route::put('/sites/{site}', 'update')->middleware('permission:frontend-site.update,admin')->name('sites.update');
            Route::delete('/sites/{site}', 'destroy')->middleware('permission:frontend-site.delete,admin')->name('sites.destroy');
            Route::post('/sites/{site}/toggle-status', 'toggleStatus')->middleware('permission:frontend-site.update,admin')->name('sites.toggle-status');
            Route::post('/sites/{site}/toggle-default', 'toggleDefault')->middleware('permission:frontend-site.update,admin')->name('sites.toggle-default');
        });

        Route::controller(FrontendComponentController::class)->group(function () {
            Route::get('/components', 'index')->middleware('permission:frontend-site.view,admin')->name('components.index');
            Route::get('/components/create', 'create')->middleware('permission:frontend-site.create,admin')->name('components.create');
            Route::post('/components', 'store')->middleware('permission:frontend-site.create,admin')->name('components.store');
            Route::get('/components/{component}/edit', 'edit')->middleware('permission:frontend-site.update,admin')->name('components.edit');
            Route::put('/components/{component}', 'update')->middleware('permission:frontend-site.update,admin')->name('components.update');
            Route::delete('/components/{component}', 'destroy')->middleware('permission:frontend-site.delete,admin')->name('components.destroy');
        });

        Route::controller(FrontendPageController::class)->group(function () {
            Route::get('/pages', 'index')->middleware('permission:frontend-site.view,admin')->name('pages.index');
            Route::get('/pages/create', 'create')->middleware('permission:frontend-site.create,admin')->name('pages.create');
            Route::post('/pages', 'store')->middleware('permission:frontend-site.create,admin')->name('pages.store');
            Route::get('/pages/{page}/edit', 'edit')->middleware('permission:frontend-site.update,admin')->name('pages.edit');
            Route::put('/pages/{page}', 'update')->middleware('permission:frontend-site.update,admin')->name('pages.update');
            Route::delete('/pages/{page}', 'destroy')->middleware('permission:frontend-site.delete,admin')->name('pages.destroy');
            Route::post('/pages/reorder', 'reorder')->middleware('permission:frontend-site.update,admin')->name('pages.reorder');
            Route::post('/pages/{page}/toggle-default', 'toggleDefault')->middleware('permission:frontend-site.update,admin')->name('pages.toggle-default');
            Route::post('/pages/{page}/toggle-status', 'toggleStatus')->middleware('permission:frontend-site.update,admin')->name('pages.toggle-status');
            Route::get('/pages/layout-builder', 'layoutBuilder')->middleware('permission:frontend-site.create,admin')->name('pages.layout-builder');
        });
    });
});


/*
|--------------------------------------------------------------------------
| FRONTEND USER AUTH (WEB GUARD)
|--------------------------------------------------------------------------
*/

Route::prefix('user')->group(function () {
    //Register
    Route::get('/register', function () {
        return redirect('/' . SettingHelper::authSiteSlug() . '/register-web');
    })->name('user.register');
    Route::post('/register', [RegisterController::class, 'registerSubmit'])->name('user.register.submit');

    //Login
    Route::get('/login', function () {
        return redirect('/' . SettingHelper::authSiteSlug() . '/login-web');
    })->name('user.login');
    Route::post('/login', [LoginController::class, 'loginSubmit'])->name('user.login.submit');

    // Forgot / Reset Password
    Route::get('/forgot-password', function () {
        return redirect('/' . SettingHelper::authSiteSlug() . '/forgot-password-web');
    })->name('user.password.request');
    Route::post('/forgot-password', [LoginController::class, 'sendResetLink'])->name('user.password.email');
    Route::get('/reset-password/{token}', function (\Illuminate\Http\Request $request, $token) {
        $email = $request->query('email', '');
        return redirect('/' . SettingHelper::authSiteSlug() . '/reset-password-web?token=' . $token . '&email=' . urlencode($email));
    })->name('user.password.reset');
    Route::post('/reset-password', [LoginController::class, 'resetPassword'])->name('user.password.update');

    // Email Verification Confirm (public - user clicks from email)
    Route::get('/email/verify/{id}/{hash}', function (Request $request, $id, $hash) {
        $user = \App\Models\Backend\FrontendUser::findOrFail($id);

        if (!hash_equals($hash, sha1($user->getEmailForVerification()))) {
            abort(403, 'Invalid verification link.');
        }

        if (!$user->hasVerifiedEmail()) {
            $user->markEmailAsVerified();
        }

        return redirect('/' . SettingHelper::authSiteSlug() . '/login-web')
            ->with('status', 'Email verified successfully. Please login.');
    })->name('user.verification.verify');
});

/*
|--------------------------------------------------------------------------
| USER AUTH (LOGIN REQUIRED)
|--------------------------------------------------------------------------
*/

Route::prefix('user')->middleware('auth:user')->group(function () {
    //Logout
    Route::post('/logout', [LoginController::class, 'logout'])->name('user.logout');

    // Email Verification
    Route::get('/email/verify', function () {
        return redirect('/' . SettingHelper::authSiteSlug() . '/email-verify-web');
    })->name('user.verification.notice');
    Route::post('/email/verification-notification', [VerifyEmailController::class, 'resend'])
        ->middleware('throttle:6,1')
        ->name('user.verification.resend');
});

/*
|--------------------------------------------------------------------------
| CMS BUILDER FRONTEND + PUBLIC
|--------------------------------------------------------------------------
*/

// Language switching
Route::get('/lang/{code}', function ($code) {
    $valid = DB::table('ref')->where('cat', 'LANGUAGE')->where('code', $code)->exists();
    if ($valid) {
        session(['locale' => $code]);
    }
    return redirect()->back();
})->name('lang.switch');

Route::prefix('/')->middleware('visitor.log')->group(function () {
    // Root → default CMS site
    Route::get('/', [FrontendSiteRenderController::class, 'default'])->name('home');

    Route::match(['GET', 'POST'], '{site}/{slug}', [FrontendSiteRenderController::class, 'resolve'])
        ->where('slug', '.*')
        ->name('frontend-site.page');
    Route::get('{slug}', [FrontendSiteRenderController::class, 'resolve'])->name('frontend-site.home');
});

//tutorial module (code in blade file)
// Route::prefix('/tutorial')->group(function () {
//     Route::get('/article/{slug}', [HomeController::class, 'contentArticle'])->name('content-article');
// });


// dd([
//     'default' => auth()->user(),
//     'admin' => auth()->guard('admin')->user(),
//     'user' => auth()->guard('user')->user(),
// ]);



// Route::get('/activate-storage', function () {
//     $target = storage_path('app/public');
//     $link = public_path('storage');

//     $output = [];
//     $output[] = "Target: $target";
//     $output[] = "Link: $link";
//     $output[] = "Target exists: " . (file_exists($target) ? 'Yes' : 'No');
//     $output[] = "Link exists: " . (file_exists($link) ? 'Yes' : 'No');

//     if (file_exists($link)) {
//         return implode('<br>', $output) . "<br><br>✅ Link already exists!";
//     }

//     if (symlink($target, $link)) {
//         return implode('<br>', $output) . "<br><br>✅ Storage link created!";
//     } else {
//         return implode('<br>', $output) . "<br><br>❌ Failed to create link. Try manual method below.";
//     }
// });


// routes/web.php
// Route::get('/test-direct-upload', function() {
//     return '
//     <!DOCTYPE html>
//     <html>
//     <head>
//         <meta name="csrf-token" content="'.csrf_token().'">
//         <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
//     </head>
//     <body>
//         <h2>Direct Upload Test</h2>
//         <form id="uploadForm" enctype="multipart/form-data">
//             <input type="file" name="upload" id="file" accept="image/*">
//             <input type="hidden" name="type" value="Images">
//             <button type="submit">Upload</button>
//         </form>
//         <div id="result"></div>
//         <pre id="response"></pre>

//         <script>
//         $("#uploadForm").on("submit", function(e) {
//             e.preventDefault();
//             var formData = new FormData(this);
//             formData.append("_token", document.querySelector(\'meta[name="csrf-token"]\').content);

//             $("#result").html("Uploading...");

//             $.ajax({
//                 url: "/filemanager/upload",
//                 type: "POST",
//                 data: formData,
//                 processData: false,
//                 contentType: false,
//                 timeout: 30000,
//                 success: function(response) {
//                     $("#result").html("<span style=\'color:green\'>SUCCESS!</span>");
//                     $("#response").html(JSON.stringify(response, null, 2));
//                 },
//                 error: function(xhr) {
//                     $("#result").html("<span style=\'color:red\'>ERROR!</span>");
//                     $("#response").html("Status: " + xhr.status + "\\n\\nResponse: " + xhr.responseText);
//                 }
//             });
//         });
//         </script>
//     </body>
//     </html>
//     ';
// });