From 609828a2e2cc2dad3438ec7d19ae5ea24576ec3d Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Fri, 4 Sep 2026 09:33:26 +0700 Subject: [PATCH] feat: update Schedule management; refactor role checks to use enums and simplify update method, remove unused fields from Schedule type --- .../AcademicClasses/ScheduleController.php | 3 +- .../Admin/AcademicClasses/ScheduleService.php | 72 +++++++++---------- resources/js/types/schedule.ts | 2 - 3 files changed, 38 insertions(+), 39 deletions(-) diff --git a/app/Http/Controllers/Admin/AcademicClasses/ScheduleController.php b/app/Http/Controllers/Admin/AcademicClasses/ScheduleController.php index 4f56c9f..790fdeb 100644 --- a/app/Http/Controllers/Admin/AcademicClasses/ScheduleController.php +++ b/app/Http/Controllers/Admin/AcademicClasses/ScheduleController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Admin\AcademicClasses; +use App\Enums\UserRole; use App\Http\Controllers\Controller; use App\Http\Requests\Admin\AcademicClasses\ScheduleRequest; use App\Http\Requests\PaginatedRequest; @@ -26,7 +27,7 @@ public function __construct( public function index(PaginatedRequest $request): Response { $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') ? $request->validated('academic_term_id') diff --git a/app/Services/Admin/AcademicClasses/ScheduleService.php b/app/Services/Admin/AcademicClasses/ScheduleService.php index cb521c8..ead1c5e 100644 --- a/app/Services/Admin/AcademicClasses/ScheduleService.php +++ b/app/Services/Admin/AcademicClasses/ScheduleService.php @@ -3,6 +3,7 @@ namespace App\Services\Admin\AcademicClasses; use App\Enums\RegistrationStatus; +use App\Enums\UserRole; use App\Models\CourseClass; use App\Models\Schedule; 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 { return Schedule::query() - ->select(['id', 'course_class_id', 'day_of_week', 'start_time', 'end_time', 'room', 'online_link']) ->with([ 'courseClass:id,course_id,lecturer_id,academic_term_id,method', '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)) ->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($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) ->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') - ->get(); - } - - /** - * 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(); + ->get(['id', 'course_class_id', 'day_of_week', 'start_time', 'end_time', 'room', 'online_link']); } public function create(array $data): Schedule @@ -75,13 +50,14 @@ public function create(array $data): Schedule public function update(Schedule $schedule, array $data): Schedule { - $schedule->course_class_id = $data['course_class_id']; - $schedule->day_of_week = $data['day_of_week']; - $schedule->start_time = $data['start_time']; - $schedule->end_time = $data['end_time']; - $schedule->room = $data['room'] ?? null; - $schedule->online_link = $data['online_link'] ?? null; - $schedule->update(); + $schedule->update([ + 'course_class_id' => $data['course_class_id'], + 'day_of_week' => $data['day_of_week'], + 'start_time' => $data['start_time'], + 'end_time' => $data['end_time'], + 'room' => $data['room'] ?? null, + 'online_link' => $data['online_link'] ?? null, + ]); return $schedule; } @@ -90,4 +66,28 @@ public function delete(Schedule $schedule): bool { 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']); + } } diff --git a/resources/js/types/schedule.ts b/resources/js/types/schedule.ts index aabb79f..8635621 100644 --- a/resources/js/types/schedule.ts +++ b/resources/js/types/schedule.ts @@ -42,6 +42,4 @@ export type Schedule = { end_time: string | null; room: string | null; online_link: string | null; - created_at: string; - updated_at: string; };