feat: implement user role management with enum and refactor role handling in administrator services

This commit is contained in:
Yoga Pangestu 2026-09-03 11:17:41 +07:00
parent 3bec716dab
commit ad5fe33ec6
5 changed files with 60 additions and 12 deletions

View File

@ -248,7 +248,7 @@ ## 5. Kode Ringkas & Idiomatis Laravel
* The function checks if given string is a valid ASCII string
* @param string $string
* @return bool
*/
*/
public function checkString($string) { }
// Good

29
app/Enums/UserRole.php Normal file
View File

@ -0,0 +1,29 @@
<?php
namespace App\Enums;
use App\Enums\Concerns\HasValues;
enum UserRole: string
{
use HasValues;
case Mahasiswa = 'mahasiswa';
case Dosen = 'dosen';
case Kaprodi = 'kaprodi';
case StaffAdmin = 'staff-admin';
case StaffKeuangan = 'staff-keuangan';
case Developer = 'developer';
public function label(): string
{
return match ($this) {
self::Mahasiswa => 'Mahasiswa',
self::Dosen => 'Dosen',
self::Kaprodi => 'Ketua Program Studi',
self::StaffAdmin => 'Staff Admin',
self::StaffKeuangan => 'Staff Keuangan',
self::Developer => 'Developer',
};
}
}

View File

@ -11,7 +11,6 @@
use Illuminate\Http\RedirectResponse;
use Inertia\Inertia;
use Inertia\Response;
use Spatie\Permission\Models\Role;
class AdministratorController extends Controller
{
@ -33,7 +32,7 @@ public function index(PaginatedRequest $request): Response
public function create(): Response
{
return Inertia::render('admin/users/administrators/create', [
'roles' => Role::whereIn('name', ['staff-admin', 'staff-keuangan'])->get(['id', 'name']),
'roles' => $this->service->availableRoles(),
]);
}
@ -52,7 +51,7 @@ public function edit(User $user): Response
return Inertia::render('admin/users/administrators/edit', [
'user' => $user,
'roles' => Role::whereIn('name', ['staff-admin', 'staff-keuangan'])->get(['id', 'name']),
'roles' => $this->service->availableRoles(),
]);
}

View File

@ -3,6 +3,7 @@
namespace App\Http\Requests\Admin\Users;
use App\Enums\Gender;
use App\Enums\UserRole;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rule;
@ -37,7 +38,11 @@ public function rules(): array
? Rule::unique('users')
: Rule::unique('users')->ignore($userId),
],
'role' => ['required', 'string', Rule::in(['staff-admin', 'staff-keuangan'])],
'role' => [
'required',
'string',
Rule::enum(UserRole::class)->only([UserRole::StaffAdmin, UserRole::StaffKeuangan]),
],
// Profile
'full_name' => ['required', 'string', 'max:150'],

View File

@ -2,21 +2,28 @@
namespace App\Services\Admin\Users;
use App\Enums\UserRole;
use App\Models\User;
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Spatie\Permission\Models\Role;
class AdministratorService
{
/**
* @var list<UserRole>
*/
private const ROLES = [UserRole::StaffAdmin, UserRole::StaffKeuangan];
public function paginated(int $perPage = 25, string $search = '', ?string $gender = null): LengthAwarePaginator
{
return User::select(['id', 'username', 'email', 'is_active'])
->with([
'profile:id,user_id,full_name,phone_number,gender',
'roles:id,name',
])
->whereHas('roles', fn ($q) => $q->whereIn('name', ['staff-admin', 'staff-keuangan']))
return User::with([
'profile:id,user_id,full_name,phone_number,gender',
'roles:id,name',
])
->whereHas('roles', fn ($q) => $q->whereIn('name', array_column(self::ROLES, 'value')))
->when($search, fn ($q) => $q->where(function ($query) use ($search) {
$query->where('username', 'like', "%{$search}%")
->orWhere('email', 'like', "%{$search}%")
@ -24,7 +31,7 @@ public function paginated(int $perPage = 25, string $search = '', ?string $gende
}))
->when($gender, fn ($q) => $q->whereHas('profile', fn ($q) => $q->where('gender', $gender)))
->latest()
->paginate($perPage);
->paginate($perPage, ['id', 'username', 'email', 'is_active']);
}
public function create(array $data): User
@ -93,4 +100,12 @@ public function updateUserStatus(User $user, bool $isActive): void
{
$user->update(['is_active' => $isActive]);
}
/**
* @return Collection<int, Role>
*/
public function availableRoles(): Collection
{
return Role::whereIn('name', array_column(self::ROLES, 'value'))->get(['id', 'name']);
}
}