Completed
Push — master ( 79dd3c...f666f7 )
by
unknown
10s
created

SalesforceClient::getHeaders()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 7
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 3
CRAP Score 1

Importance

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