getUser($request), $user)) { throw new AuthorizationFailedException(); } $error = $this->validateFilters(); if ($error) { throw new BadRequestException($error); } $courses = $this->findCoursesByUser( $user, $this->getSemesterFilter() ); [$offset, $limit] = $this->getOffsetAndLimit(); return $this->getPaginatedContentResponse( array_slice($courses, $offset, $limit), count($courses) ); } private function validateFilters() { $filtering = $this->getQueryParameters()->getFilteringParameters() ?: []; // semester if ( !empty($filtering['semester']) && !Semester::exists($filtering['semester']) ) { return 'Invalid "semester".'; } } private function getSemesterFilter(): ?Semester { $filtering = $this->getQueryParameters()->getFilteringParameters(); if (!isset($filtering['semester'])) { return null; } return Semester::find($filtering['semester']); } /** * @param User $user * @param Semester|null $semester * * @return Course[] */ private function findCoursesByUser(User $user, ?Semester $semester): array { $courses = Course::findBySQL( 'LEFT JOIN `semester_courses` ON `seminare`.`seminar_id` = `semester_courses`.`course_id` LEFT JOIN `semester_data` USING (`semester_id`) WHERE `seminare`.`seminar_id` IN ( :course_ids ) ORDER BY `semester_data`.`beginn`, `seminare`.`name`', ['course_ids' => $user->course_memberships->pluck('seminar_id')] ); if ($semester) { $courses = array_filter($courses, function (Course $course) use ($semester): bool { return $course->isInSemester($semester); }); } return $courses; } }