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'); }); }); }); }); });