* @author Sebastian Ertner * @license https://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0) * @link https://www.temando.com/ */ class OrderAdapter implements OrderApiInterface { /** * @var string */ private $endpoint; /** * @var string */ private $accountId; /** * @var string */ private $bearerToken; /** * @var RequestHeadersInterface */ private $requestHeaders; /** * @var AuthenticationInterface */ private $auth; /** * @var RestClientInterface */ private $restClient; /** * @var ParserInterface */ private $responseParser; /** * @var LoggerInterface */ private $logger; /** * OrderAdapter constructor. * @param WsConfigInterface $config * @param RequestHeadersInterface $requestHeaders * @param AuthenticationInterface $auth * @param RestClientInterface $restClient * @param ParserInterface $responseParser * @param LoggerInterface $logger */ public function __construct( WsConfigInterface $config, RequestHeadersInterface $requestHeaders, AuthenticationInterface $auth, RestClientInterface $restClient, ParserInterface $responseParser, LoggerInterface $logger ) { $this->endpoint = $config->getApiEndpoint(); $this->accountId = $config->getAccountId(); $this->bearerToken = $config->getBearerToken(); $this->requestHeaders = $requestHeaders; $this->auth = $auth; $this->restClient = $restClient; $this->responseParser = $responseParser; $this->logger = $logger; } /** * Create order. * * @param OrderRequest $request * @return SaveOrderInterface * @throws AdapterException */ public function createOrder(OrderRequest $request) { $requestParams = $request->getRequestParams(); $uri = sprintf('%s/orders?%s', $this->endpoint, http_build_query($requestParams)); $requestBody = $request->getRequestBody(); $this->logger->log(LogLevel::DEBUG, sprintf("%s\n%s", $uri, $requestBody)); try { $this->auth->connect($this->accountId, $this->bearerToken); $headers = $this->requestHeaders->getHeaders(); $rawResponse = $this->restClient->post($uri, $requestBody, $headers); $this->logger->log(LogLevel::DEBUG, $rawResponse); /** @var SaveOrder $response */ $response = $this->responseParser->parse($rawResponse, SaveOrder::class); } catch (RestClientErrorException $e) { $this->logger->log(LogLevel::ERROR, $e->getMessage()); /** @var Errors $response */ $response = $this->responseParser->parse($e->getMessage(), Errors::class); throw AdapterException::errorResponse($response, $e); } catch (\Exception $e) { throw AdapterException::create($e); } return $response; } /** * Update order. * * @param OrderRequest $request * @return SaveOrderInterface * @throws AdapterException */ public function updateOrder(OrderRequest $request) { $uri = sprintf('%s/orders/%s', $this->endpoint, ...$request->getPathParams()); $requestBody = $request->getRequestBody(); $this->logger->log(LogLevel::DEBUG, sprintf("%s\n%s", $uri, $requestBody)); try { $this->auth->connect($this->accountId, $this->bearerToken); $headers = $this->requestHeaders->getHeaders(); $rawResponse = $this->restClient->put($uri, $requestBody, $headers); $this->logger->log(LogLevel::DEBUG, $rawResponse); /** @var SaveOrder $response */ $response = $this->responseParser->parse($rawResponse, SaveOrder::class); } catch (RestClientErrorException $e) { $this->logger->log(LogLevel::ERROR, $e->getMessage()); /** @var Errors $response */ $response = $this->responseParser->parse($e->getMessage(), Errors::class); throw AdapterException::errorResponse($response, $e); } catch (\Exception $e) { throw AdapterException::create($e); } return $response; } }