From 4a220885596557dc29aac011a4b63853edd217f5 Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Mon, 3 Jan 2022 14:27:58 +1100 Subject: [PATCH] Add `Context::sortRequested()` method to determine if a sort field has been requested --- src/Context.php | 32 ++++++++++++++++++++++++-------- src/ResourceType.php | 13 +------------ src/functions.php | 11 +++++++++++ 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/Context.php b/src/Context.php index 613dc33..1563461 100644 --- a/src/Context.php +++ b/src/Context.php @@ -60,6 +60,14 @@ class Context ); } + /** + * Get the parsed JSON:API payload. + */ + public function getBody(): ?array + { + return $this->request->getParsedBody() ?: json_decode($this->request->getBody()->getContents(), true); + } + public function response(callable $callback): void { $this->listeners['response'][] = $callback; @@ -79,6 +87,22 @@ class Context return in_array($field, explode(',', $queryParams['fields'][$type])); } + /** + * Determine whether a sort field has been requested. + */ + public function sortRequested(string $field): bool + { + if ($sortString = $this->getRequest()->getQueryParams()['sort'] ?? null) { + foreach (parse_sort_string($sortString) as [$name, $direction]) { + if ($name === $field) { + return true; + } + } + } + + return false; + } + /** * Get the value of a filter. */ @@ -86,12 +110,4 @@ class Context { return $this->request->getQueryParams()['filter'][$name] ?? null; } - - /** - * Get parsed JsonApi payload - */ - public function getBody(): ?array - { - return $this->request->getParsedBody() ?: json_decode($this->request->getBody()->getContents(), true); - } } diff --git a/src/ResourceType.php b/src/ResourceType.php index 5d9e823..131129d 100644 --- a/src/ResourceType.php +++ b/src/ResourceType.php @@ -84,7 +84,7 @@ final class ResourceType $customSorts = $schema->getSorts(); $fields = $schema->getFields(); - foreach ($this->parseSortString($sortString) as [$name, $direction]) { + foreach (parse_sort_string($sortString) as [$name, $direction]) { if ( isset($customSorts[$name]) && evaluate($customSorts[$name]->getVisible(), [$context]) @@ -107,17 +107,6 @@ final class ResourceType } } - private function parseSortString(string $string): array - { - return array_map(function ($field) { - if ($field[0] === '-') { - return [substr($field, 1), 'desc']; - } else { - return [$field, 'asc']; - } - }, explode(',', $string)); - } - /** * Apply the resource type's filters to a query. */ diff --git a/src/functions.php b/src/functions.php index dbe3f23..93d5e61 100644 --- a/src/functions.php +++ b/src/functions.php @@ -68,3 +68,14 @@ function set_value(array &$data, Field $field, $value): void { $data[$field->getLocation()][$field->getName()] = $value; } + +function parse_sort_string(string $string): array +{ + return array_map(function ($field) { + if ($field[0] === '-') { + return [substr($field, 1), 'desc']; + } else { + return [$field, 'asc']; + } + }, explode(',', $string)); +}