feat: update Schedule management; refactor role checks to use enums and simplify update method, remove unused fields from Schedule type
This commit is contained in:
parent
573d834905
commit
609828a2e2
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace App\Http\Controllers\Admin\AcademicClasses;
|
namespace App\Http\Controllers\Admin\AcademicClasses;
|
||||||
|
|
||||||
|
use App\Enums\UserRole;
|
||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use App\Http\Requests\Admin\AcademicClasses\ScheduleRequest;
|
use App\Http\Requests\Admin\AcademicClasses\ScheduleRequest;
|
||||||
use App\Http\Requests\PaginatedRequest;
|
use App\Http\Requests\PaginatedRequest;
|
||||||
@ -26,7 +27,7 @@ public function __construct(
|
|||||||
public function index(PaginatedRequest $request): Response
|
public function index(PaginatedRequest $request): Response
|
||||||
{
|
{
|
||||||
$user = $request->user();
|
$user = $request->user();
|
||||||
$isPersonalView = $user->hasRole('mahasiswa') || $user->hasRole('dosen');
|
$isPersonalView = $user->hasRole(UserRole::Mahasiswa->value) || $user->hasRole(UserRole::Dosen->value);
|
||||||
|
|
||||||
$academicTermId = $request->has('academic_term_id')
|
$academicTermId = $request->has('academic_term_id')
|
||||||
? $request->validated('academic_term_id')
|
? $request->validated('academic_term_id')
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
namespace App\Services\Admin\AcademicClasses;
|
namespace App\Services\Admin\AcademicClasses;
|
||||||
|
|
||||||
use App\Enums\RegistrationStatus;
|
use App\Enums\RegistrationStatus;
|
||||||
|
use App\Enums\UserRole;
|
||||||
use App\Models\CourseClass;
|
use App\Models\CourseClass;
|
||||||
use App\Models\Schedule;
|
use App\Models\Schedule;
|
||||||
use App\Models\User;
|
use App\Models\User;
|
||||||
@ -13,7 +14,6 @@ class ScheduleService
|
|||||||
public function all(User $user, ?int $academicTermId = null, ?int $departmentId = null, ?int $semesterNumber = null): Collection
|
public function all(User $user, ?int $academicTermId = null, ?int $departmentId = null, ?int $semesterNumber = null): Collection
|
||||||
{
|
{
|
||||||
return Schedule::query()
|
return Schedule::query()
|
||||||
->select(['id', 'course_class_id', 'day_of_week', 'start_time', 'end_time', 'room', 'online_link'])
|
|
||||||
->with([
|
->with([
|
||||||
'courseClass:id,course_id,lecturer_id,academic_term_id,method',
|
'courseClass:id,course_id,lecturer_id,academic_term_id,method',
|
||||||
'courseClass.course:id,code,name,department_id',
|
'courseClass.course:id,code,name,department_id',
|
||||||
@ -26,39 +26,14 @@ public function all(User $user, ?int $academicTermId = null, ?int $departmentId
|
|||||||
$q->when($academicTermId, fn ($q) => $q->where('academic_term_id', $academicTermId))
|
$q->when($academicTermId, fn ($q) => $q->where('academic_term_id', $academicTermId))
|
||||||
->when($departmentId, fn ($q) => $q->whereHas('course', fn ($q) => $q->where('department_id', $departmentId)))
|
->when($departmentId, fn ($q) => $q->whereHas('course', fn ($q) => $q->where('department_id', $departmentId)))
|
||||||
->when($semesterNumber, fn ($q) => $q->whereHas('course', fn ($q) => $q->where('semester_number', $semesterNumber)))
|
->when($semesterNumber, fn ($q) => $q->whereHas('course', fn ($q) => $q->where('semester_number', $semesterNumber)))
|
||||||
->when($user->hasRole('mahasiswa'), fn ($q) => $q->whereHas('registrations', function ($q) use ($user) {
|
->when($user->hasRole(UserRole::Mahasiswa->value), fn ($q) => $q->whereHas('registrations', function ($q) use ($user) {
|
||||||
$q->where('student_id', $user->student?->id)
|
$q->where('student_id', $user->student?->id)
|
||||||
->whereHas('submission', fn ($q) => $q->where('status', RegistrationStatus::Approved));
|
->whereHas('submission', fn ($q) => $q->where('status', RegistrationStatus::Approved));
|
||||||
}))
|
}))
|
||||||
->when($user->hasRole('dosen'), fn ($q) => $q->where('lecturer_id', $user->lecturer?->id));
|
->when($user->hasRole(UserRole::Dosen->value), fn ($q) => $q->where('lecturer_id', $user->lecturer?->id));
|
||||||
})
|
})
|
||||||
->orderBy('start_time')
|
->orderBy('start_time')
|
||||||
->get();
|
->get(['id', 'course_class_id', 'day_of_week', 'start_time', 'end_time', 'room', 'online_link']);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Course classes for the schedule form's picker, grouped by department and
|
|
||||||
* semester and ordered alphabetically to match the course-class picker
|
|
||||||
* pattern used elsewhere.
|
|
||||||
*/
|
|
||||||
public function courseClassOptions(): Collection
|
|
||||||
{
|
|
||||||
return CourseClass::query()
|
|
||||||
->select(['course_classes.id', 'course_classes.course_id', 'course_classes.lecturer_id', 'course_classes.academic_term_id'])
|
|
||||||
->join('courses', 'courses.id', '=', 'course_classes.course_id')
|
|
||||||
->join('departments', 'departments.id', '=', 'courses.department_id')
|
|
||||||
->with([
|
|
||||||
'course:id,code,name,department_id,semester_number',
|
|
||||||
'course.department:id,name',
|
|
||||||
'lecturer:id,user_id,lecturer_number',
|
|
||||||
'lecturer.user:id,username',
|
|
||||||
'lecturer.user.profile:id,user_id,full_name',
|
|
||||||
'academicTerm:id,academic_year,semester,start_date,end_date',
|
|
||||||
])
|
|
||||||
->orderBy('departments.name')
|
|
||||||
->orderBy('courses.semester_number')
|
|
||||||
->orderBy('courses.name')
|
|
||||||
->get();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function create(array $data): Schedule
|
public function create(array $data): Schedule
|
||||||
@ -75,13 +50,14 @@ public function create(array $data): Schedule
|
|||||||
|
|
||||||
public function update(Schedule $schedule, array $data): Schedule
|
public function update(Schedule $schedule, array $data): Schedule
|
||||||
{
|
{
|
||||||
$schedule->course_class_id = $data['course_class_id'];
|
$schedule->update([
|
||||||
$schedule->day_of_week = $data['day_of_week'];
|
'course_class_id' => $data['course_class_id'],
|
||||||
$schedule->start_time = $data['start_time'];
|
'day_of_week' => $data['day_of_week'],
|
||||||
$schedule->end_time = $data['end_time'];
|
'start_time' => $data['start_time'],
|
||||||
$schedule->room = $data['room'] ?? null;
|
'end_time' => $data['end_time'],
|
||||||
$schedule->online_link = $data['online_link'] ?? null;
|
'room' => $data['room'] ?? null,
|
||||||
$schedule->update();
|
'online_link' => $data['online_link'] ?? null,
|
||||||
|
]);
|
||||||
|
|
||||||
return $schedule;
|
return $schedule;
|
||||||
}
|
}
|
||||||
@ -90,4 +66,28 @@ public function delete(Schedule $schedule): bool
|
|||||||
{
|
{
|
||||||
return $schedule->delete();
|
return $schedule->delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Course classes for the schedule form's picker, grouped by department and
|
||||||
|
* semester and ordered alphabetically to match the course-class picker
|
||||||
|
* pattern used elsewhere.
|
||||||
|
*/
|
||||||
|
public function courseClassOptions(): Collection
|
||||||
|
{
|
||||||
|
return CourseClass::query()
|
||||||
|
->join('courses', 'courses.id', '=', 'course_classes.course_id')
|
||||||
|
->join('departments', 'departments.id', '=', 'courses.department_id')
|
||||||
|
->with([
|
||||||
|
'course:id,code,name,department_id,semester_number',
|
||||||
|
'course.department:id,name',
|
||||||
|
'lecturer:id,user_id,lecturer_number',
|
||||||
|
'lecturer.user:id,username',
|
||||||
|
'lecturer.user.profile:id,user_id,full_name',
|
||||||
|
'academicTerm:id,academic_year,semester,start_date,end_date',
|
||||||
|
])
|
||||||
|
->orderBy('departments.name')
|
||||||
|
->orderBy('courses.semester_number')
|
||||||
|
->orderBy('courses.name')
|
||||||
|
->get(['course_classes.id', 'course_classes.course_id', 'course_classes.lecturer_id', 'course_classes.academic_term_id']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -42,6 +42,4 @@ export type Schedule = {
|
|||||||
end_time: string | null;
|
end_time: string | null;
|
||||||
room: string | null;
|
room: string | null;
|
||||||
online_link: string | null;
|
online_link: string | null;
|
||||||
created_at: string;
|
|
||||||
updated_at: string;
|
|
||||||
};
|
};
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user