Completed
Push — master ( 174e63...012789 )
by Mark
01:44
created

Laposta::updateMember()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 8
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

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