linkmobility-php-client/src/Client.php

162 lines
4.3 KiB
PHP
Raw Normal View History

2022-06-20 14:47:33 +02:00
<?php
/**
* This Software is the property of Data Development and is protected
* by copyright law - it is NOT Freeware.
* Any unauthorized use of this software without a valid license
* is a violation of the license agreement and will be prosecuted by
* civil and criminal law.
* http://www.shopmodule.com
*
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
* @author D3 Data Development - Daniel Seifert <support@shopmodule.com>
* @link http://www.oxidmodule.com
*/
2022-06-24 16:00:56 +02:00
declare( strict_types = 1 );
2022-06-20 14:47:33 +02:00
namespace D3\LinkmobilityClient;
use D3\LinkmobilityClient\Exceptions\ApiException;
2022-06-24 16:00:56 +02:00
use D3\LinkmobilityClient\Exceptions\ExceptionMessages;
2022-06-20 14:47:33 +02:00
use D3\LinkmobilityClient\Request\RequestInterface;
2022-07-04 13:31:12 +02:00
use D3\LinkmobilityClient\ValueObject\ValueObject;
2022-06-24 16:00:56 +02:00
use GuzzleHttp\Exception\GuzzleException;
use InvalidArgumentException;
2022-07-04 13:31:12 +02:00
use phpDocumentor\Reflection\Types\Mixed_;
use Psr\Http\Message\ResponseInterface;
use Psr\Log\LoggerInterface;
2022-06-24 16:00:56 +02:00
use RuntimeException;
2022-06-20 14:47:33 +02:00
class Client
{
private $accessToken;
public $apiUrl;
public $requestClient;
private $logger;
2022-07-04 13:31:12 +02:00
private $configuration = [];
2022-06-20 14:47:33 +02:00
public function __construct(string $accessToken, $apiUrl = false, $client = false)
{
if ($apiUrl !== false && false === $apiUrl instanceof UrlInterface) {
2022-06-24 16:00:56 +02:00
throw new RuntimeException(ExceptionMessages::WRONG_APIURL_INTERFACE);
2022-06-20 14:47:33 +02:00
}
$this->accessToken = $accessToken;
$this->apiUrl = $apiUrl ?: new Url();
$this->requestClient = $client ?: new \GuzzleHttp\Client( [ 'base_uri' => $this->apiUrl->getBaseUri() ] );
}
2022-06-24 16:00:56 +02:00
/**
* @param RequestInterface $request
*
* @return Response\ResponseInterface
* @throws ApiException
* @throws GuzzleException
* @throws InvalidArgumentException
2022-06-24 16:00:56 +02:00
*/
public function request(RequestInterface $request) : Response\ResponseInterface
2022-06-20 14:47:33 +02:00
{
$request->validate();
2022-06-20 14:47:33 +02:00
return $request->getResponseInstance(
$this->rawRequest($request->getUri(), $request->getMethod(), $request->getOptions())
);
}
/**
* @param $url
* @param string $method
2022-06-24 16:00:56 +02:00
* @param array $options
2022-06-20 14:47:33 +02:00
*
* @return ResponseInterface
2022-06-20 14:47:33 +02:00
* @throws ApiException
* @throws GuzzleException
*/
protected function rawRequest( $url, string $method = RequestInterface::METHOD_GET, array $options = []): ResponseInterface
2022-06-20 14:47:33 +02:00
{
$options['headers']['Authorization'] = 'Bearer '.$this->accessToken;
if ($this->hasLogger()) $this->getLogger()->debug('request '.$url, $options);
2022-06-20 14:47:33 +02:00
$response = $this->requestClient->request(
$method,
$url,
$options
);
if ($response->getStatusCode() != 200) {
$message = sprintf(ExceptionMessages::NOK_REQUEST_RETURN, [$url, $response->getStatusCode()]);
if ($this->hasLogger()) $this->getLogger()->error($message);
throw new ApiException($message);
}
if ($this->hasLogger()) {
$response->getBody()->rewind();
$this->getLogger()->debug('response', [$response->getBody()->getContents()]);
2022-06-20 14:47:33 +02:00
}
return $response;
}
/**
* @param mixed $logger
*
* @return Client
*/
public function setLogger(LoggerInterface $logger ) : Client
{
$this->logger = $logger;
return $this;
}
/**
* @return bool
*/
public function hasLogger() : bool
{
return $this->logger instanceof LoggerInterface;
}
/**
* @return LoggerInterface
*/
public function getLogger(): LoggerInterface
{
return $this->logger;
}
2022-07-04 13:31:12 +02:00
/**
* @param string $name
* @param $configuration
*
* @return $this
*/
public function setConfiguration( string $name, $configuration ): Client
{
$this->configuration[$name] = oxNew(ValueObject::class, $configuration);
return $this;
}
public function hasConfiguration(string $name)
{
return isset($this->configuration[$name]);
}
/**
* @param string $name
*
* @return mixed
*/
public function getConfiguration(string $name)
{
if (false === isset($this->configuration)) {
throw new InvalidArgumentException('configuration '.$name.' is not set');
}
return $this->configuration[$name];
}
2022-06-20 14:47:33 +02:00
}