This repository has been archived by the owner on Aug 13, 2019. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
III-2092 Merge branch 'master' into feature/III-2092
* master: (22 commits) III-2081: Revert udb3-search dependency after merge III-2081: Rename OfferSearchParameters::withRegion() to withRegions() III-2081: Grab multiple region ids from search parameters III-2095 Update the cultuurnet/hydra dependency. III-2095 Use the settle method in combinatie with wait to execute the promises. III-2095 Remove unused variable. III-2095 Remove obsolete use statements. Revert dependencies after merge of III-2091 III-2091 Rename CreatedBy to Creator to match JSON-LD naming. III-2091 Extract createdBy parameter from query parameters. III-2095: Add a paged collection factory that embeds json-ld based on @id III-2095: Remove conditional embed parameter from controller and factories III-2095: Update cultuurnet/hydra dependency III-2091 Update the cultuurnet/udb3-search dependency. III-2065 Update the cultuurnet/udb3-search dependency. Revert udb3-search dependency after merge of III-2073 III-2073: Improve readability for toggle parameters III-2073: Improve the parsing of query parameters as boolean values III-2073 Extract uitpas toggle from query parameters. III-2073 Update the cultuurnet/udb3-search dependency. ...
- Loading branch information
Showing
10 changed files
with
677 additions
and
282 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,145 @@ | ||
<?php | ||
|
||
namespace CultuurNet\UDB3\Search\Http; | ||
|
||
use CultuurNet\Hydra\PagedCollection; | ||
use CultuurNet\UDB3\Search\PagedResultSet; | ||
use GuzzleHttp\ClientInterface; | ||
use GuzzleHttp\Exception\ClientException; | ||
use GuzzleHttp\Promise\Promise; | ||
use GuzzleHttp\Promise\PromiseInterface; | ||
use Psr\Http\Message\ResponseInterface; | ||
use Psr\Log\LoggerInterface; | ||
|
||
class JsonLdEmbeddingPagedCollectionFactory implements PagedCollectionFactoryInterface | ||
{ | ||
/** | ||
* @var PagedCollectionFactoryInterface | ||
*/ | ||
private $pagedCollectionFactory; | ||
|
||
/** | ||
* @var ClientInterface | ||
*/ | ||
private $httpClient; | ||
|
||
/** | ||
* @var LoggerInterface | ||
*/ | ||
private $logger; | ||
|
||
/** | ||
* @param PagedCollectionFactoryInterface $pagedCollectionFactory | ||
* @param ClientInterface $httpClient | ||
* @param LoggerInterface $logger | ||
*/ | ||
public function __construct( | ||
PagedCollectionFactoryInterface $pagedCollectionFactory, | ||
ClientInterface $httpClient, | ||
LoggerInterface $logger | ||
) { | ||
$this->pagedCollectionFactory = $pagedCollectionFactory; | ||
$this->httpClient = $httpClient; | ||
$this->logger = $logger; | ||
} | ||
|
||
/** | ||
* @param PagedResultSet $pagedResultSet | ||
* @param int $start | ||
* @param int $limit | ||
* @return PagedCollection | ||
*/ | ||
public function fromPagedResultSet( | ||
PagedResultSet $pagedResultSet, | ||
$start, | ||
$limit | ||
) { | ||
$pagedCollection = $this->pagedCollectionFactory->fromPagedResultSet($pagedResultSet, $start, $limit); | ||
$members = $pagedCollection->getMembers(); | ||
|
||
$promises = $this->getJsonLdRequestPromises($members); | ||
|
||
$jsonLdBodies = []; | ||
|
||
$results = \GuzzleHttp\Promise\settle($promises)->wait(); | ||
|
||
foreach ($results as $key => $result) { | ||
switch ($result['state']) { | ||
case Promise::FULFILLED: | ||
/** @var ResponseInterface $response */ | ||
$response = $result['value']; | ||
$jsonLdBodies[] = json_decode($response->getBody()); | ||
break; | ||
|
||
default: | ||
$this->logClientException($result['reason']); | ||
break; | ||
} | ||
} | ||
|
||
$merged = $this->mergeResults($members, $jsonLdBodies); | ||
|
||
return $pagedCollection->withMembers($merged); | ||
} | ||
|
||
/** | ||
* @param \stdClass[] $members | ||
* @return PromiseInterface[] | ||
*/ | ||
private function getJsonLdRequestPromises(array $members) | ||
{ | ||
$promises = []; | ||
|
||
foreach ($members as $body) { | ||
if (isset($body->{'@id'})) { | ||
$promises[$body->{'@id'}] = $this->httpClient->requestAsync( | ||
'GET', | ||
$body->{'@id'} | ||
); | ||
} | ||
} | ||
|
||
return $promises; | ||
} | ||
|
||
/** | ||
* @param array $originalResults | ||
* @param array $jsonLdResults | ||
* @return array | ||
*/ | ||
private function mergeResults(array $originalResults, array $jsonLdResults) | ||
{ | ||
$mergedResults = $originalResults; | ||
|
||
foreach ($jsonLdResults as $jsonLd) { | ||
if (!isset($jsonLd->{'@id'})) { | ||
continue; | ||
} | ||
|
||
$mergedResults = array_map( | ||
function ($result) use ($jsonLd) { | ||
if (isset($result->{'@id'}) && $result->{'@id'} == $jsonLd->{'@id'}) { | ||
return $jsonLd; | ||
} else { | ||
return $result; | ||
} | ||
}, | ||
$mergedResults | ||
); | ||
} | ||
|
||
return $mergedResults; | ||
} | ||
|
||
/** | ||
* @param ClientException $exception | ||
*/ | ||
private function logClientException(ClientException $exception) | ||
{ | ||
$url = (string) $exception->getRequest()->getUri(); | ||
$code = (string) $exception->getResponse()->getStatusCode(); | ||
$message = "Could not embed document from url {$url}, received error code {$code}."; | ||
|
||
$this->logger->error($message); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.