aboutsummaryrefslogtreecommitdiff
path: root/lib/classes/JsonApi/Routes/Resources/ResourceIndex.php
diff options
context:
space:
mode:
authorJan-Hendrik Willms <tleilax+github@gmail.com>2023-12-07 14:04:18 +0100
committerJan-Hendrik Willms <tleilax+studip@gmail.com>2024-10-30 12:40:05 +0000
commit288f22cd7f789e6408c4fc8dcfac19627d0ff01b (patch)
treef38fd112175dd78dd3833036e97b4f7e42ff6f85 /lib/classes/JsonApi/Routes/Resources/ResourceIndex.php
parent363c78feaae65f3dfaba40b39463e2f1156048d4 (diff)
initial commit, re #2799tic-2799
Diffstat (limited to 'lib/classes/JsonApi/Routes/Resources/ResourceIndex.php')
-rw-r--r--lib/classes/JsonApi/Routes/Resources/ResourceIndex.php99
1 files changed, 99 insertions, 0 deletions
diff --git a/lib/classes/JsonApi/Routes/Resources/ResourceIndex.php b/lib/classes/JsonApi/Routes/Resources/ResourceIndex.php
new file mode 100644
index 0000000..07f5b12
--- /dev/null
+++ b/lib/classes/JsonApi/Routes/Resources/ResourceIndex.php
@@ -0,0 +1,99 @@
+<?php
+namespace JsonApi\Routes\Resources;
+
+use JsonApi\Schemas\ResourceSchema;
+use JsonApi\Errors\BadRequestException;
+use JsonApi\JsonApiController;
+use Psr\Http\Message\{
+ RequestInterface as Request,
+ ResponseInterface as Response
+};
+
+final class ResourceIndex extends JsonApiController
+{
+ protected $allowedFilteringParameters = ['level', 'class'];
+ protected $allowedIncludePaths = [ResourceSchema::REL_CATEGORY];
+ protected $allowedPagingParameters = ['offset', 'limit'];
+
+ public function __invoke(Request $request, Response $response, array $args): Response
+ {
+ [$offset, $limit] = $this->getOffsetAndLimit();
+ [$condition, $parameters] = $this->getConditionAndParameters(
+ $this->getFilters()
+ );
+
+ $total = \Resource::countBySql($condition, $parameters);
+ $resources = \Resource::findBySQL(
+ "{$condition} LIMIT {$offset}, {$limit}",
+ $parameters
+ );
+
+ return $this->getPaginatedContentResponse($resources, $total);
+ }
+
+ private function getFilters()
+ {
+ $filters = [];
+
+ $filtering = $this->getQueryParameters()->getFilteringParameters() ?? [];
+
+ if (array_key_exists('level', $filtering)) {
+ if (!ctype_digit($filtering['level'])) {
+ throw new BadRequestException('Level filter must be an int.');
+ }
+
+ $filters['level'] = (int) $filtering['level'];
+ }
+
+ if (array_key_exists('class', $filtering)) {
+ if (empty($filtering['class'])) {
+ throw new BadRequestException('Class filter must be not be empty.');
+ }
+
+ $filters['class'] = $filtering['class'];
+ }
+
+ return $filters;
+ }
+
+ private function getConditionAndParameters(array $filters): array
+ {
+ $joins = [];
+ $conditions = [];
+ $parameters = [];
+
+ if (array_key_exists('level', $filters)) {
+ $conditions[] = '`resources`.`level` = :level';
+ $parameters[':level'] = $filters['level'];
+ }
+
+ if (array_key_exists('class', $filters)) {
+ $joins[] = 'JOIN `resource_categories`
+ ON `resources`.`category_id` = `resource_categories`.`id`';
+ $conditions[] = '`resource_categories`.`class_name` = :class';
+ $parameters[':class'] = $filters['class'];
+ }
+
+ // Build condition
+ $condition = implode(' ', $joins);
+ if ($condition) {
+ $condition .= ' WHERE ';
+ }
+
+ if (count($conditions) === 0) {
+ $conditions[] = '1';
+ }
+
+ $condition .= implode(' AND ', array_map(
+ function ($condition): string {
+ return "({$condition})";
+ },
+ $conditions
+ ));
+
+ return [
+ $condition,
+ $parameters,
+ ];
+ }
+}