From 139875ce317486949ca94c7ce32c6fb843210214 Mon Sep 17 00:00:00 2001 From: Yoga Pangestu Date: Fri, 4 Sep 2026 13:26:41 +0700 Subject: [PATCH] feat: enhance AssignmentService and MaterialService; add notification functionality for new assignments and materials --- .../Assignment/AssignmentService.php | 21 +++++++++++++++++++ .../Admin/AcademicClasses/MaterialService.php | 21 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/app/Services/Admin/AcademicClasses/Assignment/AssignmentService.php b/app/Services/Admin/AcademicClasses/Assignment/AssignmentService.php index 339167b..be2f12c 100644 --- a/app/Services/Admin/AcademicClasses/Assignment/AssignmentService.php +++ b/app/Services/Admin/AcademicClasses/Assignment/AssignmentService.php @@ -6,12 +6,18 @@ use App\Enums\RegistrationStatus; use App\Enums\UserRole; use App\Models\Assignment; +use App\Models\CourseRegistration; use App\Models\User; +use App\Services\NotificationService; use Illuminate\Contracts\Pagination\LengthAwarePaginator; use Illuminate\Http\UploadedFile; class AssignmentService { + public function __construct( + private readonly NotificationService $notificationService, + ) {} + public function paginated(User $user, int $perPage = 25, string $search = '', ?int $courseClassId = null, ?int $academicTermId = null): LengthAwarePaginator { return Assignment::query() @@ -54,6 +60,21 @@ public function create(array $data, ?UploadedFile $file): Assignment $assignment->addMedia($file)->toMediaCollection('assignment_attachment'); } + $assignment->load('courseClass.course'); + + $recipientUserIds = CourseRegistration::query() + ->where('course_class_id', $assignment->course_class_id) + ->whereHas('submission', fn ($q) => $q->where('status', RegistrationStatus::Approved)) + ->with('student:id,user_id') + ->get() + ->pluck('student.user_id'); + + $this->notificationService->sendToUsers( + $recipientUserIds, + 'Tugas Baru', + "Tugas baru \"{$assignment->title}\" telah ditambahkan pada kelas {$assignment->courseClass->course->name}.", + ); + return $assignment; } diff --git a/app/Services/Admin/AcademicClasses/MaterialService.php b/app/Services/Admin/AcademicClasses/MaterialService.php index ced01d0..39ccc06 100644 --- a/app/Services/Admin/AcademicClasses/MaterialService.php +++ b/app/Services/Admin/AcademicClasses/MaterialService.php @@ -4,13 +4,19 @@ use App\Enums\RegistrationStatus; use App\Enums\UserRole; +use App\Models\CourseRegistration; use App\Models\Material; use App\Models\User; +use App\Services\NotificationService; use Illuminate\Contracts\Pagination\LengthAwarePaginator; use Illuminate\Http\UploadedFile; class MaterialService { + public function __construct( + private readonly NotificationService $notificationService, + ) {} + public function paginated(User $user, int $perPage = 25, string $search = '', ?int $courseClassId = null): LengthAwarePaginator { return Material::query() @@ -42,6 +48,21 @@ public function create(array $data, ?UploadedFile $file): Material $material->addMedia($file)->toMediaCollection('materials'); } + $material->load('courseClass.course'); + + $recipientUserIds = CourseRegistration::query() + ->where('course_class_id', $material->course_class_id) + ->whereHas('submission', fn ($q) => $q->where('status', RegistrationStatus::Approved)) + ->with('student:id,user_id') + ->get() + ->pluck('student.user_id'); + + $this->notificationService->sendToUsers( + $recipientUserIds, + 'Materi Baru', + "Materi baru \"{$material->title}\" telah ditambahkan pada kelas {$material->courseClass->course->name}.", + ); + return $material; }