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

Commit

Permalink
Merge e95dd89 into a18ac17
Browse files Browse the repository at this point in the history
  • Loading branch information
bertramakers committed May 4, 2017
2 parents a18ac17 + e95dd89 commit 94d5895
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 13 deletions.
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
],
"require": {
"cultuurnet/hydra": "~0.1",
"cultuurnet/udb3-search": "~0.1",
"cultuurnet/udb3-search": "dev-feature/III-1772 as 0.1",
"cultuurnet/geocoding": "~0.1",
"cultuurnet/valueobjects": "~3.0",
"symfony/http-foundation": "~2.7.2"
Expand Down
53 changes: 41 additions & 12 deletions src/OfferSearchController.php
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,16 @@ public function search(Request $request)
);
}

$dateFrom = $this->getDateTimeFromQuery($request, 'dateFrom');
if ($dateFrom) {
$parameters = $parameters->withDateFrom($dateFrom);
}

$dateTo = $this->getDateTimeFromQuery($request, 'dateTo');
if ($dateTo) {
$parameters = $parameters->withDateTo($dateTo);
}

$termIds = $this->getTermIdsFromQuery($request, 'termIds');
if (!empty($termIds)) {
$parameters = $parameters->withTermIds(...$termIds);
Expand Down Expand Up @@ -331,29 +341,48 @@ public function search(Request $request)
* @param string $queryParameter
* @return \DateTimeImmutable|null
*/
private function getAvailabilityFromQuery(Request $request, $queryParameter)
private function getDateTimeFromQuery(Request $request, $queryParameter)
{
$availability = $request->query->get($queryParameter, false);
$asMixed = $request->query->get($queryParameter, null);

if (!$availability) {
// Default value is the time the request was made.
return \DateTimeImmutable::createFromFormat('U', $request->server->get('REQUEST_TIME'));
}

if ($availability === self::QUERY_PARAMETER_RESET_VALUE) {
// Disable the filter instead of using a default or specific value.
if (is_null($asMixed)) {
return null;
}

$availabilityAsDateTime = \DateTimeImmutable::createFromFormat(\DateTime::ATOM, $availability);
$asString = (string) $asMixed;

$asDateTime = \DateTimeImmutable::createFromFormat(\DateTime::ATOM, $asString);

if (!$availabilityAsDateTime) {
if (!$asDateTime) {
throw new \InvalidArgumentException(
"{$queryParameter} should be an ISO-8601 datetime, for example 2017-04-26T12:20:05+01:00"
);
}

return $availabilityAsDateTime;
return $asDateTime;
}

/**
* @param Request $request
* @param $queryParameter
* @return \DateTimeImmutable|null
*/
private function getAvailabilityFromQuery(Request $request, $queryParameter)
{
// Ignore availability of a wildcard is given.
if ($request->query->get($queryParameter, false) === OfferSearchController::QUERY_PARAMETER_RESET_VALUE) {
return null;
}

// Parse availability as a datetime.
$availability = $this->getDateTimeFromQuery($request, $queryParameter);

// If no availability was found use the request time as the default.
if (is_null($availability)) {
return \DateTimeImmutable::createFromFormat('U', $request->server->get('REQUEST_TIME'));
}

return $availability;
}

/**
Expand Down
45 changes: 45 additions & 0 deletions tests/OfferSearchControllerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ public function it_returns_a_paged_collection_of_search_results_based_on_request
'organizerLabels' => ['ipsum'],
'textLanguages' => ['nl', 'en'],
'languages' => ['nl', 'en', 'fr'],
'dateFrom' => '2017-05-01T00:00:00+01:00',
'dateTo' => '2017-05-01T23:59:59+01:00',
'termIds' => ['1.45.678.95', 'azYBznHY'],
'termLabels' => ['Jeugdhuis', 'Cultureel centrum'],
'locationTermIds' => ['1234', '5678'],
Expand Down Expand Up @@ -187,6 +189,12 @@ public function it_returns_a_paged_collection_of_search_results_based_on_request
new Language('en'),
new Language('fr')
)
->withDateFrom(
\DateTimeImmutable::createFromFormat(\DateTime::ATOM, '2017-05-01T00:00:00+01:00')
)
->withDateTo(
\DateTimeImmutable::createFromFormat(\DateTime::ATOM, '2017-05-01T23:59:59+01:00')
)
->withTermIds(
new TermId('1.45.678.95'),
new TermId('azYBznHY')
Expand Down Expand Up @@ -627,4 +635,41 @@ public function it_transforms_the_request_address_country_to_uppercase()

$this->controller->search($request);
}

/**
* @test
* @dataProvider malformedDateTimeProvider
*
* @param string $malformedDateTimeAsString
*/
public function it_throws_an_exception_for_a_malformed_date_from(
$malformedDateTimeAsString
) {
$request = new Request(['dateFrom' => $malformedDateTimeAsString]);
$this->expectException(\InvalidArgumentException::class);
$this->expectExceptionMessage('dateFrom should be an ISO-8601 datetime, for example 2017-04-26T12:20:05+01:00');
$this->controller->search($request);
}

/**
* @return array
*/
public function malformedDateTimeProvider()
{
return [
['2017'],
['2017-01'],
['2017-01-01'],
['2017-01-01T'],
['2017-01-01T23'],
['2017-01-01T23:59'],
['2017-01-01T23:59:59'],
[false],
[true],
[0],
[1],
['now'],
['1493726880'],
];
}
}

0 comments on commit 94d5895

Please sign in to comment.