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;
|
namespace App\Services\Admin\Manage\CourseClass;
|
||||||
|
|
||||||
|
use App\Enums\UserRole;
|
||||||
use App\Models\CourseClass;
|
use App\Models\CourseClass;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
|
use App\Services\Admin\Master\AcademicTermService;
|
||||||
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
use Illuminate\Contracts\Pagination\LengthAwarePaginator;
|
||||||
use Illuminate\Database\Eloquent\Collection;
|
use Illuminate\Database\Eloquent\Collection;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
|
|
||||||
class CourseClassService
|
class CourseClassService
|
||||||
{
|
{
|
||||||
|
public function __construct(
|
||||||
|
private readonly AcademicTermService $academicTermService,
|
||||||
|
) {}
|
||||||
|
|
||||||
public function paginated(int $perPage = 25, string $search = '', ?int $academicTermId = null, ?string $method = null): LengthAwarePaginator
|
public function paginated(int $perPage = 25, string $search = '', ?int $academicTermId = null, ?string $method = null): LengthAwarePaginator
|
||||||
{
|
{
|
||||||
return CourseClass::query()
|
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')
|
->join('courses', 'courses.id', '=', 'course_classes.course_id')
|
||||||
->withCount('enrollments')
|
->withCount('enrollments')
|
||||||
->with(['course:id,code,name,department_id,semester_number', 'lecturer.user.profile', 'academicTerm:id,academic_year,semester,start_date,end_date'])
|
->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($academicTermId, fn ($q) => $q->where('course_classes.academic_term_id', $academicTermId))
|
||||||
->when($method, fn ($q) => $q->where('course_classes.method', $method))
|
->when($method, fn ($q) => $q->where('course_classes.method', $method))
|
||||||
->orderByDesc('academic_terms.start_date')
|
->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.
|
* 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()
|
return CourseClass::query()
|
||||||
->join('courses', 'courses.id', '=', 'course_classes.course_id')
|
->join('courses', 'courses.id', '=', 'course_classes.course_id')
|
||||||
->join('departments', 'departments.id', '=', 'courses.department_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:id,code,name,semester_number,department_id',
|
||||||
'course.department:id,name',
|
'course.department:id,name',
|
||||||
])
|
])
|
||||||
->when($user?->hasRole('dosen'), fn ($q) => $q->where('course_classes.lecturer_id', $user->lecturer?->id))
|
->when($isLecturer, 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))
|
->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('departments.name')
|
||||||
->orderBy('courses.semester_number')
|
->orderBy('courses.semester_number')
|
||||||
->orderBy('courses.name')
|
->orderBy('courses.name')
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user