thomas-kl1/php-sdk-zoho-desk

View on GitHub
src/Client/Request.php

Summary

Maintainability
A
35 mins
Test Coverage
<?php
/**
 * Copyright © Thomas Klein, All rights reserved.
 * See LICENSE bundled with this library for license details.
 */
declare(strict_types=1);

namespace Zoho\Desk\Client;

use Zoho\Desk\Exception\InvalidRequestException;
use function curl_errno;
use function curl_error;
use function curl_exec;
use function curl_getinfo;
use function is_array;
use function json_decode;
use function mb_substr;
use function rtrim;
use const CURLINFO_HEADER_SIZE;
use const CURLINFO_HTTP_CODE;

final class Request implements RequestInterface
{
    /**
     * @var resource
     */
    private $curlResource;

    public function __construct($curlResource)
    {
        $this->curlResource = $curlResource;
    }

    public function execute(): ResponseInterface
    {
        $response = curl_exec($this->curlResource);

        if ($response === false) {
            throw InvalidRequestException::createRequestErrorException(
                curl_error($this->curlResource),
                curl_errno($this->curlResource)
            );
        }

        $responseInfo = curl_getinfo($this->curlResource);
        $responseCode = curl_getinfo($this->curlResource, CURLINFO_HTTP_CODE);
        $headerSize = curl_getinfo($this->curlResource, CURLINFO_HEADER_SIZE);
        $body = json_decode(mb_substr($response, $headerSize), true) ?: [];
        curl_close($this->curlResource);

        if (!$responseInfo || $responseCode >= 400) {
            throw new InvalidRequestException($this->buildErrorMessage($body));
        }

        return new Response($body, $responseInfo);
    }

    private function buildErrorMessage(array $body): string
    {
        $message = 'An error occurred on the API gateway.';

        if (isset($body['message'])) {
            $message = $body['message'];

            if (isset($body['errors']) && is_array($body['errors'])) {
                $message .= ': ';
                foreach ($body['errors'] as $error) {
                    $message .= $error['fieldName'] . ' is ' . $error['errorType'] . ', ';
                }
                $message = rtrim($message, ', ') . '.';
            }
        }

        return $message;
    }
}