aboutsummaryrefslogtreecommitdiff
path: root/lib/classes/JsonApi/Routes/Institutes/InstituteHierarchy.php
diff options
context:
space:
mode:
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);
+ }
+}