diff --git a/database/migrations/2026_09_04_000001_add_setting_access_permission.php b/database/migrations/2026_09_04_000001_add_setting_access_permission.php new file mode 100644 index 0000000..f819d09 --- /dev/null +++ b/database/migrations/2026_09_04_000001_add_setting_access_permission.php @@ -0,0 +1,37 @@ +updateOrInsert( + ['name' => 'setting_access', 'guard_name' => 'web'], + ['created_at' => now(), 'updated_at' => now()] + ); + + app(PermissionRegistrar::class)->forgetCachedPermissions(); + } + + public function down(): void + { + $permissionsTable = config('permission.table_names.permissions', 'permissions'); + $rolePermissionsTable = config('permission.table_names.role_has_permissions', 'role_has_permissions'); + $permissionId = DB::table($permissionsTable) + ->where('name', 'setting_access') + ->where('guard_name', 'web') + ->value('id'); + + if ($permissionId) { + DB::table($rolePermissionsTable)->where('permission_id', $permissionId)->delete(); + DB::table($permissionsTable)->where('id', $permissionId)->delete(); + } + + app(PermissionRegistrar::class)->forgetCachedPermissions(); + } +}; \ No newline at end of file diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 39018cd..a6a28b6 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -23,6 +23,7 @@ class DatabaseSeeder extends Seeder 'flota_access', 'zaliczki_access', 'users_access', + 'setting_access', ]; foreach ($permissions as $permission) { @@ -39,6 +40,7 @@ class DatabaseSeeder extends Seeder $kierownikRole->syncPermissions([ 'users_access', + 'setting_access', 'raporty_access', 'flota_access', 'zaliczki_access', diff --git a/resources/views/layouts/navigation.blade.php b/resources/views/layouts/navigation.blade.php index d18aaf3..408e5a4 100644 --- a/resources/views/layouts/navigation.blade.php +++ b/resources/views/layouts/navigation.blade.php @@ -97,7 +97,7 @@ {{ __('Profile') }} - @can('users_access') + @can('setting_access') {{ __('Ustawienia') }} @@ -185,7 +185,7 @@ {{ __('Profile') }} - @can('users_access') + @can('setting_access') {{ __('Ustawienia') }} diff --git a/routes/web.php b/routes/web.php index c5f4277..1536579 100644 --- a/routes/web.php +++ b/routes/web.php @@ -37,6 +37,10 @@ Route::middleware(['auth', 'verified'])->group(function () { Route::delete('/users/{user}', [UserController::class, 'destroy'])->name('users.destroy'); Route::post('/users/{user}/restore', [UserController::class, 'restore'])->name('users.restore'); + }); + + // Ustawienia systemu (tylko dla posiadaczy uprawnienia setting_access) + Route::middleware(['can:setting_access'])->group(function () { Route::get('/settings', [SettingsController::class, 'index'])->name('settings.index'); Route::post('/settings/advance-types', [SettingsController::class, 'storeAdvanceType'])->name('settings.advance-types.store'); Route::put('/settings/advance-types/{advanceType}', [SettingsController::class, 'updateAdvanceType'])->name('settings.advance-types.update'); diff --git a/tests/Feature/AdvanceTest.php b/tests/Feature/AdvanceTest.php index fdcaf99..5017a7a 100644 --- a/tests/Feature/AdvanceTest.php +++ b/tests/Feature/AdvanceTest.php @@ -84,11 +84,11 @@ test('manager can create an advance for another user', function () { }); test('manager can access system settings and add an advance type', function () { - Permission::firstOrCreate(['name' => 'users_access']); + Permission::firstOrCreate(['name' => 'setting_access']); $manager = User::factory()->create(); $managerRole = Role::firstOrCreate(['name' => 'kierownik']); - $managerRole->givePermissionTo(['zaliczki_access', 'users_access']); + $managerRole->givePermissionTo(['zaliczki_access', 'setting_access']); $manager->assignRole($managerRole); $indexResponse = $this->actingAs($manager)->get(route('settings.index')); @@ -102,12 +102,23 @@ test('manager can access system settings and add an advance type', function () { $this->assertDatabaseHas('advance_types', ['name' => 'Koncesja']); }); -test('manager can edit and delete an advance type from settings', function () { +test('users access alone does not grant access to system settings', function () { Permission::firstOrCreate(['name' => 'users_access']); + $user = User::factory()->create(); + $role = Role::firstOrCreate(['name' => 'uzytkownik']); + $role->givePermissionTo('users_access'); + $user->assignRole($role); + + $this->actingAs($user)->get(route('settings.index'))->assertForbidden(); +}); + +test('manager can edit and delete an advance type from settings', function () { + Permission::firstOrCreate(['name' => 'setting_access']); + $manager = User::factory()->create(); $managerRole = Role::firstOrCreate(['name' => 'kierownik']); - $managerRole->givePermissionTo(['zaliczki_access', 'users_access']); + $managerRole->givePermissionTo(['zaliczki_access', 'setting_access']); $manager->assignRole($managerRole); $type = AdvanceType::create(['name' => 'Koncesja']); @@ -124,13 +135,13 @@ test('manager can edit and delete an advance type from settings', function () { }); test('manager can update role permissions from settings', function () { - Permission::firstOrCreate(['name' => 'users_access']); + Permission::firstOrCreate(['name' => 'setting_access']); Permission::firstOrCreate(['name' => 'raporty_access']); Permission::firstOrCreate(['name' => 'flota_access']); $manager = User::factory()->create(); $managerRole = Role::firstOrCreate(['name' => 'kierownik']); - $managerRole->givePermissionTo('users_access'); + $managerRole->givePermissionTo('setting_access'); $manager->assignRole($managerRole); $response = $this->actingAs($manager)->post(route('settings.role-permissions.store'), [ @@ -145,11 +156,11 @@ test('manager can update role permissions from settings', function () { }); test('manager cannot delete an advance type that is still used in advances', function () { - Permission::firstOrCreate(['name' => 'users_access']); + Permission::firstOrCreate(['name' => 'setting_access']); $manager = User::factory()->create(); $managerRole = Role::firstOrCreate(['name' => 'kierownik']); - $managerRole->givePermissionTo(['zaliczki_access', 'users_access']); + $managerRole->givePermissionTo(['zaliczki_access', 'setting_access']); $manager->assignRole($managerRole); $type = AdvanceType::create(['name' => 'Paliwo']);