aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan-Hendrik Willms <tleilax+studip@gmail.com>2024-11-18 14:26:09 +0100
committerJan-Hendrik Willms <tleilax+studip@gmail.com>2024-11-18 14:26:21 +0100
commitbb47c5f3c39f882ee92e21f3dc9d1115553a6b03 (patch)
tree2a62db40d134bf1b1e7e16ee22a1560eb0d0dcf3
parent16d821844fbd1127be5c3776f4d7a5b64945a095 (diff)
add jsonapi route /institutes/{id}/hierarchy to fetch the upwards hierarchy of an instutute, fixes #4885tic-4885
-rw-r--r--lib/classes/JsonApi/RouteMap.php1
-rw-r--r--lib/classes/JsonApi/Routes/Institutes/InstituteHierarchy.php42
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);
+ }
+}