1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
<?php
namespace SparkPost;
use Http\Client\HttpClient;
use GuzzleHttp\Psr7\Request as Request;
use SparkPost\Promise as SparkPostPromise;
class SparkPost
{
private $version = '2.0.0';
private $config;
public $httpClient;
private $options;
public $transmissions;
private static $defaultOptions = [
'host' => 'api.sparkpost.com',
'protocol' => 'https',
'port' => 443,
'strictSSL' => true,
'key' => '',
'version' => 'v1',
'timeout' => 10
];
public function __construct(HttpClient $httpClient, $options)
{
$this->setOptions($options);
$this->setHttpClient($httpClient);
$this->setupEndpoints();
}
public function request($method = '', $uri = '', $payload = [], $headers = [])
{
$method = trim(strtoupper($method));
if ($method === 'GET') {
$params = $payload;
$body = [];
}
else {
$params = [];
$body = $payload;
}
$url = $this->getUrl($uri, $params);
$headers = $this->getHttpHeaders($headers);
$request = new Request($method, $url, $headers, json_encode($body));
$promise = $this->httpClient->sendAsyncRequest($request);
return new SparkPostPromise($promise);
}
public function getHttpHeaders($headers)
{
return [
'Authorization' => $this->options['key'],
'Content-Type' => 'application/json',
];
}
public function getUrl($path, $params) {
$options = $this->options;
for ($index = 0; $index < count($params); $index++) {
if (is_array($params[$index]))
$params[$index] = implode(',', $params);
}
$paramsString = http_build_query($params);
return $options['protocol'].'://'.$options['host'].($options['port'] ? ':'.$options['port'] : '').'/api/'.$options['version'].'/'.$path.($paramsString ? '?'.$paramsString : '');
}
public function setHttpClient(HttpClient $httpClient)
{
$this->httpClient = $httpClient;
}
public function setOptions($options)
{
// if the options map is a string we should assume that its an api key
if (is_string($options)) {
$options = ['key' => $options];
}
// Validate API key because its required
if (!isset($this->options['key']) && (!isset($options['key']) || !preg_match('/\S/', $options['key']))) {
throw new \Exception('You must provide an API key');
}
$this->options = isset($this->options) ? $this->options : self::$defaultOptions;
// set options, overriding defaults
foreach ($options as $option => $value) {
if (key_exists($option, $this->options)) {
$this->options[$option] = $value;
}
}
}
private function setupEndpoints() {
}
}
|