diff options
| author | Jan-Hendrik Willms <tleilax+studip@gmail.com> | 2024-11-18 14:26:09 +0100 |
|---|---|---|
| committer | Jan-Hendrik Willms <tleilax+studip@gmail.com> | 2024-11-18 14:26:21 +0100 |
| commit | bb47c5f3c39f882ee92e21f3dc9d1115553a6b03 (patch) | |
| tree | 2a62db40d134bf1b1e7e16ee22a1560eb0d0dcf3 /lib/classes/JsonApi | |
| parent | 16d821844fbd1127be5c3776f4d7a5b64945a095 (diff) | |
add jsonapi route /institutes/{id}/hierarchy to fetch the upwards hierarchy of an instutute, fixes #4885tic-4885
Diffstat (limited to 'lib/classes/JsonApi')
| -rw-r--r-- | lib/classes/JsonApi/RouteMap.php | 1 | ||||
| -rw-r--r-- | lib/classes/JsonApi/Routes/Institutes/InstituteHierarchy.php | 42 |
2 files changed, 43 insertions, 0 deletions
diff --git a/lib/classes/JsonApi/RouteMap.php b/lib/classes/JsonApi/RouteMap.php index 8c6037a..75895a8 100644 --- a/lib/classes/JsonApi/RouteMap.php +++ b/lib/classes/JsonApi/RouteMap.php @@ -276,6 +276,7 @@ class RouteMap private function addAuthenticatedInstitutesRoutes(RouteCollectorProxy $group): void { $group->get('/institute-memberships/{id}', Routes\InstituteMemberships\InstituteMembershipsShow::class); + $group->get('/institutes/{id}/hierarchy', Routes\Institutes\InstituteHierarchy::class); $group->get('/institutes/{id}', Routes\Institutes\InstitutesShow::class); $group->get('/institutes', Routes\Institutes\InstitutesIndex::class); diff --git a/lib/classes/JsonApi/Routes/Institutes/InstituteHierarchy.php b/lib/classes/JsonApi/Routes/Institutes/InstituteHierarchy.php new file mode 100644 index 0000000..a6a3fc3 --- /dev/null +++ b/lib/classes/JsonApi/Routes/Institutes/InstituteHierarchy.php @@ -0,0 +1,42 @@ +<?php +namespace JsonApi\Routes\Institutes; + +use DI\NotFoundException; +use Institute; +use JsonApi\JsonApiController; +use Psr\Http\Message\{ + ResponseInterface as Response, + ServerRequestInterface as Request +}; + +final class InstituteHierarchy extends JsonApiController +{ + public function __invoke(Request $request, Response $response, array $args): Response + { + $institute = Institute::find($args['id']); + if (!$institute) { + throw new NotFoundException(); + } + + $hierarchy = $this->getHierarchyUp($institute); + + return $this->getContentResponse($hierarchy); + } + + private function getHierarchyUp(Institute $institute): array + { + $hierarchy = []; + do { + $hierarchy[] = $institute; + + $range_tree = \RangeTreeNode::findOneBySQL( + "studip_object_id = ?", + [$institute->id] + ); + + $institute = $range_tree?->parent->institute; + } while ($institute); + + return array_reverse($hierarchy); + } +} |
