cms/routes/web.php

219 lines
17 KiB
PHP
Raw Permalink Normal View History

<?php
use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Auth\LoginFormController;
use App\Http\Controllers\Auth\LoginActionController;
use App\Http\Controllers\Auth\LogoutController;
use App\Http\Controllers\Auth\TwoFactorFormController;
use App\Http\Controllers\Auth\TwoFactorActionController;
use App\Http\Controllers\Admin\Profile\ProfileEditController;
use App\Http\Controllers\Admin\Profile\ProfileUpdateController;
use App\Http\Controllers\Admin\Pages\PageListController;
use App\Http\Controllers\Admin\Pages\PageCreateController;
use App\Http\Controllers\Admin\Pages\PageStoreController;
use App\Http\Controllers\Admin\Pages\PageEditController;
use App\Http\Controllers\Admin\Pages\PageUpdateController;
use App\Http\Controllers\Admin\Pages\PageDestroyController;
use App\Http\Controllers\Admin\Themes\ThemeListController;
use App\Http\Controllers\Admin\Themes\ThemeActivateController;
use App\Http\Controllers\Admin\Themes\ThemeUploadController;
use App\Http\Controllers\Admin\Themes\ThemeEditorIndexController;
use App\Http\Controllers\Admin\Themes\ThemeEditorFileTreeController;
use App\Http\Controllers\Admin\Themes\ThemeEditorFileReadController;
use App\Http\Controllers\Admin\Themes\ThemeEditorFileSaveController;
use App\Http\Controllers\Admin\Themes\ThemeEditorFileCreateController;
use App\Http\Controllers\Admin\Users\UserIndexController;
use App\Http\Controllers\Admin\Users\UserCreateController;
use App\Http\Controllers\Admin\Users\UserStoreController;
use App\Http\Controllers\Admin\Users\UserEditController;
use App\Http\Controllers\Admin\Users\UserUpdateController;
use App\Http\Controllers\Admin\Users\UserDestroyController;
use App\Http\Controllers\Admin\Roles\RoleIndexController;
use App\Http\Controllers\Admin\Roles\RoleStoreController;
use App\Http\Controllers\Admin\Roles\RoleUpdateController;
use App\Http\Controllers\Admin\Roles\RoleDestroyController;
use App\Http\Controllers\Admin\Roles\RolePermissionUpdateController;
use App\Http\Controllers\Admin\Media\MediaIndexController;
use App\Http\Controllers\Admin\Media\MediaUploadController;
use App\Http\Controllers\Admin\Media\MediaUpdateController;
use App\Http\Controllers\Admin\Media\MediaDestroyController;
use App\Http\Controllers\Admin\Content\CustomPostTypeIndexController;
use App\Http\Controllers\Admin\Content\CustomPostTypeCreateController;
use App\Http\Controllers\Admin\Content\CustomPostTypeStoreController;
use App\Http\Controllers\Admin\Content\CustomPostTypeEditController;
use App\Http\Controllers\Admin\Content\CustomPostTypeUpdateController;
use App\Http\Controllers\Admin\Content\CustomPostTypeDestroyController;
use App\Http\Controllers\Admin\Content\CustomFieldStoreController;
use App\Http\Controllers\Admin\Content\CustomFieldUpdateController;
use App\Http\Controllers\Admin\Content\CustomFieldDestroyController;
use App\Http\Controllers\Admin\Content\CustomFieldReorderController;
use App\Http\Controllers\Admin\Posts\PostIndexController;
use App\Http\Controllers\Admin\Posts\PostCreateController;
use App\Http\Controllers\Admin\Posts\PostStoreController;
use App\Http\Controllers\Admin\Posts\PostEditController;
use App\Http\Controllers\Admin\Posts\PostUpdateController;
use App\Http\Controllers\Admin\Posts\PostDestroyController;
use App\Http\Controllers\Admin\Forms\FormIndexController;
use App\Http\Controllers\Admin\Forms\FormCreateController;
use App\Http\Controllers\Admin\Forms\FormStoreController;
use App\Http\Controllers\Admin\Forms\FormEditController;
use App\Http\Controllers\Admin\Forms\FormUpdateController;
use App\Http\Controllers\Admin\Forms\FormDestroyController;
use App\Http\Controllers\Admin\Forms\FormSubmissionIndexController;
use App\Http\Controllers\Admin\Forms\FormSubmissionShowController;
use App\Http\Controllers\Admin\Forms\FormSubmissionDestroyController;
use App\Http\Controllers\Admin\Analytics\AnalyticsIndexController;
use App\Http\Controllers\Admin\Navigation\NavigationIndexController;
use App\Http\Controllers\Admin\Navigation\NavigationStoreController;
use App\Http\Controllers\Admin\Navigation\NavigationReorderController;
use App\Http\Controllers\Admin\Navigation\NavigationDestroyController;
use App\Http\Controllers\Public\PageDisplayController;
use App\Http\Controllers\Public\FormSubmitController;
// Admin Route Group
Route::prefix(config('cms.admin_path', 'loom'))->group(function () {
// Auth Routes
Route::get('/login', LoginFormController::class)->name('login');
Route::post('/login', LoginActionController::class);
Route::get('/two-factor', TwoFactorFormController::class)->name('two-factor.login');
Route::post('/two-factor', TwoFactorActionController::class);
Route::post('/logout', LogoutController::class)->name('logout');
// Protected Admin Routes
Route::middleware(['sw.auth:can:view-themes,can:view-pages,can:view-media,can:view-users,can:view-roles,can:manage-backups,can:manage-settings'])->group(function () {
Route::get('/', function () {
return view('admin.dashboard');
})->name('admin.dashboard');
// Profile Management
Route::get('/profile', ProfileEditController::class)->name('admin.profile.edit');
Route::put('/profile', ProfileUpdateController::class)->name('admin.profile.update');
// Page Management
Route::get('/pages', PageListController::class)->name('admin.pages.index')->middleware('sw.auth:can:view-pages');
Route::get('/pages/create', PageCreateController::class)->name('admin.pages.create')->middleware('sw.auth:can:create-pages');
Route::post('/pages', PageStoreController::class)->name('admin.pages.store')->middleware('sw.auth:can:create-pages');
Route::get('/pages/{page}/edit', PageEditController::class)->name('admin.pages.edit')->middleware('sw.auth:can:edit-pages');
Route::put('/pages/{page}', PageUpdateController::class)->name('admin.pages.update')->middleware('sw.auth:can:edit-pages');
Route::delete('/pages/{page}', PageDestroyController::class)->name('admin.pages.destroy')->middleware('sw.auth:can:delete-pages');
// Theme Management
Route::get('/themes', ThemeListController::class)->name('admin.themes.index')->middleware('sw.auth:can:view-themes');
Route::post('/themes/activate', ThemeActivateController::class)->name('admin.themes.activate')->middleware('sw.auth:can:activate-themes');
Route::post('/themes/upload', ThemeUploadController::class)->name('admin.themes.upload')->middleware('sw.auth:can:upload-themes');
Route::get('/themes/editor', ThemeEditorIndexController::class)->name('admin.themes.editor.index')->middleware('sw.auth:can:edit-themes');
Route::get('/themes/editor/tree', ThemeEditorFileTreeController::class)->name('admin.themes.editor.tree')->middleware('sw.auth:can:edit-themes');
Route::get('/themes/editor/read', ThemeEditorFileReadController::class)->name('admin.themes.editor.read')->middleware('sw.auth:can:edit-themes');
Route::post('/themes/editor/save', ThemeEditorFileSaveController::class)->name('admin.themes.editor.save')->middleware('sw.auth:can:edit-themes');
Route::post('/themes/editor/create', ThemeEditorFileCreateController::class)->name('admin.themes.editor.create')->middleware('sw.auth:can:edit-themes');
// User Management
Route::get('/users', UserIndexController::class)->name('admin.users.index')->middleware('sw.auth:can:view-users');
Route::get('/users/create', UserCreateController::class)->name('admin.users.create')->middleware('sw.auth:can:create-users');
Route::post('/users', UserStoreController::class)->name('admin.users.store')->middleware('sw.auth:can:create-users');
Route::get('/users/{user}/edit', UserEditController::class)->name('admin.users.edit')->middleware('sw.auth:can:edit-users');
Route::put('/users/{user}', UserUpdateController::class)->name('admin.users.update')->middleware('sw.auth:can:edit-users');
Route::delete('/users/{user}', UserDestroyController::class)->name('admin.users.destroy')->middleware('sw.auth:can:delete-users');
// Role & Permission Management
Route::get('/roles', RoleIndexController::class)->name('admin.roles.index')->middleware('sw.auth:can:view-roles');
Route::post('/roles', RoleStoreController::class)->name('admin.roles.store')->middleware('sw.auth:can:create-roles');
Route::put('/roles/{role}', RoleUpdateController::class)->name('admin.roles.update')->middleware('sw.auth:can:edit-roles');
Route::delete('/roles/{role}', RoleDestroyController::class)->name('admin.roles.destroy')->middleware('sw.auth:can:delete-roles');
Route::post('/roles/{role}/permissions', RolePermissionUpdateController::class)->name('admin.roles.permissions.update')->middleware('sw.auth:can:assign-permissions');
// Media Management
Route::get('/media', MediaIndexController::class)->name('admin.media.index')->middleware('sw.auth:can:view-media');
Route::post('/media/upload', MediaUploadController::class)->name('admin.media.upload')->middleware('sw.auth:can:upload-media');
Route::put('/media', MediaUpdateController::class)->name('admin.media.update')->middleware('sw.auth:can:edit-media');
Route::delete('/media', MediaDestroyController::class)->name('admin.media.destroy')->middleware('sw.auth:can:delete-media');
// Backups
Route::get('/backups', \App\Http\Controllers\Admin\Backups\BackupIndexController::class)->name('admin.backups.index')->middleware('sw.auth:can:manage-backups');
Route::post('/backups', \App\Http\Controllers\Admin\Backups\BackupStoreController::class)->name('admin.backups.store')->middleware('sw.auth:can:manage-backups');
Route::post('/backups/restore', \App\Http\Controllers\Admin\Backups\BackupRestoreController::class)->name('admin.backups.restore')->middleware('sw.auth:can:manage-backups');
Route::get('/backups/restore/progress', function(\App\Services\BackupService $service) {
return response()->json($service->getProgress());
})->name('admin.backups.restore.progress')->middleware('sw.auth:can:manage-backups');
Route::post('/backups/upload', \App\Http\Controllers\Admin\Backups\BackupUploadController::class)->name('admin.backups.upload')->middleware('sw.auth:can:manage-backups');
Route::get('/backups/download', \App\Http\Controllers\Admin\Backups\BackupDownloadController::class)->name('admin.backups.download')->middleware('sw.auth:can:manage-backups');
// Custom Post Types
Route::prefix('custom-post-types')->group(function () {
Route::get('/', CustomPostTypeIndexController::class)->name('admin.custom-post-types.index')->middleware('sw.auth:can:view-cpt');
Route::get('/create', CustomPostTypeCreateController::class)->name('admin.custom-post-types.create')->middleware('sw.auth:can:create-cpt');
Route::post('/', CustomPostTypeStoreController::class)->name('admin.custom-post-types.store')->middleware('sw.auth:can:create-cpt');
Route::get('/{custom_post_type}/edit', CustomPostTypeEditController::class)->name('admin.custom-post-types.edit')->middleware('sw.auth:can:edit-cpt');
Route::put('/{custom_post_type}', CustomPostTypeUpdateController::class)->name('admin.custom-post-types.update')->middleware('sw.auth:can:edit-cpt');
Route::delete('/{custom_post_type}', CustomPostTypeDestroyController::class)->name('admin.custom-post-types.destroy')->middleware('sw.auth:can:delete-cpt');
});
Route::post('custom-post-types/{custom_post_type}/fields', CustomFieldStoreController::class)->name('admin.custom-fields.store')->middleware('sw.auth:can:edit-cpt');
Route::put('custom-post-types/{custom_post_type}/fields/{custom_field}', CustomFieldUpdateController::class)->name('admin.custom-fields.update')->middleware('sw.auth:can:edit-cpt');
Route::delete('custom-post-types/{custom_post_type}/fields/{custom_field}', CustomFieldDestroyController::class)->name('admin.custom-fields.destroy')->middleware('sw.auth:can:edit-cpt');
Route::post('custom-post-types/{custom_post_type}/fields/reorder', CustomFieldReorderController::class)->name('admin.custom-fields.reorder')->middleware('sw.auth:can:edit-cpt');
// CPT Posts (Dynamic routes based on CPT slug)
Route::prefix('content/{custom_post_type:slug}')->group(function () {
Route::get('/', PostIndexController::class)->name('admin.posts.index')->middleware('sw.auth:can:view-posts');
Route::get('/create', PostCreateController::class)->name('admin.posts.create')->middleware('sw.auth:can:create-posts');
Route::post('/', PostStoreController::class)->name('admin.posts.store')->middleware('sw.auth:can:create-posts');
Route::get('/{post}/edit', PostEditController::class)->name('admin.posts.edit')->middleware('sw.auth:can:edit-posts');
Route::put('/{post}', PostUpdateController::class)->name('admin.posts.update')->middleware('sw.auth:can:edit-posts');
Route::delete('/{post}', PostDestroyController::class)->name('admin.posts.destroy')->middleware('sw.auth:can:delete-posts');
});
// Form Builder
Route::prefix('forms')->group(function () {
Route::get('/', FormIndexController::class)->name('admin.forms.index')->middleware('sw.auth:can:view-forms');
Route::get('/create', FormCreateController::class)->name('admin.forms.create')->middleware('sw.auth:can:create-forms');
Route::post('/', FormStoreController::class)->name('admin.forms.store')->middleware('sw.auth:can:create-forms');
Route::get('/{form}/edit', FormEditController::class)->name('admin.forms.edit')->middleware('sw.auth:can:edit-forms');
Route::put('/{form}', FormUpdateController::class)->name('admin.forms.update')->middleware('sw.auth:can:edit-forms');
Route::delete('/{form}', FormDestroyController::class)->name('admin.forms.destroy')->middleware('sw.auth:can:delete-forms');
});
Route::get('forms/{form}/submissions', FormSubmissionIndexController::class)->name('admin.forms.submissions.index')->middleware('sw.auth:can:view-submissions');
Route::get('forms/{form}/submissions/{submission}', FormSubmissionShowController::class)->name('admin.forms.submissions.show')->middleware('sw.auth:can:view-submissions');
Route::delete('forms/{form}/submissions/{submission}', FormSubmissionDestroyController::class)->name('admin.forms.submissions.destroy')->middleware('sw.auth:can:view-submissions');
// Analytics
Route::get('/analytics', AnalyticsIndexController::class)->name('admin.analytics.index')->middleware('sw.auth:can:view-analytics');
// Navigation
Route::get('/navigation', NavigationIndexController::class)->name('admin.navigation.index')->middleware('sw.auth:can:manage-navigation');
Route::post('/navigation', NavigationStoreController::class)->name('admin.navigation.store')->middleware('sw.auth:can:manage-navigation');
Route::post('/navigation/reorder', NavigationReorderController::class)->name('admin.navigation.reorder')->middleware('sw.auth:can:manage-navigation');
Route::delete('/navigation/{navigation}', NavigationDestroyController::class)->name('admin.navigation.destroy')->middleware('sw.auth:can:manage-navigation');
// Settings
Route::get('/settings', App\Http\Controllers\Admin\Settings\SettingIndexController::class)->name('admin.settings.index')->middleware('sw.auth:can:manage-settings');
Route::post('/settings', App\Http\Controllers\Admin\Settings\SettingUpdateController::class)->name('admin.settings.update')->middleware('sw.auth:can:update-settings');
});
// Translations
Route::group(['middleware' => 'sw.auth:can:manage-translations'], function () {
Route::get('/translations', [App\Http\Controllers\Admin\Translations\TranslationController::class, 'index'])->name('admin.translations.index');
Route::post('/translations', [App\Http\Controllers\Admin\Translations\TranslationController::class, 'update'])->name('admin.translations.update');
Route::post('/translations/sync', [App\Http\Controllers\Admin\Translations\TranslationController::class, 'sync'])->name('admin.translations.sync');
Route::post('/translate', \App\Http\Controllers\Admin\Translations\TranslationActionController::class)->name('admin.translate');
});
});
// Media JIT Route
Route::get('/media/{path}', \App\Http\Controllers\MediaController::class)
->where('path', '.*')
->name('media.jit');
// Theme Asset Route
Route::get('/themes/{theme}/{path}', \App\Http\Controllers\ThemeAssetController::class)
->where('path', '.*')
->name('theme.asset');
// Public Routes with optional locale prefix
Route::get('/', PageDisplayController::class)->name('home');
Route::prefix('{locale}')->where(['locale' => '[a-z]{2}'])->group(function () {
Route::get('/', PageDisplayController::class);
Route::get('/{slug}', PageDisplayController::class)->name('page.show.localized')->where('slug', '.*');
});
Route::get('/{slug}', PageDisplayController::class)->name('page.show')->where('slug', '.*');
Route::post('/forms/{form:slug}/submit', FormSubmitController::class)->name('forms.submit');