%PDF- %PDF-
| Direktori : /home/graphicd/public_html/vebto/vendor/meilisearch/meilisearch-php/src/Http/ |
| Current File : /home/graphicd/public_html/vebto/vendor/meilisearch/meilisearch-php/src/Http/Client.php |
<?php
declare(strict_types=1);
namespace MeiliSearch\Http;
use Http\Discovery\Psr17FactoryDiscovery;
use Http\Discovery\Psr18ClientDiscovery;
use MeiliSearch\Contracts\Http;
use MeiliSearch\Exceptions\ApiException;
use MeiliSearch\Exceptions\CommunicationException;
use MeiliSearch\Exceptions\FailedJsonEncodingException;
use Psr\Http\Client\ClientExceptionInterface;
use Psr\Http\Client\ClientInterface;
use Psr\Http\Client\NetworkExceptionInterface;
use Psr\Http\Message\RequestFactoryInterface;
use Psr\Http\Message\RequestInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\StreamFactoryInterface;
class Client implements Http
{
/**
* @var Http
*/
private $http;
/**
* @var RequestFactoryInterface
*/
private $requestFactory;
/**
* @var StreamFactoryInterface
*/
private $streamFactory;
/**
* @var array
*/
private $headers;
/**
* @var string
*/
private $apiKey;
private $baseUrl;
/**
* Client constructor.
*
* @param string $apiKey
*/
public function __construct(string $url, string $apiKey = null, ClientInterface $httpClient = null)
{
$this->baseUrl = $url;
$this->apiKey = $apiKey;
$this->http = $httpClient ?? Psr18ClientDiscovery::find();
$this->requestFactory = Psr17FactoryDiscovery::findRequestFactory();
$this->streamFactory = Psr17FactoryDiscovery::findStreamFactory();
$this->headers = array_filter([
'Content-type' => 'application/json',
'X-Meili-API-Key' => $this->apiKey,
]);
}
/**
* @param array $query
*
* @return mixed
*
* @throws ClientExceptionInterface
* @throws ApiException
* @throws CommunicationException
*/
public function get($path, $query = [])
{
$request = $this->requestFactory->createRequest(
'GET',
$this->baseUrl.$path.$this->buildQueryString($query)
);
return $this->execute($request);
}
/**
* @param mixed|null $body
*
* @return mixed
*
* @throws ApiException
* @throws ClientExceptionInterface
* @throws CommunicationException
* @throws FailedJsonEncodingException
*/
public function post(string $path, $body = null, array $query = [])
{
$content = json_encode($body);
if (false === $content) {
throw new FailedJsonEncodingException('Encoding payload to json failed. '.json_last_error_msg());
}
$request = $this->requestFactory->createRequest(
'POST',
$this->baseUrl.$path.$this->buildQueryString($query)
)->withBody($this->streamFactory->createStream($content));
return $this->execute($request);
}
public function put($path, $body = null, $query = [])
{
$request = $this->requestFactory->createRequest(
'PUT',
$this->baseUrl.$path.$this->buildQueryString($query)
)->withBody($this->streamFactory->createStream(json_encode($body)));
return $this->execute($request);
}
/**
* @param string $path
* @param null $body
* @param array $query
*
* @return mixed
*
* @throws ClientExceptionInterface
* @throws ApiException
*/
public function patch($path, $body = null, $query = [])
{
$request = $this->requestFactory->createRequest(
'PATCH',
$this->baseUrl.$path.$this->buildQueryString($query)
)->withBody($this->streamFactory->createStream(json_encode($body)));
return $this->execute($request);
}
/**
* @param $path
* @param array $query
*
* @return mixed
*
* @throws ClientExceptionInterface
* @throws ApiException
*/
public function delete($path, $query = [])
{
$request = $this->requestFactory->createRequest(
'DELETE',
$this->baseUrl.$path.$this->buildQueryString($query)
);
return $this->execute($request);
}
/**
* @return mixed
*
* @throws ApiException
* @throws ClientExceptionInterface
* @throws CommunicationException
* @throws ApiException
*/
private function execute(RequestInterface $request)
{
foreach ($this->headers as $header => $value) {
$request = $request->withAddedHeader($header, $value);
}
try {
return $this->parseResponse($this->http->sendRequest($request));
} catch (NetworkExceptionInterface $e) {
throw new CommunicationException($e->getMessage(), $e->getCode(), $e);
}
}
private function buildQueryString(array $queryParams = []): string
{
return \count($queryParams) > 0 ? '?'.http_build_query($queryParams) : '';
}
/**
* @return mixed
*
* @throws ApiException
*/
private function parseResponse(ResponseInterface $response)
{
if ($response->getStatusCode() >= 300) {
$body = json_decode($response->getBody()->getContents(), true) ?? $response->getReasonPhrase();
throw new ApiException($response, $body);
}
return json_decode($response->getBody()->getContents(), true);
}
}