From ad5fe33ec6db6f1e5fd1677a5cfe7e93ed8762bb Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Thu, 3 Sep 2026 11:17:41 +0700 Subject: [PATCH] feat: implement user role management with enum and refactor role handling in administrator services --- BEST_PRACTICE.md | 2 +- app/Enums/UserRole.php | 29 +++++++++++++++++++ .../Admin/Users/AdministratorController.php | 5 ++-- .../Admin/Users/AdministratorRequest.php | 7 ++++- .../Admin/Users/AdministratorService.php | 29 ++++++++++++++----- 5 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 app/Enums/UserRole.php diff --git a/BEST_PRACTICE.md b/BEST_PRACTICE.md index 7b8779f..2e95424 100644 --- a/BEST_PRACTICE.md +++ b/BEST_PRACTICE.md @@ -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 diff --git a/app/Enums/UserRole.php b/app/Enums/UserRole.php new file mode 100644 index 0000000..7672069 --- /dev/null +++ b/app/Enums/UserRole.php @@ -0,0 +1,29 @@ + 'Mahasiswa', + self::Dosen => 'Dosen', + self::Kaprodi => 'Ketua Program Studi', + self::StaffAdmin => 'Staff Admin', + self::StaffKeuangan => 'Staff Keuangan', + self::Developer => 'Developer', + }; + } +} diff --git a/app/Http/Controllers/Admin/Users/AdministratorController.php b/app/Http/Controllers/Admin/Users/AdministratorController.php index 0d11934..cb09ca6 100644 --- a/app/Http/Controllers/Admin/Users/AdministratorController.php +++ b/app/Http/Controllers/Admin/Users/AdministratorController.php @@ -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(), ]); } diff --git a/app/Http/Requests/Admin/Users/AdministratorRequest.php b/app/Http/Requests/Admin/Users/AdministratorRequest.php index b575801..3473653 100644 --- a/app/Http/Requests/Admin/Users/AdministratorRequest.php +++ b/app/Http/Requests/Admin/Users/AdministratorRequest.php @@ -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'], diff --git a/app/Services/Admin/Users/AdministratorService.php b/app/Services/Admin/Users/AdministratorService.php index b7898ba..f074310 100644 --- a/app/Services/Admin/Users/AdministratorService.php +++ b/app/Services/Admin/Users/AdministratorService.php @@ -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 + */ + 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 + */ + public function availableRoles(): Collection + { + return Role::whereIn('name', array_column(self::ROLES, 'value'))->get(['id', 'name']); + } }