diff --git a/bootstrap/app.php b/bootstrap/app.php index c4f1cc5..d68d267 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -10,7 +10,7 @@ use Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets; return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__.'/../routes/web.php', - commands: __DIR__.'/../routes/console.php', + commands: __DIR__ . '/../routes/console.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware): void { diff --git a/routes/console.php b/routes/console.php index 3c9adf1..b3d9bbc 100644 --- a/routes/console.php +++ b/routes/console.php @@ -1,8 +1 @@ comment(Inspiring::quote()); -})->purpose('Display an inspiring quote'); diff --git a/routes/projects.php b/routes/projects.php deleted file mode 100644 index 0e8f24f..0000000 --- a/routes/projects.php +++ /dev/null @@ -1,161 +0,0 @@ -prefix('projects') - ->name('projects.') - ->group(function (): void { - Route::get('/', [ProjectController::class, 'index'])->name('index'); - - Route::middleware('can:create-project')->group(function (): void { - Route::get('create', [ProjectController::class, 'create'])->name('create'); - Route::post('/', [ProjectController::class, 'store'])->name('store'); - }); - - Route::prefix('{project}') - ->group(function (): void { - Route::middleware('can:view-project,project')->group(function (): void { - Route::get('/', [ProjectController::class, 'show'])->name('show'); - Route::get('board', [ProjectBoardController::class, 'index'])->name('board.index'); - Route::get('backlog', [ProjectController::class, 'backlog'])->name('backlog.index'); - }); - - Route::delete('/', [ProjectController::class, 'destroy']) - ->middleware('can:access-admin') - ->name('destroy'); - - Route::middleware('can:admin-project,project')->group(function (): void { - Route::get('access', [ProjectController::class, 'access'])->name('access'); - - Route::prefix('permissions')->name('permissions.')->group(function (): void { - Route::patch('users/{user}', [ProjectController::class, 'updateUserPermissions']) - ->name('users.update'); - Route::patch('teams/{team}', [ProjectController::class, 'updateTeamPermissions']) - ->name('teams.update'); - }); - }); - - Route::scopeBindings()->group(function (): void { - Route::prefix('tickets') - ->name('tickets.') - ->group(function (): void { - Route::middleware('can:write-project,project')->group(function (): void { - Route::get('create', [ProjectTicketController::class, 'create'])->name('create'); - Route::post('/', [ProjectTicketController::class, 'store'])->name('store'); - }); - - Route::prefix('{ticket}')->group(function (): void { - Route::get('/', [ProjectTicketController::class, 'show']) - ->middleware('can:view-project,project') - ->name('show'); - - Route::middleware('can:write-project,project')->group(function (): void { - Route::patch('/', [ProjectTicketController::class, 'update'])->name('update'); - Route::patch('status', [ProjectBoardController::class, 'move'])->name('status.update'); - - Route::prefix('branches') - ->name('branches.') - ->controller(ProjectTicketBranchController::class) - ->group(function (): void { - Route::get('validate', 'validate')->name('validate'); - Route::post('/', 'store')->name('store'); - }); - - Route::prefix('links') - ->name('links.') - ->controller(ProjectTicketLinkController::class) - ->group(function (): void { - Route::post('/', 'store')->name('store'); - Route::delete('{ticketLink}', 'destroy') - ->withoutScopedBindings() - ->name('destroy'); - }); - }); - }); - }); - - Route::prefix('settings') - ->name('settings.') - ->middleware('can:admin-project,project') - ->group(function (): void { - Route::get('general', [ProjectController::class, 'general'])->name('general'); - - Route::get('board', [ProjectBoardSettingsController::class, 'show'])->name('board'); - - Route::prefix('board') - ->name('board.') - ->controller(ProjectBoardSettingsController::class) - ->group(function (): void { - Route::prefix('columns')->name('columns.')->group(function (): void { - Route::post('/', 'store')->name('store'); - Route::patch('{boardColumn}', 'update')->name('update'); - Route::delete('{boardColumn}', 'destroy')->name('destroy'); - }); - - Route::prefix('statuses')->name('statuses.')->group(function (): void { - Route::post('/', 'storeStatus')->name('store'); - Route::patch('{ticketStatus}', 'updateStatus')->name('update'); - Route::delete('{ticketStatus}', 'destroyStatus')->name('destroy'); - Route::patch('{ticketStatus}/transitions', 'updateStatusTransitions') - ->name('transitions.update'); - }); - }); - - Route::get('metadata', [ProjectTicketMetadataSettingsController::class, 'show']) - ->name('metadata'); - Route::patch('metadata', [ProjectTicketMetadataSettingsController::class, 'update']) - ->name('metadata.update'); - - Route::prefix('metadata') - ->name('metadata.') - ->controller(ProjectTicketMetadataSettingsController::class) - ->group(function (): void { - Route::prefix('types')->name('types.')->group(function (): void { - Route::post('/', 'storeType')->name('store'); - Route::patch('{ticketType}', 'updateType')->name('update'); - Route::delete('{ticketType}', 'destroyType')->name('destroy'); - }); - - Route::prefix('priorities')->name('priorities.')->group(function (): void { - Route::post('/', 'storePriority')->name('store'); - Route::patch('{ticketPriority}', 'updatePriority')->name('update'); - Route::delete('{ticketPriority}', 'destroyPriority')->name('destroy'); - }); - - Route::prefix('fields')->name('fields.')->group(function (): void { - Route::post('/', 'storeFieldDefinition')->name('store'); - Route::patch('{ticketFieldDefinition}', 'updateFieldDefinition')->name('update'); - Route::delete('{ticketFieldDefinition}', 'destroyFieldDefinition')->name('destroy'); - }); - - Route::prefix('link-types')->name('link-types.')->group(function (): void { - Route::post('/', 'storeLinkType')->name('store'); - Route::patch('{ticketLinkType}', 'updateLinkType')->name('update'); - Route::delete('{ticketLinkType}', 'destroyLinkType')->name('destroy'); - }); - }); - - Route::get('repositories', [ProjectRepositorySettingsController::class, 'show']) - ->name('repositories'); - - Route::prefix('repositories') - ->name('repositories.') - ->controller(ProjectRepositorySettingsController::class) - ->group(function (): void { - Route::post('/', 'store')->name('store'); - Route::patch('{repositoryConnection}', 'update')->name('update'); - Route::delete('{repositoryConnection}', 'destroy')->name('destroy'); - }); - }); - }); - }); - }); diff --git a/routes/teams.php b/routes/teams.php deleted file mode 100644 index ee990f5..0000000 --- a/routes/teams.php +++ /dev/null @@ -1,22 +0,0 @@ -prefix('teams') - ->name('teams.') - ->controller(TeamController::class) - ->group(function (): void { - Route::get('/', 'index') - ->middleware('can:view-teams') - ->name('index'); - - Route::post('/', 'store') - ->middleware('can:create-team') - ->name('store'); - - Route::patch('{team}/members', 'updateMembers')->name('members.update'); - Route::patch('{team}/permissions/users/{user}', 'updateUserPermissions') - ->name('permissions.users.update'); - }); diff --git a/routes/web.php b/routes/web.php index 2fa1e60..d12eeb7 100644 --- a/routes/web.php +++ b/routes/web.php @@ -9,9 +9,10 @@ Route::inertia('/', 'Welcome', [ Route::middleware(['auth', 'verified'])->group(function () { Route::inertia('dashboard', 'Dashboard')->name('dashboard'); + + require __DIR__.'/web/admin.php'; + require __DIR__.'/web/projects.php'; + require __DIR__.'/web/teams.php'; }); -require __DIR__.'/admin.php'; -require __DIR__.'/projects.php'; -require __DIR__.'/settings.php'; -require __DIR__.'/teams.php'; +require __DIR__.'/web/settings.php'; diff --git a/routes/admin.php b/routes/web/admin.php similarity index 89% rename from routes/admin.php rename to routes/web/admin.php index b9d6e09..84b0a82 100644 --- a/routes/admin.php +++ b/routes/web/admin.php @@ -3,7 +3,7 @@ use App\Http\Controllers\Admin\UserManagementController; use Illuminate\Support\Facades\Route; -Route::middleware(['auth', 'verified', 'can:access-admin']) +Route::middleware('can:access-admin') ->prefix('admin') ->name('admin.') ->group(function (): void { diff --git a/routes/web/projects.php b/routes/web/projects.php new file mode 100644 index 0000000..49dc713 --- /dev/null +++ b/routes/web/projects.php @@ -0,0 +1,158 @@ +name('projects.')->group(function (): void { + Route::get('/', [ProjectController::class, 'index'])->name('index'); + + Route::middleware('can:create-project')->group(function (): void { + Route::get('create', [ProjectController::class, 'create'])->name('create'); + Route::post('/', [ProjectController::class, 'store'])->name('store'); + }); + + Route::prefix('{project}') + ->group(function (): void { + Route::middleware('can:view-project,project')->group(function (): void { + Route::get('/', [ProjectController::class, 'show'])->name('show'); + Route::get('board', [ProjectBoardController::class, 'index'])->name('board.index'); + Route::get('backlog', [ProjectController::class, 'backlog'])->name('backlog.index'); + }); + + Route::delete('/', [ProjectController::class, 'destroy']) + ->middleware('can:access-admin') + ->name('destroy'); + + Route::middleware('can:admin-project,project')->group(function (): void { + Route::get('access', [ProjectController::class, 'access'])->name('access'); + + Route::prefix('permissions')->name('permissions.')->group(function (): void { + Route::patch('users/{user}', [ProjectController::class, 'updateUserPermissions']) + ->name('users.update'); + Route::patch('teams/{team}', [ProjectController::class, 'updateTeamPermissions']) + ->name('teams.update'); + }); + }); + + Route::scopeBindings()->group(function (): void { + Route::prefix('tickets') + ->name('tickets.') + ->group(function (): void { + Route::middleware('can:write-project,project')->group(function (): void { + Route::get('create', [ProjectTicketController::class, 'create'])->name('create'); + Route::post('/', [ProjectTicketController::class, 'store'])->name('store'); + }); + + Route::prefix('{ticket}')->group(function (): void { + Route::get('/', [ProjectTicketController::class, 'show']) + ->middleware('can:view-project,project') + ->name('show'); + + Route::middleware('can:write-project,project')->group(function (): void { + Route::patch('/', [ProjectTicketController::class, 'update'])->name('update'); + Route::patch('status', [ProjectBoardController::class, 'move'])->name('status.update'); + + Route::prefix('branches') + ->name('branches.') + ->controller(ProjectTicketBranchController::class) + ->group(function (): void { + Route::get('validate', 'validate')->name('validate'); + Route::post('/', 'store')->name('store'); + }); + + Route::prefix('links') + ->name('links.') + ->controller(ProjectTicketLinkController::class) + ->group(function (): void { + Route::post('/', 'store')->name('store'); + Route::delete('{ticketLink}', 'destroy') + ->withoutScopedBindings() + ->name('destroy'); + }); + }); + }); + }); + + Route::prefix('settings') + ->name('settings.') + ->middleware('can:admin-project,project') + ->group(function (): void { + Route::get('general', [ProjectController::class, 'general'])->name('general'); + + Route::get('board', [ProjectBoardSettingsController::class, 'show'])->name('board'); + + Route::prefix('board') + ->name('board.') + ->controller(ProjectBoardSettingsController::class) + ->group(function (): void { + Route::prefix('columns')->name('columns.')->group(function (): void { + Route::post('/', 'store')->name('store'); + Route::patch('{boardColumn}', 'update')->name('update'); + Route::delete('{boardColumn}', 'destroy')->name('destroy'); + }); + + Route::prefix('statuses')->name('statuses.')->group(function (): void { + Route::post('/', 'storeStatus')->name('store'); + Route::patch('{ticketStatus}', 'updateStatus')->name('update'); + Route::delete('{ticketStatus}', 'destroyStatus')->name('destroy'); + Route::patch('{ticketStatus}/transitions', 'updateStatusTransitions') + ->name('transitions.update'); + }); + }); + + Route::get('metadata', [ProjectTicketMetadataSettingsController::class, 'show']) + ->name('metadata'); + Route::patch('metadata', [ProjectTicketMetadataSettingsController::class, 'update']) + ->name('metadata.update'); + + Route::prefix('metadata') + ->name('metadata.') + ->controller(ProjectTicketMetadataSettingsController::class) + ->group(function (): void { + Route::prefix('types')->name('types.')->group(function (): void { + Route::post('/', 'storeType')->name('store'); + Route::patch('{ticketType}', 'updateType')->name('update'); + Route::delete('{ticketType}', 'destroyType')->name('destroy'); + }); + + Route::prefix('priorities')->name('priorities.')->group(function (): void { + Route::post('/', 'storePriority')->name('store'); + Route::patch('{ticketPriority}', 'updatePriority')->name('update'); + Route::delete('{ticketPriority}', 'destroyPriority')->name('destroy'); + }); + + Route::prefix('fields')->name('fields.')->group(function (): void { + Route::post('/', 'storeFieldDefinition')->name('store'); + Route::patch('{ticketFieldDefinition}', 'updateFieldDefinition')->name('update'); + Route::delete('{ticketFieldDefinition}', 'destroyFieldDefinition')->name('destroy'); + }); + + Route::prefix('link-types')->name('link-types.')->group(function (): void { + Route::post('/', 'storeLinkType')->name('store'); + Route::patch('{ticketLinkType}', 'updateLinkType')->name('update'); + Route::delete('{ticketLinkType}', 'destroyLinkType')->name('destroy'); + }); + }); + + Route::get('repositories', [ProjectRepositorySettingsController::class, 'show']) + ->name('repositories'); + + Route::prefix('repositories') + ->name('repositories.') + ->controller(ProjectRepositorySettingsController::class) + ->group(function (): void { + Route::post('/', 'store')->name('store'); + Route::patch('{repositoryConnection}', 'update')->name('update'); + Route::delete('{repositoryConnection}', 'destroy')->name('destroy'); + }); + }); + }); + }); +}); diff --git a/routes/settings.php b/routes/web/settings.php similarity index 100% rename from routes/settings.php rename to routes/web/settings.php diff --git a/routes/web/teams.php b/routes/web/teams.php new file mode 100644 index 0000000..646606d --- /dev/null +++ b/routes/web/teams.php @@ -0,0 +1,14 @@ +name('teams.')->group(function (): void { + + Route::controller(TeamController::class)->group(function () { + Route::get('/', 'index')->middleware('can:view-teams')->name('index'); + Route::post('/', 'store')->middleware('can:create-team')->name('store'); + Route::patch('{team}/members', 'updateMembers')->name('members.update'); + Route::patch('{team}/permissions/users/{user}', 'updateUserPermissions')->name('permissions.users.update'); + }); +});