From acee293b36247b5781696313fe4755ef2c5ab5b8 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Fri, 4 Sep 2026 10:34:28 +0700 Subject: [PATCH] feat: enhance CourseClassService; improve search functionality and refine class retrieval based on user roles --- .../Manage/CourseClass/CourseClassService.php | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/app/Services/Admin/Manage/CourseClass/CourseClassService.php b/app/Services/Admin/Manage/CourseClass/CourseClassService.php index 6a2f7a1..8145560 100644 --- a/app/Services/Admin/Manage/CourseClass/CourseClassService.php +++ b/app/Services/Admin/Manage/CourseClass/CourseClassService.php @@ -2,14 +2,20 @@ namespace App\Services\Admin\Manage\CourseClass; +use App\Enums\UserRole; use App\Models\CourseClass; use App\Models\User; +use App\Services\Admin\Master\AcademicTermService; use Illuminate\Contracts\Pagination\LengthAwarePaginator; use Illuminate\Database\Eloquent\Collection; use Illuminate\Support\Facades\DB; class CourseClassService { + public function __construct( + private readonly AcademicTermService $academicTermService, + ) {} + public function paginated(int $perPage = 25, string $search = '', ?int $academicTermId = null, ?string $method = null): LengthAwarePaginator { return CourseClass::query() @@ -18,7 +24,9 @@ public function paginated(int $perPage = 25, string $search = '', ?int $academic ->join('courses', 'courses.id', '=', 'course_classes.course_id') ->withCount('enrollments') ->with(['course:id,code,name,department_id,semester_number', 'lecturer.user.profile', 'academicTerm:id,academic_year,semester,start_date,end_date']) - ->when($search, fn ($q) => $q->whereHas('course', fn ($q) => $q->where('name', 'like', "%{$search}%")->orWhere('code', 'like', "%{$search}%"))) + ->when($search, fn ($q) => $q->where(fn ($q) => $q->whereHas('course', fn ($q) => $q->where('name', 'like', "%{$search}%")->orWhere('code', 'like', "%{$search}%")) + ->orWhereHas('lecturer', fn ($q) => $q->where('lecturer_number', 'like', "%{$search}%") + ->orWhereHas('user.profile', fn ($q) => $q->where('full_name', 'like', "%{$search}%"))))) ->when($academicTermId, fn ($q) => $q->where('course_classes.academic_term_id', $academicTermId)) ->when($method, fn ($q) => $q->where('course_classes.method', $method)) ->orderByDesc('academic_terms.start_date') @@ -102,11 +110,14 @@ public function duplicateFromTerm(int $sourceAcademicTermId, int $targetAcademic } /** - * When $user is a dosen, only their own assigned classes are returned. + * When $user is a dosen, only their own classes in the active academic term are returned. * When $user is a mahasiswa, only classes from their own department are returned. */ - public function getAllForSelect(?User $user = null): Collection + public function getAllForSelect(User $user): Collection { + $isLecturer = $user->hasRole(UserRole::Dosen->value); + $activeAcademicTermId = $isLecturer ? $this->academicTermService->getActive()?->id : null; + return CourseClass::query() ->join('courses', 'courses.id', '=', 'course_classes.course_id') ->join('departments', 'departments.id', '=', 'courses.department_id') @@ -114,8 +125,9 @@ public function getAllForSelect(?User $user = null): Collection 'course:id,code,name,semester_number,department_id', 'course.department:id,name', ]) - ->when($user?->hasRole('dosen'), fn ($q) => $q->where('course_classes.lecturer_id', $user->lecturer?->id)) - ->when($user?->hasRole('mahasiswa'), fn ($q) => $q->where('courses.department_id', $user->student?->department_id)) + ->when($isLecturer, fn ($q) => $q->where('course_classes.lecturer_id', $user->lecturer?->id) + ->where('course_classes.academic_term_id', $activeAcademicTermId)) + ->when($user->hasRole(UserRole::Mahasiswa->value), fn ($q) => $q->where('courses.department_id', $user->student?->department_id)) ->orderBy('departments.name') ->orderBy('courses.semester_number') ->orderBy('courses.name')