Completed
Pull Request — master (#68)
by
unknown
06:34
created

SalesforceClient::getUri()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 5
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 8
ccs 5
cts 5
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 5
nc 1
nop 2
crap 1
1
<?php
2
3
namespace Xsolve\SalesforceClient\Client;
4
5
use GuzzleHttp\Psr7\Request;
6
use Http\Client\Exception\HttpException;
7
use Http\Client\HttpClient;
8
use Psr\Http\Message\ResponseInterface;
9
use Xsolve\SalesforceClient\Generator\TokenGeneratorInterface;
10
use Xsolve\SalesforceClient\Request\RequestInterface;
11
use Xsolve\SalesforceClient\Security\Token\TokenInterface;
12
13
class SalesforceClient
14
{
15
    const UNAUTHORIZED = 401;
16
    const PREFIX = 'services/data/';
17
18
    /**
19
     * @var HttpClient
20
     */
21
    protected $client;
22
23
    /**
24
     * @var TokenGeneratorInterface
25
     */
26
    protected $tokenManager;
27
28
    /**
29
     * @var string
30
     */
31
    protected $version;
32
33 3
    public function __construct(
34
        HttpClient $client,
35
        TokenGeneratorInterface $tokenManager,
36
        string $version
37
    ) {
38 3
        $this->client = $client;
39 3
        $this->tokenManager = $tokenManager;
40 3
        $this->version = $version;
41 3
    }
42
43 3
    public function doRequest(RequestInterface $request): array
44
    {
45 3
        $token = $this->tokenManager->getToken();
46
47
        try {
48 3
            $response = $this->sendRequest($token, $request);
49 2
        } catch (HttpException $ex) {
50
            // Token is expired or invalid - get new and retry
51 2
            if ($ex->getCode() !== self::UNAUTHORIZED) {
52 1
                throw $ex;
53
            }
54
55 1
            $response = $this->sendRequest($this->tokenManager->regenerateToken($token), $request);
56
        }
57
58 2
        $responseBody = json_decode((string) $response->getBody(), true);
59
60 2
        return !$responseBody ? [] : $responseBody;
61
    }
62
63 3
    protected function sendRequest(TokenInterface $token, RequestInterface $request): ResponseInterface
64
    {
65 3
        return $this->client->sendRequest(new Request(
66 3
                $request->getMethod(),
67 3
                $this->getUri($token, $request),
68 3
                $this->getHeaders($token, $request),
69 3
                $request->getParams()
70
            )
71
        );
72
    }
73
74 3
    protected function getHeaders(TokenInterface $token, RequestInterface $request): array
75
    {
76
        return [
77 3
            'authorization' => sprintf('%s %s', $token->getTokenType(), $token->getAccessToken()),
78 3
            'Content-type' => $request->getMediaType(),
79
        ];
80
    }
81
82 3
    protected function getUri(TokenInterface $token, RequestInterface $request): string
83
    {
84 3
        return sprintf(
85 3
            '%s/%s',
86 3
            rtrim($token->getInstanceUrl(), '/'),
87 3
            sprintf('%s%s/%s', self::PREFIX, $this->version, ltrim($request->getEndpoint(), '/'))
88
        );
89
    }
90
}
91