aboutsummaryrefslogtreecommitdiff
path: root/lib/classes/JsonApi/Routes/Institutes/InstituteHierarchy.php
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 /lib/classes/JsonApi/Routes/Institutes/InstituteHierarchy.php
parent16d821844fbd1127be5c3776f4d7a5b64945a095 (diff)
add jsonapi route /institutes/{id}/hierarchy to fetch the upwards hierarchy of an instutute, fixes #4885tic-4885
Diffstat (limited to 'lib/classes/JsonApi/Routes/Institutes/InstituteHierarchy.php')
-rw-r--r--lib/classes/JsonApi/Routes/Institutes/InstituteHierarchy.php42
1 files changed, 42 insertions, 0 deletions
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);
+ }
+}