feat: enhance CourseClassService; improve search functionality and refine class retrieval based on user roles

This commit is contained in:
Yoga Pangestu 2026-09-04 10:34:28 +07:00
parent 6ec257a1cc
commit acee293b36

View File

@ -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')