searchParams in json

This commit is contained in:
Yuri Kuznetsov
2021-07-10 13:17:41 +03:00
parent f67b06be88
commit 7d95969f03
2 changed files with 106 additions and 2 deletions

View File

@@ -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'];

View File

@@ -0,0 +1,72 @@
<?php
/************************************************************************
* This file is part of EspoCRM.
*
* EspoCRM - Open Source CRM application.
* Copyright (C) 2014-2021 Yurii Kuznietsov, Taras Machyshyn, Oleksii Avramenko
* Website: https://www.espocrm.com
*
* EspoCRM is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* EspoCRM is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with EspoCRM. If not, see http://www.gnu.org/licenses/.
*
* The interactive user interfaces in modified source and object code versions
* of this program must display Appropriate Legal Notices, as required under
* Section 5 of the GNU General Public License version 3.
*
* In accordance with Section 7(b) of the GNU General Public License version 3,
* these Appropriate Legal Notices must retain the display of the "EspoCRM" word.
************************************************************************/
namespace tests\unit\Espo\Core\Record;
use Espo\Core\Record\SearchParamsFetcher;
use Espo\Core\Api\RequestWrapper;
use Espo\Core\Utils\Config;
use Slim\Psr7\Factory\RequestFactory;
class SearchParamsFetcherTest extends \PHPUnit\Framework\TestCase
{
private $config;
protected function setUp(): void
{
$this->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']);
}
}