From 8f9eb5f77a3740764c3ab69285247e3fd3a6ee57 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Thu, 3 Sep 2026 11:25:23 +0700 Subject: [PATCH] refactor: streamline LecturerService methods and enhance role assignment with enum --- app/Services/Admin/Users/LecturerService.php | 83 ++++++++++---------- 1 file changed, 41 insertions(+), 42 deletions(-) diff --git a/app/Services/Admin/Users/LecturerService.php b/app/Services/Admin/Users/LecturerService.php index a336688..7f6530d 100644 --- a/app/Services/Admin/Users/LecturerService.php +++ b/app/Services/Admin/Users/LecturerService.php @@ -2,6 +2,7 @@ namespace App\Services\Admin\Users; +use App\Enums\UserRole; use App\Models\Lecturer; use App\Models\User; use Illuminate\Contracts\Pagination\LengthAwarePaginator; @@ -12,51 +13,11 @@ class LecturerService { - public function getAllForSelect(): Collection - { - return Lecturer::select(['lecturers.id', 'lecturers.user_id', 'lecturers.lecturer_number']) - ->join('users', 'users.id', '=', 'lecturers.user_id') - ->join('user_profiles', 'user_profiles.user_id', '=', 'users.id') - ->with([ - 'user:id,username', - 'user.profile:id,user_id,full_name', - 'departments:id,name', - ]) - ->orderBy('user_profiles.full_name') - ->get(); - } - public function paginated(int $perPage = 25, string $search = '', ?string $gender = null, ?int $departmentId = null): LengthAwarePaginator { return $this->filteredQuery($search, $gender, $departmentId) ->latest() - ->paginate($perPage); - } - - public function forExport(string $search = '', ?string $gender = null, ?int $departmentId = null): Collection - { - return $this->filteredQuery($search, $gender, $departmentId) - ->orderBy('created_at', 'desc') - ->get(); - } - - private function filteredQuery(string $search, ?string $gender, ?int $departmentId): Builder - { - return User::select(['id', 'username', 'email', 'is_active']) - ->with([ - 'profile:id,user_id,full_name,phone_number,gender,birth_place,birth_date,address', - 'lecturer:id,user_id,lecturer_number', - 'lecturer.departments:id,name', - ]) - ->whereHas('roles', fn ($q) => $q->where('name', 'dosen')) - ->when($search, fn ($q) => $q->where(function ($query) use ($search) { - $query->where('username', 'like', "%{$search}%") - ->orWhere('email', 'like', "%{$search}%") - ->orWhereHas('profile', fn ($q) => $q->where('full_name', 'like', "%{$search}%")) - ->orWhereHas('lecturer', fn ($q) => $q->where('lecturer_number', 'like', "%{$search}%")); - })) - ->when($gender, fn ($q) => $q->whereHas('profile', fn ($q) => $q->where('gender', $gender))) - ->when($departmentId, fn ($q) => $q->whereHas('lecturer.departments', fn ($q) => $q->where('departments.id', $departmentId))); + ->paginate($perPage, ['id', 'username', 'email', 'is_active']); } public function create(array $data): User @@ -68,7 +29,7 @@ public function create(array $data): User 'password' => Hash::make(config('app.default_password')), ]); - $user->assignRole('dosen'); + $user->assignRole(UserRole::Dosen->value); $user->profile()->create([ 'full_name' => $data['full_name'], @@ -136,4 +97,42 @@ public function updateUserStatus(User $user, bool $isActive): void { $user->update(['is_active' => $isActive]); } + + public function forExport(string $search = '', ?string $gender = null, ?int $departmentId = null): Collection + { + return $this->filteredQuery($search, $gender, $departmentId) + ->orderBy('created_at', 'desc') + ->get(['id', 'username', 'email', 'is_active']); + } + + public function getAllForSelect(): Collection + { + return Lecturer::join('users', 'users.id', '=', 'lecturers.user_id') + ->join('user_profiles', 'user_profiles.user_id', '=', 'users.id') + ->with([ + 'user:id,username', + 'user.profile:id,user_id,full_name', + 'departments:id,name', + ]) + ->orderBy('user_profiles.full_name') + ->get(['lecturers.id', 'lecturers.user_id', 'lecturers.lecturer_number']); + } + + private function filteredQuery(string $search, ?string $gender, ?int $departmentId): Builder + { + return User::with([ + 'profile:id,user_id,full_name,phone_number,gender,birth_place,birth_date,address', + 'lecturer:id,user_id,lecturer_number', + 'lecturer.departments:id,name', + ]) + ->whereHas('roles', fn ($q) => $q->where('name', UserRole::Dosen->value)) + ->when($search, fn ($q) => $q->where(function ($query) use ($search) { + $query->where('username', 'like', "%{$search}%") + ->orWhere('email', 'like', "%{$search}%") + ->orWhereHas('profile', fn ($q) => $q->where('full_name', 'like', "%{$search}%")) + ->orWhereHas('lecturer', fn ($q) => $q->where('lecturer_number', 'like', "%{$search}%")); + })) + ->when($gender, fn ($q) => $q->whereHas('profile', fn ($q) => $q->where('gender', $gender))) + ->when($departmentId, fn ($q) => $q->whereHas('lecturer.departments', fn ($q) => $q->where('departments.id', $departmentId))); + } }