| Current Path : /var/www/html/dynaweb-cms-v1/routes/ |
| 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>
// ';
// });