From 7d95969f03aca7126a97cf8167b30bcfcc8dd599 Mon Sep 17 00:00:00 2001 From: Yuri Kuznetsov Date: Sat, 10 Jul 2021 13:17:41 +0300 Subject: [PATCH] searchParams in json --- .../Espo/Core/Record/SearchParamsFetcher.php | 36 +++++++++- .../Core/Record/SearchParamsFetcherTest.php | 72 +++++++++++++++++++ 2 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 tests/unit/Espo/Core/Record/SearchParamsFetcherTest.php diff --git a/application/Espo/Core/Record/SearchParamsFetcher.php b/application/Espo/Core/Record/SearchParamsFetcher.php index 90ddfac045..57dae07e8d 100644 --- a/application/Espo/Core/Record/SearchParamsFetcher.php +++ b/application/Espo/Core/Record/SearchParamsFetcher.php @@ -31,11 +31,15 @@ namespace Espo\Core\Record; use Espo\Core\{ Exceptions\Forbidden, + Exceptions\BadRequest, Utils\Config, Api\Request, Select\SearchParams, + Utils\Json, }; +use JsonException; + class SearchParamsFetcher { private const MAX_SIZE_LIMIT = 200; @@ -55,6 +59,27 @@ class SearchParamsFetcher } private function fetchRaw(Request $request): array + { + $params = $request->hasQueryParam('searchParams') ? + $this->fetchRawJsonSearchParams($request): + $this->fetchRawMultipleParams($request); + + $this->handleRawParams($params); + + return $params; + } + + private function fetchRawJsonSearchParams(Request $request): array + { + try { + return Json::decode($request->getQueryParam('searchParams'), true); + } + catch (JsonException $e) { + throw new BadRequest("Invalid search params JSON."); + } + } + + private function fetchRawMultipleParams(Request $request): array { $params = []; @@ -119,11 +144,18 @@ class SearchParamsFetcher $params['select'] = explode(',', $request->getQueryParam('select')); } - $this->handleMaxSize($params); - return $params; } + private function handleRawParams(array &$params): void + { + if (isset($params['maxSize']) && !is_int($params['maxSize'])) { + throw new BadRequest('maxSize must be integer.'); + } + + $this->handleMaxSize($params); + } + private function handleMaxSize(array &$params): void { $value = $params['maxSize']; diff --git a/tests/unit/Espo/Core/Record/SearchParamsFetcherTest.php b/tests/unit/Espo/Core/Record/SearchParamsFetcherTest.php new file mode 100644 index 0000000000..2ec052459a --- /dev/null +++ b/tests/unit/Espo/Core/Record/SearchParamsFetcherTest.php @@ -0,0 +1,72 @@ +config = $this->createMocK(Config::class); + + $this->config + ->method('get') + ->with('recordListMaxSizeLimit') + ->willReturn(null); + } + + public function testFetchJson1(): void + { + $raw = [ + 'textFilter' => 'test*', + 'maxSize' => 10, + ]; + + $q = http_build_query(['searchParams' => json_encode($raw)]); + + $request = (new RequestFactory)->createRequest('GET', 'http://localhost/?' . $q); + + $fetcher = new SearchParamsFetcher($this->config); + + $params = $fetcher->fetch(new RequestWrapper($request)); + + $this->assertEquals($params->getTextFilter(), $raw['textFilter']); + $this->assertEquals($params->getMaxSize(), $raw['maxSize']); + } +}