feat: enhance employee pagination by incorporating user role checks for improved access control

This commit is contained in:
Yoga Pangestu 2026-07-14 21:30:15 +07:00
parent 15453779e0
commit 08d3982aa5
3 changed files with 88 additions and 0 deletions

View File

@ -36,6 +36,7 @@ public function index(Request $request): Response
return Inertia::render('admin/hr/employees/Index', [
'employees' => $this->employeeService->paginateForIndex(
$tableQuery,
$request->user(),
$role,
$gender,
$employmentStatus,

View File

@ -28,6 +28,7 @@ public function __construct(
public function paginateForIndex(
array $tableQuery,
User $authUser,
string $role = '',
string $gender = '',
string $employmentStatus = '',
@ -36,6 +37,16 @@ public function paginateForIndex(
$query = User::query()
->with(['profile', 'employee', 'roles'])
->whereDoesntHave('roles', fn ($query) => $query->where('name', Role::DEVELOPER->value))
->when(
$authUser->hasRole(Role::ADMIN_BAHAN_BAKU->value),
fn ($query) => $query->whereHas('roles', fn ($query) => $query->where('name', Role::ADMIN_BAHAN_BAKU->value))
)
->when(
$authUser->hasAnyRole([Role::DIREKTUR->value, Role::ADMIN_TOKO->value]),
fn ($query) => $query
->whereDoesntHave('roles', fn ($query) => $query->where('name', Role::OWNER->value))
->whereDoesntHave('roles', fn ($query) => $query->where('name', Role::ADMIN_BAHAN_BAKU->value))
)
->when($tableQuery['search'] !== '', function ($query) use ($tableQuery): void {
$search = $tableQuery['search'];
$query->where(function ($query) use ($search): void {

View File

@ -160,6 +160,82 @@ function validEmployeePayload(): array
->assertDontSee($developer->email)
->assertSee($employee->email);
});
test('admin bahan baku hanya melihat pegawai dengan role yang sama', function () {
$user = createEmployeeUserWithPermission(PermissionEnum::EMPLOYEES_VIEW);
$user->assignRole('admin-bahan-baku');
$user->forgetCachedPermissions();
$pegawaiBahanBaku = User::factory()->create();
UserProfile::factory()->create(['user_id' => $pegawaiBahanBaku->id, 'full_name' => fake()->name()]);
Employee::factory()->create(['user_id' => $pegawaiBahanBaku->id]);
$pegawaiBahanBaku->assignRole('admin-bahan-baku');
$pegawaiLain = User::factory()->create();
UserProfile::factory()->create(['user_id' => $pegawaiLain->id, 'full_name' => fake()->name()]);
Employee::factory()->create(['user_id' => $pegawaiLain->id]);
$pegawaiLain->assignRole('marketing-offline');
$this->actingAs($user)
->get(route('admin.hr.employees.index'))
->assertOk()
->assertSee($pegawaiBahanBaku->email)
->assertDontSee($pegawaiLain->email);
});
test('direktur tidak melihat owner dan admin bahan baku', function () {
$user = createEmployeeUserWithPermission(PermissionEnum::EMPLOYEES_VIEW);
$user->assignRole('direktur');
$user->forgetCachedPermissions();
$owner = User::factory()->create();
UserProfile::factory()->create(['user_id' => $owner->id, 'full_name' => fake()->name()]);
$owner->assignRole('owner');
$adminBahanBaku = User::factory()->create();
UserProfile::factory()->create(['user_id' => $adminBahanBaku->id, 'full_name' => fake()->name()]);
Employee::factory()->create(['user_id' => $adminBahanBaku->id]);
$adminBahanBaku->assignRole('admin-bahan-baku');
$marketing = User::factory()->create();
UserProfile::factory()->create(['user_id' => $marketing->id, 'full_name' => fake()->name()]);
Employee::factory()->create(['user_id' => $marketing->id]);
$marketing->assignRole('marketing-offline');
$this->actingAs($user)
->get(route('admin.hr.employees.index'))
->assertOk()
->assertDontSee($owner->email)
->assertDontSee($adminBahanBaku->email)
->assertSee($marketing->email);
});
test('admin toko tidak melihat owner dan admin bahan baku', function () {
$user = createEmployeeUserWithPermission(PermissionEnum::EMPLOYEES_VIEW);
$user->assignRole('admin-toko');
$user->forgetCachedPermissions();
$owner = User::factory()->create();
UserProfile::factory()->create(['user_id' => $owner->id, 'full_name' => fake()->name()]);
$owner->assignRole('owner');
$adminBahanBaku = User::factory()->create();
UserProfile::factory()->create(['user_id' => $adminBahanBaku->id, 'full_name' => fake()->name()]);
Employee::factory()->create(['user_id' => $adminBahanBaku->id]);
$adminBahanBaku->assignRole('admin-bahan-baku');
$cashier = User::factory()->create();
UserProfile::factory()->create(['user_id' => $cashier->id, 'full_name' => fake()->name()]);
Employee::factory()->create(['user_id' => $cashier->id]);
$cashier->assignRole('cashier');
$this->actingAs($user)
->get(route('admin.hr.employees.index'))
->assertOk()
->assertDontSee($owner->email)
->assertDontSee($adminBahanBaku->email)
->assertSee($cashier->email);
});
});
// ─── Create ───────────────────────────────────────────────