feat: enhance CourseClassService; improve search functionality and refine class retrieval based on user roles
This commit is contained in:
parent
6ec257a1cc
commit
acee293b36
@ -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')
|
||||
|
||||
Loading…
Reference in New Issue
Block a user