summaryrefslogtreecommitdiffstats
path: root/lib/SparkPost/SparkPost.php
blob: b37351ea41bd5306605e0995478f6a4eddbee8ca (plain)
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() {
    }
}