Completed
Pull Request — master (#325)
by
unknown
22:33
created

Sapi3SearchService::search()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 29
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 29
rs 8.8571
c 0
b 0
f 0
cc 1
eloc 19
nc 1
nop 4
1
<?php
2
3
namespace CultuurNet\UDB3\Search;
4
5
use CultuurNet\UDB3\Offer\IriOfferIdentifierFactoryInterface;
6
use CultuurNet\UDB3\Offer\OfferIdentifierCollection;
7
use Guzzle\Http\QueryString;
8
use GuzzleHttp\Psr7\Request;
9
use Http\Client\HttpClient;
10
use League\Uri\Components\Query;
11
use Psr\Http\Message\UriInterface;
12
use ValueObjects\Number\Integer;
13
use ValueObjects\Web\Url;
14
15
class Sapi3SearchService implements SearchServiceInterface
16
{
17
    /**
18
     * @var UriInterface
19
     */
20
    private $searchLocation;
21
22
    /**
23
     * @var HttpClient
24
     */
25
    private $httpClient;
26
27
    /**
28
     * @var IriOfferIdentifierFactoryInterface
29
     */
30
    private $offerIdentifier;
31
32
    /**
33
     * @param UriInterface $searchLocation
34
     * @param HttpClient $httpClient
35
     */
36
    public function __construct(
37
        UriInterface $searchLocation,
38
        HttpClient $httpClient,
39
        IriOfferIdentifierFactoryInterface $offerIdentifier
40
    ) {
41
        $this->searchLocation = $searchLocation;
42
        $this->httpClient = $httpClient;
43
        $this->offerIdentifier = $offerIdentifier;
44
    }
45
46
    public function search($query, $limit = 30, $start = 0, $sort = null)
47
    {
48
        $queryParameters = Query::createFromPairs([
49
           'q' => $query,
50
           'start' => (string) $start,
51
           'limit' => (string) $limit,
52
        ]);
53
        $queryString = str_replace('+', '%2B', (string) $queryParameters);
54
        $offerQueryUri = $this->searchLocation->withQuery($queryString);
55
56
        $offerRequest = new Request('GET', $offerQueryUri);
57
58
        $searchResponseData = json_decode($this->httpClient
59
            ->sendRequest($offerRequest)
60
            ->getBody()
61
            ->getContents());
62
63
        $offerIds = array_reduce(
64
            $searchResponseData->{'member'},
65
            function (OfferIdentifierCollection $offerIds, $item) {
66
                return $offerIds->with(
67
                    $this->offerIdentifier->fromIri(Url::fromNative($item->{'@id'}))
68
                );
69
            },
70
            new OfferIdentifierCollection()
71
        );
72
73
        return new Results($offerIds, new Integer($searchResponseData->{'totalItems'}));
74
    }
75
}
76