Completed
Push — master ( 9ec94a...174e63 )
by Mark
01:43
created

Laposta::getMember()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 10
rs 9.4285
cc 2
eloc 5
nc 2
nop 2
1
<?php
2
3
namespace Mrkj\Laposta;
4
5
use GuzzleHttp\Client;
6
use Mrkj\Laposta\Models\List_;
7
use Mrkj\Laposta\Models\Member;
8
use Mrkj\Laposta\Transformers\ListTransformer;
9
10
class Laposta
11
{
12
    /**
13
     * @var string
14
     */
15
    private $apiKey;
16
17
    /**
18
     * @var Client
19
     */
20
    private $client;
21
22
    /**
23
     * Laposta constructor.
24
     * @param null|string $apiKey
25
     * @param null|Client $client
26
     * @throws \Exception
27
     */
28
    public function __construct($apiKey = null, $client = null)
29
    {
30
        if (empty(trim($apiKey))) {
31
            throw new \Exception('No API key provided');
32
        }
33
34
        $this->apiKey = $apiKey;
35
36
        if ($client && $client instanceof Client) {
37
            $this->client = $client;
38
        } else {
39
            $this->client = new Client([
40
                'base_uri' => 'https://api.laposta.nl/v2/',
41
                'auth' => [$this->apiKey, ''],
42
                'http_errors' => true,
43
            ]);
44
        }
45
    }
46
47
    /**
48
     * @return List_[]
49
     */
50
    public function getLists() : array
51
    {
52
        $data = $this->get('list');
53
54
        $lists = [];
55
56
        foreach ($data['data'] as $listResponse) {
57
            $lists[] = List_::createFromResponse($listResponse['list']);
58
        }
59
60
        return $lists;
61
    }
62
63
    /**
64
     * @param $listId
65
     * @return List_
66
     */
67
    public function getList($listId) : List_
68
    {
69
        $data = $this->get('list/'.$listId);
70
71
        $list = List_::createFromResponse($data['list']);
72
73
        return $list;
74
    }
75
76
    /**
77
     * @param List_ $list
78
     */
79
    public function createList(List_ $list)
80
    {
81
        $data = $this->post('list', [
82
            'form_params' => ListTransformer::toFormParams($list),
83
        ]);
84
85
        $list->updateFromResponse($data['list']);
86
    }
87
88
    /**
89
     * @param List_ $list
90
     */
91
    public function updateList(List_ $list)
92
    {
93
        $data = $this->post('list/'.$list->id, [
94
            'form_params' => ListTransformer::toFormParams($list),
95
        ]);
96
97
        $list->updateFromResponse($data['list']);
98
    }
99
100
    /**
101
     * @param List_ $list
102
     */
103
    public function deleteList(List_ $list)
104
    {
105
        $data = $this->delete('list/'.$list->id);
106
107
        $list->updateFromResponse($data['list']);
108
    }
109
110
    /**
111
     * @param List_|string $list
112
     * @param string $state
113
     * @return Member[]
114
     */
115
    public function getMembers($list, $state = Member::STATE_ACTIVE) : array
116
    {
117
        $listId = $list instanceof List_ ? $list->id : $list;
118
119
        $params = ['list_id' => $listId];
120
121
        if (! is_null($state) && in_array($state, Member::STATES)) {
122
            $params['state'] = $state;
123
        }
124
125
        $data = $this->get('member?'.http_build_query($params));
126
127
        $members = [];
128
129
        foreach ($data['data'] as $listResponse) {
130
            $members[] = Member::createFromResponse($listResponse['member']);
131
        }
132
133
        return $members;
134
    }
135
136
    public function getMember($list, string $memberId) : Member
137
    {
138
        $listId = $list instanceof List_ ? $list->id : $list;
139
140
        $data = $this->get('member/'.$memberId.'?'.http_build_query(['list_id' => $listId]));
141
142
        $member = Member::createFromResponse($data['member']);
143
144
        return $member;
145
    }
146
147
    /**
148
     * @param string $uri
149
     * @param array $options
150
     * @return mixed
151
     */
152
    private function get($uri, $options = []) : array
153
    {
154
        return $this->request('get', $uri, $options);
155
    }
156
157
    /**
158
     * @param string $uri
159
     * @param array $options
160
     * @return mixed
161
     */
162
    private function post($uri, $options = []) : array
163
    {
164
        return $this->request('post', $uri, $options);
165
    }
166
167
    /**
168
     * @param string $uri
169
     * @param array $options
170
     * @return array
171
     */
172
    private function delete($uri, $options = []) : array
173
    {
174
        return $this->request('delete', $uri, $options);
175
    }
176
177
    /**
178
     * @param string $method
179
     * @param string $uri
180
     * @param array $options
181
     * @return array
182
     */
183
    private function request($method, $uri, $options = []) : array
184
    {
185
        $response = $this->client->request($method, $uri, $options);
186
187
        $data = json_decode($response->getBody()->getContents(), true);
188
189
        return $data;
190
    }
191
}
192