diff options
| author | Thomas Hackl <hackl@data-quest.de> | 2023-06-28 13:27:46 +0000 |
|---|---|---|
| committer | Thomas Hackl <hackl@data-quest.de> | 2023-06-28 13:27:46 +0000 |
| commit | 559ab723fabd4d10f26e7df631808e4cb8d91c9b (patch) | |
| tree | 91ef8cf94eba86973baf3efabca1cdbb8bf6826b /lib/classes/JsonApi/Routes/Tree/CoursesOfTreeNode.php | |
| parent | b7f0f8bcaad8fefd96fd3e6316377eda53929ad3 (diff) | |
Resolve "Neuentwicklung Verzeichnisstrukturen"
Closes #1664, #2693, and #2692
Merge request studip/studip!1081
Diffstat (limited to 'lib/classes/JsonApi/Routes/Tree/CoursesOfTreeNode.php')
| -rw-r--r-- | lib/classes/JsonApi/Routes/Tree/CoursesOfTreeNode.php | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/lib/classes/JsonApi/Routes/Tree/CoursesOfTreeNode.php b/lib/classes/JsonApi/Routes/Tree/CoursesOfTreeNode.php new file mode 100644 index 0000000..623e619 --- /dev/null +++ b/lib/classes/JsonApi/Routes/Tree/CoursesOfTreeNode.php @@ -0,0 +1,112 @@ +<?php + +namespace JsonApi\Routes\Tree; + +use JsonApi\Errors\BadRequestException; +use Psr\Http\Message\ServerRequestInterface as Request; +use Psr\Http\Message\ResponseInterface as Response; +use JsonApi\Errors\AuthorizationFailedException; +use JsonApi\Errors\RecordNotFoundException; +use JsonApi\JsonApiController; + +class CoursesOfTreeNode extends JsonApiController +{ + protected $allowedFilteringParameters = ['q', 'semester', 'semclass', 'recursive', 'ids']; + + protected $allowedIncludePaths = [ + 'blubber-threads', + 'end-semester', + 'events', + 'feedback-elements', + 'file-refs', + 'folders', + 'forum-categories', + 'institute', + 'memberships', + 'news', + 'participating-institutes', + 'sem-class', + 'sem-type', + 'start-semester', + 'status-groups', + 'wiki-pages', + ]; + protected $allowedPagingParameters = ['offset', 'limit']; + + /** + * @SuppressWarnings(PHPMD.UnusedFormalParameters) + */ + public function __invoke(Request $request, Response $response, $args) + { + list($classname, $id) = explode('_', $args['id']); + + $node = $classname::getNode($id); + if (!$node) { + throw new RecordNotFoundException(); + } + + $error = $this->validateFilters(); + if ($error) { + throw new BadRequestException($error); + } + + $filters = $this->getContextFilters(); + + list($offset, $limit) = $this->getOffsetAndLimit(); + $courses = \SimpleCollection::createFromArray( + $node->getCourses( + $filters['semester'], + $filters['semclass'], + $filters['q'], + (bool) $filters['recursive'], + $filters['ids'] + ) + ); + + return $this->getPaginatedContentResponse( + $courses->limit($offset, $limit), + count($courses) + ); + } + + private function validateFilters() + { + $filtering = $this->getQueryParameters()->getFilteringParameters() ?: []; + + // keyword aka q + if (isset($filtering['q']) && mb_strlen($filtering['q']) < 3) { + return 'Search term too short.'; + } + + // semester + if (isset($filtering['semester']) && $filtering['semester'] !== 'all') { + $semester = \Semester::find($filtering['semester']); + if (!$semester) { + return 'Invalid "semester".'; + } + } + + // course category + if (!empty($filtering['semclass'])) { + $semclass = \SeminarCategories::Get($filtering['semclass']); + if (!$semclass) { + return 'Invalid "course category".'; + } + } + } + + private function getContextFilters() + { + $defaults = [ + 'q' => '', + 'semester' => 'all', + 'semclass' => 0, + 'recursive' => false, + 'ids' => [] + ]; + + $filtering = $this->getQueryParameters()->getFilteringParameters() ?: []; + + return array_merge($defaults, $filtering); + } +} |
