UserApiSF::getXml()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 22
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
cc 1
eloc 16
c 3
b 0
f 0
nc 1
nop 1
dl 0
loc 22
rs 9.7333
1
<?php
2
3
namespace SalesforceBulkApi\api;
4
5
use SalesforceBulkApi\conf\LoginParams;
6
use SalesforceBulkApi\dto\LoginResponseDto;
7
use SalesforceBulkApi\exceptions\ApiRequestException;
8
use SalesforceBulkApi\exceptions\ApiResponseException;
9
use SalesforceBulkApi\exceptions\HttpClientException;
10
use SalesforceBulkApi\exceptions\SFClientException;
11
use SalesforceBulkApi\services\ApiSalesforce;
12
use GuzzleHttp\Psr7\Request;
13
14
class UserApiSF
15
{
16
    /**
17
     * @var string
18
     */
19
    public static $endpoint = 'https://%s.salesforce.com/services/Soap/%s/%s';
20
21
    /**
22
     * @param ApiSalesforce $api
23
     *
24
     * @return LoginResponseDto
25
     * @throws \Exception
26
     */
27
    public static function login(ApiSalesforce $api)
28
    {
29
        $asWho          = $api->getLoginParams()->amIPartner() ? 'u' : 'c';
30
        $version        = $api->getLoginParams()->getApiVersion();
31
        $endpointPrefix = $api->getLoginParams()->getEndpointPrefix();
32
33
        $request = new Request(
34
            'POST',
35
            sprintf(self::$endpoint, $endpointPrefix, $asWho, $version),
36
            [
37
                'Content-Type' => 'text/xml; charset=UTF8',
38
                'SOAPAction'   => 'login'
39
            ],
40
            self::getXml($api->getLoginParams())
41
        );
42
        try {
43
            $response = $api->send($request);
44
        } catch (\Exception $e) {
45
            throw new HttpClientException($e->getMessage());
46
        }
47
48
        if ($response->getStatusCode() != 200 && $response->getStatusCode() !== 500) {
49
            $error =
50
                'API error: Status = ' . $response->getStatusCode() . ' ; ReasonPhrase = '
51
                . $response->getReasonPhrase() . ' ; Body = ' . $response->getBody()->getContents();
52
            $api->addError($error);
53
            throw new ApiResponseException($error);
54
        }
55
56
        $dom = new \DOMDocument;
57
        $dom->loadXML($response->getBody());
58
        if ($response->getStatusCode() == 500) {
59
            $fail = $dom->getElementsByTagName('faultstring');
60
            if ($fail->length == 0) {
61
                throw new SFClientException(
62
                    'SF Api waiting behavior changed. Error: incorrect response = ' . $response->getBody()->getContents(
63
                    )
64
                );
65
            }
66
            $error = 'API error: ' . $fail[0]->nodeValue;
67
            $api->addError($error);
68
            throw new ApiRequestException($error);
69
        }
70
71
        return new LoginResponseDto($dom);
72
    }
73
74
    /**
75
     * @param LoginParams $params
76
     *
77
     * @return string
78
     */
79
    private static function getXml(LoginParams $params)
80
    {
81
        /** @noinspection XmlUnusedNamespaceDeclaration */
82
        $xml = <<<XML
83
<?xml version="1.0" encoding="utf-8" ?>
84
<env:Envelope xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:env="http://schemas.xmlsoap.org/soap/envelope/">
85
  <env:Body>
86
    <n1:login xmlns:n1="urn:partner.soap.sforce.com">
87
      <n1:username>%s</n1:username>
88
      <n1:password>%s</n1:password>
89
    </n1:login>
90
  </env:Body>
91
</env:Envelope>
92
XML;
93
94
        $login = $params->getUserName();
95
        $pass  = $params->getUserPass() . $params->getUserSecretToken();
96
97
        $login = htmlspecialchars($login, ENT_QUOTES, 'UTF-8');
98
        $pass = htmlspecialchars($pass, ENT_QUOTES, 'UTF-8');
99
100
        return sprintf($xml, $login, $pass);
101
    }
102
}
103