feat: implement user role management with enum and refactor role handling in administrator services
This commit is contained in:
parent
3bec716dab
commit
ad5fe33ec6
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 Illuminate\Http\RedirectResponse;
|
||||||
use Inertia\Inertia;
|
use Inertia\Inertia;
|
||||||
use Inertia\Response;
|
use Inertia\Response;
|
||||||
use Spatie\Permission\Models\Role;
|
|
||||||
|
|
||||||
class AdministratorController extends Controller
|
class AdministratorController extends Controller
|
||||||
{
|
{
|
||||||
@ -33,7 +32,7 @@ public function index(PaginatedRequest $request): Response
|
|||||||
public function create(): Response
|
public function create(): Response
|
||||||
{
|
{
|
||||||
return Inertia::render('admin/users/administrators/create', [
|
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', [
|
return Inertia::render('admin/users/administrators/edit', [
|
||||||
'user' => $user,
|
'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;
|
namespace App\Http\Requests\Admin\Users;
|
||||||
|
|
||||||
use App\Enums\Gender;
|
use App\Enums\Gender;
|
||||||
|
use App\Enums\UserRole;
|
||||||
use Illuminate\Foundation\Http\FormRequest;
|
use Illuminate\Foundation\Http\FormRequest;
|
||||||
use Illuminate\Validation\Rule;
|
use Illuminate\Validation\Rule;
|
||||||
|
|
||||||
@ -37,7 +38,11 @@ public function rules(): array
|
|||||||
? Rule::unique('users')
|
? Rule::unique('users')
|
||||||
: Rule::unique('users')->ignore($userId),
|
: 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
|
// Profile
|
||||||
'full_name' => ['required', 'string', 'max:150'],
|
'full_name' => ['required', 'string', 'max:150'],
|
||||||
|
|||||||
@ -2,21 +2,28 @@
|
|||||||
|
|
||||||
namespace App\Services\Admin\Users;
|
namespace App\Services\Admin\Users;
|
||||||
|
|
||||||
|
use App\Enums\UserRole;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use Illuminate\Support\Facades\Hash;
|
use Illuminate\Support\Facades\Hash;
|
||||||
|
use Spatie\Permission\Models\Role;
|
||||||
|
|
||||||
class AdministratorService
|
class AdministratorService
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @var list<UserRole>
|
||||||
|
*/
|
||||||
|
private const ROLES = [UserRole::StaffAdmin, UserRole::StaffKeuangan];
|
||||||
|
|
||||||
public function paginated(int $perPage = 25, string $search = '', ?string $gender = null): LengthAwarePaginator
|
public function paginated(int $perPage = 25, string $search = '', ?string $gender = null): LengthAwarePaginator
|
||||||
{
|
{
|
||||||
return User::select(['id', 'username', 'email', 'is_active'])
|
return User::with([
|
||||||
->with([
|
'profile:id,user_id,full_name,phone_number,gender',
|
||||||
'profile:id,user_id,full_name,phone_number,gender',
|
'roles:id,name',
|
||||||
'roles:id,name',
|
])
|
||||||
])
|
->whereHas('roles', fn ($q) => $q->whereIn('name', array_column(self::ROLES, 'value')))
|
||||||
->whereHas('roles', fn ($q) => $q->whereIn('name', ['staff-admin', 'staff-keuangan']))
|
|
||||||
->when($search, fn ($q) => $q->where(function ($query) use ($search) {
|
->when($search, fn ($q) => $q->where(function ($query) use ($search) {
|
||||||
$query->where('username', 'like', "%{$search}%")
|
$query->where('username', 'like', "%{$search}%")
|
||||||
->orWhere('email', '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)))
|
->when($gender, fn ($q) => $q->whereHas('profile', fn ($q) => $q->where('gender', $gender)))
|
||||||
->latest()
|
->latest()
|
||||||
->paginate($perPage);
|
->paginate($perPage, ['id', 'username', 'email', 'is_active']);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function create(array $data): User
|
public function create(array $data): User
|
||||||
@ -93,4 +100,12 @@ public function updateUserStatus(User $user, bool $isActive): void
|
|||||||
{
|
{
|
||||||
$user->update(['is_active' => $isActive]);
|
$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