Client.php 1.5 KB
<?php

namespace Lackoxygen\MinPayment\Utils;

use GuzzleHttp\Exception\ConnectException;
use GuzzleHttp\Exception\GuzzleException;
use Lackoxygen\MinPayment\Exception\Exception;
use Lackoxygen\MinPayment\Request\Request;
use Lackoxygen\MinPayment\Response;

class Client
{
    /**
     * @var Request $request
     */
    protected $request;

    /**
     * @var array $config
     */
    protected $config = [];

    /**
     * @param array $config
     */
    public function __construct(array $config)
    {
        $this->config = $config;
    }

    /**
     * @param Request $request
     *
     * @return Response
     * @throws Exception
     */
    public function __invoke(Request $request)
    {
        $this->request = $request;

        $body = $request($this->config);

        return $this->send($body);
    }

    /**
     * @param array $body
     *
     * @return Response
     * @throws Exception
     */
    protected function send(array $body)
    {
        $client  = new \GuzzleHttp\Client(\Arr::get($this->config, 'options.client'));
        $retries = (int)\Arr::get($this->config, 'retry');

        $retry = 0;

        do {
            try {
                $response = $client->request($this->request->getMethod(), $this->request->getPath(), [
                    $this->request->getOption() => $body
                ]);

                return new Response($response);
            } catch (GuzzleException $e) {
                throw new Exception($e);
            }
        } while ($retry++ < $retries);
    }
}