pr improvements

This commit is contained in:
2026-04-15 16:08:15 +02:00
parent f453003e6e
commit 0ed2b2429c
9 changed files with 179 additions and 196 deletions
+1 -1
View File
@@ -10,7 +10,7 @@ use Illuminate\Http\Middleware\AddLinkHeadersForPreloadedAssets;
return Application::configure(basePath: dirname(__DIR__)) return Application::configure(basePath: dirname(__DIR__))
->withRouting( ->withRouting(
web: __DIR__.'/../routes/web.php', web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php', commands: __DIR__ . '/../routes/console.php',
health: '/up', health: '/up',
) )
->withMiddleware(function (Middleware $middleware): void { ->withMiddleware(function (Middleware $middleware): void {
-7
View File
@@ -1,8 +1 @@
<?php <?php
use Illuminate\Foundation\Inspiring;
use Illuminate\Support\Facades\Artisan;
Artisan::command('inspire', function () {
$this->comment(Inspiring::quote());
})->purpose('Display an inspiring quote');
-161
View File
@@ -1,161 +0,0 @@
<?php
use App\Http\Controllers\ProjectBoardController;
use App\Http\Controllers\ProjectBoardSettingsController;
use App\Http\Controllers\ProjectController;
use App\Http\Controllers\ProjectRepositorySettingsController;
use App\Http\Controllers\ProjectTicketBranchController;
use App\Http\Controllers\ProjectTicketController;
use App\Http\Controllers\ProjectTicketLinkController;
use App\Http\Controllers\ProjectTicketMetadataSettingsController;
use Illuminate\Support\Facades\Route;
Route::middleware(['auth', 'verified'])
->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');
});
});
});
});
});
-22
View File
@@ -1,22 +0,0 @@
<?php
use App\Http\Controllers\TeamController;
use Illuminate\Support\Facades\Route;
Route::middleware(['auth', 'verified'])
->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');
});
+5 -4
View File
@@ -9,9 +9,10 @@ Route::inertia('/', 'Welcome', [
Route::middleware(['auth', 'verified'])->group(function () { Route::middleware(['auth', 'verified'])->group(function () {
Route::inertia('dashboard', 'Dashboard')->name('dashboard'); 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__.'/web/settings.php';
require __DIR__.'/projects.php';
require __DIR__.'/settings.php';
require __DIR__.'/teams.php';
+1 -1
View File
@@ -3,7 +3,7 @@
use App\Http\Controllers\Admin\UserManagementController; use App\Http\Controllers\Admin\UserManagementController;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
Route::middleware(['auth', 'verified', 'can:access-admin']) Route::middleware('can:access-admin')
->prefix('admin') ->prefix('admin')
->name('admin.') ->name('admin.')
->group(function (): void { ->group(function (): void {
+158
View File
@@ -0,0 +1,158 @@
<?php
use App\Http\Controllers\ProjectBoardController;
use App\Http\Controllers\ProjectBoardSettingsController;
use App\Http\Controllers\ProjectController;
use App\Http\Controllers\ProjectRepositorySettingsController;
use App\Http\Controllers\ProjectTicketBranchController;
use App\Http\Controllers\ProjectTicketController;
use App\Http\Controllers\ProjectTicketLinkController;
use App\Http\Controllers\ProjectTicketMetadataSettingsController;
use Illuminate\Support\Facades\Route;
Route::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');
});
});
});
});
});
+14
View File
@@ -0,0 +1,14 @@
<?php
use App\Http\Controllers\TeamController;
use Illuminate\Support\Facades\Route;
Route::prefix('teams')->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');
});
});