feat: enhance employee pagination by incorporating user role checks for improved access control
This commit is contained in:
parent
15453779e0
commit
08d3982aa5
@ -36,6 +36,7 @@ public function index(Request $request): Response
|
|||||||
return Inertia::render('admin/hr/employees/Index', [
|
return Inertia::render('admin/hr/employees/Index', [
|
||||||
'employees' => $this->employeeService->paginateForIndex(
|
'employees' => $this->employeeService->paginateForIndex(
|
||||||
$tableQuery,
|
$tableQuery,
|
||||||
|
$request->user(),
|
||||||
$role,
|
$role,
|
||||||
$gender,
|
$gender,
|
||||||
$employmentStatus,
|
$employmentStatus,
|
||||||
|
|||||||
@ -28,6 +28,7 @@ public function __construct(
|
|||||||
|
|
||||||
public function paginateForIndex(
|
public function paginateForIndex(
|
||||||
array $tableQuery,
|
array $tableQuery,
|
||||||
|
User $authUser,
|
||||||
string $role = '',
|
string $role = '',
|
||||||
string $gender = '',
|
string $gender = '',
|
||||||
string $employmentStatus = '',
|
string $employmentStatus = '',
|
||||||
@ -36,6 +37,16 @@ public function paginateForIndex(
|
|||||||
$query = User::query()
|
$query = User::query()
|
||||||
->with(['profile', 'employee', 'roles'])
|
->with(['profile', 'employee', 'roles'])
|
||||||
->whereDoesntHave('roles', fn ($query) => $query->where('name', Role::DEVELOPER->value))
|
->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 {
|
->when($tableQuery['search'] !== '', function ($query) use ($tableQuery): void {
|
||||||
$search = $tableQuery['search'];
|
$search = $tableQuery['search'];
|
||||||
$query->where(function ($query) use ($search): void {
|
$query->where(function ($query) use ($search): void {
|
||||||
|
|||||||
@ -160,6 +160,82 @@ function validEmployeePayload(): array
|
|||||||
->assertDontSee($developer->email)
|
->assertDontSee($developer->email)
|
||||||
->assertSee($employee->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 ───────────────────────────────────────────────
|
// ─── Create ───────────────────────────────────────────────
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user