Skip to content
This repository has been archived by the owner on Aug 13, 2019. It is now read-only.

Commit

Permalink
III-2160: Use decorator pattern when parsing parameter bags
Browse files Browse the repository at this point in the history
  • Loading branch information
bertramakers committed Jun 8, 2017
1 parent e11d075 commit df79246
Show file tree
Hide file tree
Showing 5 changed files with 88 additions and 117 deletions.
8 changes: 2 additions & 6 deletions src/Offer/RequestParser/CompositeOfferRequestParser.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

namespace CultuurNet\UDB3\Search\Http\Offer\RequestParser;

use CultuurNet\UDB3\Search\Http\ParameterBagParser;
use CultuurNet\UDB3\Search\Offer\OfferQueryBuilderInterface;
use Symfony\Component\HttpFoundation\Request;

Expand All @@ -13,13 +12,10 @@ class CompositeOfferRequestParser implements OfferRequestParserInterface
*/
private $parsers = [];

/**
* @param ParameterBagParser $parameterBagParser
*/
public function __construct(ParameterBagParser $parameterBagParser)
public function __construct()
{
$this->parsers = [
new DocumentLanguageOfferRequestParser($parameterBagParser),
new DocumentLanguageOfferRequestParser(),
];
}

Expand Down
31 changes: 9 additions & 22 deletions src/Offer/RequestParser/DocumentLanguageOfferRequestParser.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,34 +3,22 @@
namespace CultuurNet\UDB3\Search\Http\Offer\RequestParser;

use CultuurNet\UDB3\Language;
use CultuurNet\UDB3\Search\Http\ParameterBagParser;
use CultuurNet\UDB3\Search\Http\ParameterBagReader;
use CultuurNet\UDB3\Search\Offer\OfferQueryBuilderInterface;
use Symfony\Component\HttpFoundation\Request;

class DocumentLanguageOfferRequestParser implements OfferRequestParserInterface
{
/**
* @var ParameterBagParser
*/
private $parameterBagParser;

/**
* @param ParameterBagParser $parameterBagParser
*/
public function __construct(ParameterBagParser $parameterBagParser)
{
$this->parameterBagParser = $parameterBagParser;
}

/**
* @param Request $request
* @param OfferQueryBuilderInterface $offerQueryBuilder
* @return OfferQueryBuilderInterface
*/
public function parse(Request $request, OfferQueryBuilderInterface $offerQueryBuilder)
{
$mainLanguage = $this->parameterBagParser->getStringFromQueryParameter(
$request,
$parameterBagReader = new ParameterBagReader($request->query);

$mainLanguage = $parameterBagReader->getStringFromQueryParameter(
'mainLanguage',
null,
$this->getLanguageCallback()
Expand All @@ -40,12 +28,12 @@ public function parse(Request $request, OfferQueryBuilderInterface $offerQueryBu
$offerQueryBuilder = $offerQueryBuilder->withMainLanguageFilter($mainLanguage);
}

$languages = $this->getLanguagesFromQuery($request, 'languages');
$languages = $this->getLanguagesFromQuery($parameterBagReader, 'languages');
foreach ($languages as $language) {
$offerQueryBuilder = $offerQueryBuilder->withLanguageFilter($language);
}

$completedLanguages = $this->getLanguagesFromQuery($request, 'completedLanguages');
$completedLanguages = $this->getLanguagesFromQuery($parameterBagReader, 'completedLanguages');
foreach ($completedLanguages as $completedLanguage) {
$offerQueryBuilder = $offerQueryBuilder->withCompletedLanguageFilter($completedLanguage);
}
Expand All @@ -54,14 +42,13 @@ public function parse(Request $request, OfferQueryBuilderInterface $offerQueryBu
}

/**
* @param Request $request
* @param ParameterBagReader $parameterBagReader
* @param string $queryParameter
* @return Language[]
*/
private function getLanguagesFromQuery(Request $request, $queryParameter)
private function getLanguagesFromQuery(ParameterBagReader $parameterBagReader, $queryParameter)
{
return $this->parameterBagParser->getArrayFromQueryParameter(
$request,
return $parameterBagReader->getArrayFromQueryParameter(
$queryParameter,
$this->getLanguageCallback()
);
Expand Down
43 changes: 20 additions & 23 deletions src/ParameterBagParser.php → src/ParameterBagReader.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,36 +2,42 @@

namespace CultuurNet\UDB3\Search\Http;

use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\ParameterBag;

class ParameterBagParser
class ParameterBagReader
{
/**
* @var ParameterBag
*/
private $parameterBag;

/**
* @var string
*/
private $resetValue;

/**
* @param ParameterBag $parameterBag
* @param string $resetValue
*/
public function __construct($resetValue = '*')
public function __construct(ParameterBag $parameterBag, $resetValue = '*')
{
$this->parameterBag = $parameterBag;
$this->resetValue = $resetValue;
}

/**
* @param Request $request
* @param string $queryParameter
* @param callable|null $callback
* @return array
*/
public function getArrayFromQueryParameter(Request $request, $queryParameter, callable $callback = null)
public function getArrayFromQueryParameter($queryParameter, callable $callback = null)
{
if (empty($request->query->get($queryParameter))) {
if (empty($this->parameterBag->get($queryParameter))) {
return [];
}

$values = (array) $request->query->get($queryParameter);
$values = (array) $this->parameterBag->get($queryParameter);

if (!is_null($callback)) {
$values = array_map($callback, $values);
Expand All @@ -41,20 +47,18 @@ public function getArrayFromQueryParameter(Request $request, $queryParameter, ca
}

/**
* @param Request $request
* @param string $parameterName
* @param string|null $defaultValue
* @param callable $callback
* @return mixed|null
*/
public function getStringFromQueryParameter(
Request $request,
$parameterName,
$defaultValue = null,
callable $callback = null
) {
$parameterValue = $request->query->get($parameterName, null);
$defaultsEnabled = $this->areDefaultFiltersEnabled($request);
$parameterValue = $this->parameterBag->get($parameterName, null);
$defaultsEnabled = $this->areDefaultFiltersEnabled();
$callback = $this->ensureCallback($callback);

if ($parameterValue === $this->resetValue ||
Expand All @@ -70,15 +74,13 @@ public function getStringFromQueryParameter(
}

/**
* @param Request $request
* @param string $parameterName
* @param string|null $defaultValueAsString
* @param callable|null $callback
* @param string $delimiter
* @return array
*/
public function getDelimitedStringFromQueryParameter(
Request $request,
$parameterName,
$defaultValueAsString = null,
callable $callback = null,
Expand All @@ -87,7 +89,6 @@ public function getDelimitedStringFromQueryParameter(
$callback = $this->ensureCallback($callback);

$asString = $this->getStringFromQueryParameter(
$request,
$parameterName,
$defaultValueAsString
);
Expand All @@ -102,13 +103,11 @@ public function getDelimitedStringFromQueryParameter(
}

/**
* @param Request $request
* @param string $parameterName
* @param string|null $defaultValueAsString
* @return bool|null
*/
public function getBooleanFromQueryParameter(
Request $request,
$parameterName,
$defaultValueAsString = null
) {
Expand All @@ -118,16 +117,15 @@ public function getBooleanFromQueryParameter(
return $this->castMixedToBool($bool);
};

return $this->getStringFromQueryParameter($request, $parameterName, $defaultValueAsString, $callback);
return $this->getStringFromQueryParameter($parameterName, $defaultValueAsString, $callback);
}

/**
* @param Request $request
* @param string $queryParameter
* @param string|null $defaultValueAsString
* @return \DateTimeImmutable|null
*/
public function getDateTimeFromQueryParameter(Request $request, $queryParameter, $defaultValueAsString = null)
public function getDateTimeFromQueryParameter($queryParameter, $defaultValueAsString = null)
{
$callback = function ($asString) use ($queryParameter) {
$asDateTime = \DateTimeImmutable::createFromFormat(\DateTime::ATOM, $asString);
Expand All @@ -141,16 +139,15 @@ public function getDateTimeFromQueryParameter(Request $request, $queryParameter,
return $asDateTime;
};

return $this->getStringFromQueryParameter($request, $queryParameter, $defaultValueAsString, $callback);
return $this->getStringFromQueryParameter($queryParameter, $defaultValueAsString, $callback);
}

/**
* @param Request $request
* @return bool
*/
private function areDefaultFiltersEnabled(Request $request)
private function areDefaultFiltersEnabled()
{
$disabled = $this->castMixedToBool($request->query->get('disableDefaultFilters', false));
$disabled = $this->castMixedToBool($this->parameterBag->get('disableDefaultFilters', false));
return !$disabled;
}

Expand Down
2 changes: 1 addition & 1 deletion tests/OfferSearchControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ class OfferSearchControllerTest extends \PHPUnit_Framework_TestCase
public function setUp()
{
$this->queryBuilder = new ElasticSearchOfferQueryBuilder();
$this->requestParser = new CompositeOfferRequestParser(new ParameterBagParser());
$this->requestParser = new CompositeOfferRequestParser();
$this->searchService = $this->createMock(OfferSearchServiceInterface::class);

$this->regionIndexName = new StringLiteral('geoshapes');
Expand Down

0 comments on commit df79246

Please sign in to comment.