feat: implement user role management with enum and refactor role handling in administrator services
This commit is contained in:
parent
3bec716dab
commit
ad5fe33ec6
@ -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
29
app/Enums/UserRole.php
Normal 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',
|
||||
};
|
||||
}
|
||||
}
|
||||
@ -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(),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
@ -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'],
|
||||
|
||||
@ -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']);
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user