From fda8411ab36ef4d95d957e1245cccdf470ec8ff6 Mon Sep 17 00:00:00 2001 From: Bernd Bestel Date: Wed, 9 Dec 2020 21:04:04 +0100 Subject: [PATCH] Support descending ordering in generic API filter (closes #1167) --- changelog/60_UNRELEASED_2020-xx-xx.md | 2 +- controllers/BaseApiController.php | 19 ++++++++++++++++++- grocy.openapi.json | 2 +- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/changelog/60_UNRELEASED_2020-xx-xx.md b/changelog/60_UNRELEASED_2020-xx-xx.md index 7323d5c0..2952f522 100644 --- a/changelog/60_UNRELEASED_2020-xx-xx.md +++ b/changelog/60_UNRELEASED_2020-xx-xx.md @@ -188,7 +188,7 @@ - `/chores` - `/batteries` - There are 4 new (optional) query parameters to utilize that - - `order` The field to order by + - `order` The field to order by (use the separator `:` to specify the sort order - `asc` or `desc`, defaults to `asc` when omitted) - `limit` The maximum number of objects to return - `offset` The number of objects to skip - `query[]` An array of conditions, each of them is a string in the form of ``, where diff --git a/controllers/BaseApiController.php b/controllers/BaseApiController.php index 74fc49bb..3965d7f6 100644 --- a/controllers/BaseApiController.php +++ b/controllers/BaseApiController.php @@ -47,14 +47,31 @@ class BaseApiController extends BaseController { $data = $this->filter($data, $query['query']); } + if (isset($query['limit'])) { $data = $data->limit(intval($query['limit']), intval($query['offset'] ?? 0)); } + if (isset($query['order'])) { - $data = $data->orderBy($query['order']); + $parts = explode(':', $query['order']); + + if (count($parts) == 1) + { + $data = $data->orderBy($parts[0]); + } + else + { + if ($parts[1] != 'asc' && $parts[1] != 'desc') + { + throw new \Exception('Invalid sort order ' . $parts[1]); + } + + $data = $data->orderBy($parts[0], $parts[1]); + } } + return $data; } diff --git a/grocy.openapi.json b/grocy.openapi.json index 9f392169..8ca8be24 100644 --- a/grocy.openapi.json +++ b/grocy.openapi.json @@ -5053,7 +5053,7 @@ "in": "query", "name": "order", "required": false, - "description": "A valid field name by which the response should be ordered", + "description": "A valid field name by which the response should be ordered, use the separator `:` to specify the sort order (`asc` or `desc`, defaults to `asc` when omitted)", "schema": { "type": "string" }