Passed
Branch master (6e6484)
by Petr
06:04
created

Request   A

Complexity

Total Complexity 12

Size/Duplication

Total Lines 194
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 12
lcom 1
cbo 1
dl 0
loc 194
ccs 42
cts 42
cp 1
rs 10
c 0
b 0
f 0

10 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A buildBasePayload() 0 18 1
A createCallPayload() 0 13 2
A buildXMLBody() 0 15 2
A buildRequest() 0 5 1
A isSessionRequiredForMethod() 0 5 1
A sxmlAppend() 0 5 1
A addSessionIdToRequest() 0 5 1
A setSessionId() 0 4 1
A hasSession() 0 4 1
1
<?php
2
3
namespace P2A\YourMembership\Core;
4
5
use GuzzleHttp\Psr7\Request as GuzzleRequest;
6
7
8
class Request
9
{
10
11
    /**
12
     * Base URL
13
     * @var string
14
     */
15
    const BASE_URL = 'https://api.yourmembership.com';
16
    const API_VERSION = '2.25';
17
18
    /**
19
     * Session ID use for YourMembership API
20
     * @var string
21
     */
22
    private static $sessionId = null;
23
    /**
24
     * Call Counter for Your Membership for a given session
25
     * @var integer
26
     */
27
    public static $callId = 0;
28
    /**
29
     * API Key Used for YourMembership API
30
     * @var string
31
     */
32
    private $apiKey;
33
    /**
34
     * Sa Passcode is a supplementary API key used for YourMembership API
35
     * @var string
36
     */
37
    private $saPasscode;
38
39
40 5
    public function __construct(string $apiKey, string $saPasscode)
41
    {
42 5
        $this->apiKey = $apiKey;
43 5
        $this->saPasscode = $saPasscode;
44 5
    }
45
46
    /**
47
     * Create the Base Envelope for an API call to YourMembership
48
     * @method buildBasePayload
49
     * @author PA
50
     * @date   2017-01-09
51
     * @return \SimpleXMLElement  XML Envelope with necessary credential parameters
52
     */
53 4
    public function buildBasePayload() : \SimpleXMLElement
54
    {
55
        /*
56
            <YourMembership>
57
            <Version>2.25</Version>
58
            <ApiKey>3D638C5F-CCE2-4638-A2C1-355FA7BBC917</ApiKey>
59
            <CallID>001</CallID>
60
            <SaPasscode>************</SaPasscode>
61
            </YourMembership>
62
        */
63 4
        $xml = new \SimpleXMLElement('<YourMembership></YourMembership>');
64 4
        $xml->addChild('Version', self::API_VERSION);
65 4
        $xml->addChild('ApiKey', $this->apiKey);
66 4
        $xml->addChild('CallID', self::$callId);
67 4
        $xml->addChild('SaPasscode', $this->saPasscode);
68
69 4
        return $xml;
70
    }
71
72
    /**
73
     * Generates the XML for a API method call within
74
     * @method createCallPayload
75
     * @author PA
76
     * @date   2017-01-09
77
     * @param  string            $method    YourMembership API Function Name
78
     * @param  array             $arguments Array of Arguments to be passed as part of the YourMembership "Call"
79
     * @return \SimpleXMLElement
80
     */
81 4
    public function createCallPayload(string $method, array $arguments) : \SimpleXMLElement
82
    {
83
        //Create Call Node
84 4
        $call = new \SimpleXMLElement('<Call> </Call>');
85 4
        $call->addAttribute('Method', $method);
86
87
        //Add Arguments to the Call Node
88 4
        foreach ($arguments as $key => $value) {
89 3
            $call->addChild($key, $value);
90
        }
91
92 4
        return $call;
93
    }
94
95
    /**
96
     * Builds The XML Request Body for the Your Membership API Call
97
     * @method buildXMLBody
98
     * @author PA
99
     * @date   2017-01-10
100
     * @param  string            $method    Your Membership API Function Name
101
     * @param  array             $arguments Your Membership Arguments
102
     * @return \SimpleXMLElement
103
     */
104 3
    public function buildXMLBody(string $method, array $arguments) : \SimpleXMLElement
105
    {
106 3
        $xml = $this->buildBasePayload(); // Common Envelope
107
108 3
        if ($this->isSessionRequiredForMethod($method)) {
109 3
            $xml = $this->addSessionIdToRequest($xml);
110
        }
111
112 3
        $callPayload = $this->createCallPayload($method, $arguments); // Specific API Call Envelope
113
114
        // Put Api call into common envelope
115 3
        $this->sxmlAppend($xml, $callPayload);
116
117 3
        return $xml;
118
    }
119
    /**
120
     * Builds a Guzzle Request Object
121
     * @method buildRequest
122
     * @author PA
123
     * @date   2017-01-11
124
     * @param  string        $method    YourMembership API Method
125
     * @param  array         $arguments YourMembership API Method Call Arguments
126
     * @return \GuzzleHttp\Psr7\Request            Guzzle Request Object
127
     */
128 2
    public function buildRequest(string $method, array $arguments) : \GuzzleHttp\Psr7\Request
129
    {
130 2
        $requestBody = $this->buildXMLBody($method, $arguments)->asXML();
131 2
        return new GuzzleRequest('POST', self::BASE_URL, ['Content-Type' => 'application/x-www-form-urlencoded; charset=UTF8'], $requestBody);
1 ignored issue
show
Security Bug introduced by
It seems like $requestBody defined by $this->buildXMLBody($method, $arguments)->asXML() on line 130 can also be of type false; however, GuzzleHttp\Psr7\Request::__construct() does only seem to accept string|null|resource|obj...essage\StreamInterface>, did you maybe forget to handle an error condition?

This check looks for type mismatches where the missing type is false. This is usually indicative of an error condtion.

Consider the follow example

<?php

function getDate($date)
{
    if ($date !== null) {
        return new DateTime($date);
    }

    return false;
}

This function either returns a new DateTime object or false, if there was an error. This is a typical pattern in PHP programming to show that an error has occurred without raising an exception. The calling code should check for this returned false before passing on the value to another function or method that may not be able to handle a false.

Loading history...
132
    }
133
134
    /**
135
     * Checks if Request Requires Session ID
136
     * @method isSessionRequiredForMethod
137
     * @author PA
138
     * @date   2017-01-10
139
     * @param  string                     $method YourMembership API Method
140
     * @return bool
141
     */
142 3
    public function isSessionRequiredForMethod(string $method) : bool
143
    {
144
        //TODO Add config Logic for what API Methods require Session ID
145 3
        return ($method != 'Session.Create');
146
    }
147
148
    /**
149
     * Helper for Deep Copy for of $from element into $to element for SimpleXML
150
     * @method sxmlAppend
151
     * @author PA
152
     * @date   2017-01-09
153
     * @param  \SimpleXMLElement $to
154
     * @param  \SimpleXMLElement $from
155
     * @return void
156
     */
157 3
    private function sxmlAppend(\SimpleXMLElement $to, \SimpleXMLElement $from) {
158 3
        $toDom = dom_import_simplexml($to);
159 3
        $fromDom = dom_import_simplexml($from);
160 3
        $toDom->appendChild($toDom->ownerDocument->importNode($fromDom, true));
161 3
    }
162
163
    /**
164
     * Adds the Session Variable to the given XML Request Payload
165
     * @method addSessionIdToRequest
166
     * @author PA
167
     * @date   2017-01-10
168
     * @param  \SimpleXMLElement                $requestXML Base Request XML Payload
169
     */
170 3
    private function addSessionIdToRequest(\SimpleXMLElement $requestXML) : \SimpleXMLElement
171
    {
172 3
        $requestXML->addChild('SessionID', self::$sessionId);
173 3
        return $requestXML;
174
    }
175
176
177
    /**
178
     * Setter Method for SessionID
179
     * @method setSessionId
180
     * @author PA
181
     * @date   2017-01-10
182
     * @param  string       $sessionId YourMembership Session ID
183
     */
184 2
    public static function setSessionId(string $sessionId)
185
    {
186 2
        self::$sessionId = $sessionId;
187 2
    }
188
189
    /**
190
     * Checks if we have an active session available
191
     * @method hasSession
192
     * @author PA
193
     * @date   2017-01-11
194
     * @return boolean
195
     */
196 1
    public function hasSession()
197
    {
198 1
        return !is_null(self::$sessionId);
199
    }
200
201
}
202