From 25fbbee883e2e6f28304c1d2341086af9332a353 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sun, 20 Sep 2020 13:21:21 +0200 Subject: [PATCH] Added support to order short urls liusts using the : notaiton as string --- module/Core/src/Model/ShortUrlsOrdering.php | 14 +++++++++++--- module/Rest/test-api/Action/ListShortUrlsTest.php | 8 ++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/module/Core/src/Model/ShortUrlsOrdering.php b/module/Core/src/Model/ShortUrlsOrdering.php index 00c30a54..3f1dbd88 100644 --- a/module/Core/src/Model/ShortUrlsOrdering.php +++ b/module/Core/src/Model/ShortUrlsOrdering.php @@ -6,6 +6,7 @@ namespace Shlinkio\Shlink\Core\Model; use Shlinkio\Shlink\Core\Exception\ValidationException; +use function explode; use function is_array; use function is_string; use function key; @@ -40,15 +41,22 @@ final class ShortUrlsOrdering return; } + // FIXME Providing the ordering as array is considered deprecated. To be removed in v3.0.0 $isArray = is_array($orderBy); - if (! $isArray && $orderBy !== null && ! is_string($orderBy)) { + if (! $isArray && ! is_string($orderBy)) { throw ValidationException::fromArray([ 'orderBy' => '"Order by" must be an array, string or null', ]); } - $this->orderField = $isArray ? key($orderBy) : $orderBy; - $this->orderDirection = $isArray ? $orderBy[$this->orderField] : self::DEFAULT_ORDER_DIRECTION; + if (! $isArray) { + $parts = explode(':', $orderBy); + $this->orderField = $parts[0]; + $this->orderDirection = $parts[1] ?? self::DEFAULT_ORDER_DIRECTION; + } else { + $this->orderField = key($orderBy); + $this->orderDirection = $orderBy[$this->orderField]; + } } public function orderField(): ?string diff --git a/module/Rest/test-api/Action/ListShortUrlsTest.php b/module/Rest/test-api/Action/ListShortUrlsTest.php index 7d4e51a7..32d87bdf 100644 --- a/module/Rest/test-api/Action/ListShortUrlsTest.php +++ b/module/Rest/test-api/Action/ListShortUrlsTest.php @@ -145,6 +145,14 @@ class ListShortUrlsTest extends ApiTestCase self::SHORT_URL_CUSTOM_SLUG, self::SHORT_URL_SHLINK, ]]; + yield [['orderBy' => 'shortCode:DESC'], [ + self::SHORT_URL_DOCS, + self::SHORT_URL_CUSTOM_DOMAIN, + self::SHORT_URL_META, + self::SHORT_URL_CUSTOM_SLUG_AND_DOMAIN, + self::SHORT_URL_CUSTOM_SLUG, + self::SHORT_URL_SHLINK, + ]]; yield [['startDate' => Chronos::parse('2018-12-01')->toAtomString()], [ self::SHORT_URL_META, self::SHORT_URL_CUSTOM_SLUG,