Completed
Push — master ( 9ab3fa...878819 )
by Mark
02:35
created

Laposta::deleteMember()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 6
rs 9.4285
cc 1
eloc 3
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 $name
79
     * @param null $remarks
80
     * @param null $subscribeNotificationEmail
81
     * @param null $unsubsribeNotificationEmail
82
     * @return List_
83
     */
84
    public function createList(
85
        $name,
86
        $remarks = null,
87
        $subscribeNotificationEmail = null,
88
        $unsubsribeNotificationEmail = null
89
    ) : List_ {
90
        $list = new List_();
91
        $list->name = $name;
92
        $list->remarks = $remarks;
93
        $list->subscribeNotificationEmail = $subscribeNotificationEmail;
94
        $list->unsubsribeNotificationEmail = $unsubsribeNotificationEmail;
95
96
        $data = $this->post('list', [
97
            'form_params' => ListTransformer::toFormParams($list),
98
        ]);
99
100
        $list->updateFromResponse($data['list']);
101
102
        return $list;
103
    }
104
105
    /**
106
     * @param List_ $list
107
     */
108
    public function updateList(List_ $list)
109
    {
110
        $data = $this->post('list/'.$list->id, [
111
            'form_params' => ListTransformer::toFormParams($list),
112
        ]);
113
114
        $list->updateFromResponse($data['list']);
115
    }
116
117
    /**
118
     * @param List_ $list
119
     */
120
    public function deleteList(List_ $list)
121
    {
122
        $data = $this->delete('list/'.$list->id);
123
124
        $list->updateFromResponse($data['list']);
125
    }
126
127
    /**
128
     * @param List_|string $list
129
     * @param string $state
130
     * @return Member[]
131
     */
132
    public function getMembers($list, $state = Member::STATE_ACTIVE) : array
133
    {
134
        $listId = $list instanceof List_ ? $list->id : $list;
135
136
        $params = ['list_id' => $listId];
137
138
        if (! is_null($state) && in_array($state, Member::STATES)) {
139
            $params['state'] = $state;
140
        }
141
142
        $data = $this->get('member?'.http_build_query($params));
143
144
        $members = [];
145
146
        foreach ($data['data'] as $listResponse) {
147
            $members[] = Member::createFromResponse($listResponse['member']);
148
        }
149
150
        return $members;
151
    }
152
153
    /**
154
     * @param List_|string $list
155
     * @param string $memberId
156
     * @return Member
157
     */
158
    public function getMember($list, string $memberId) : Member
159
    {
160
        $listId = $list instanceof List_ ? $list->id : $list;
161
162
        $data = $this->get('member/'.$memberId.'?'.http_build_query(['list_id' => $listId]));
163
164
        $member = Member::createFromResponse($data['member']);
165
166
        return $member;
167
    }
168
169
    /**
170
     * @param $listId
171
     * @param $email
172
     * @param $ip
173
     * @param array $customFields
174
     * @param null $sourceUrl
175
     * @param bool $suppressEmailNotification
176
     * @param bool $suppressEmailWelcome
177
     * @param bool $ignoreDoubleOptin
178
     * @return Member
179
     */
180
    public function createMember(
181
        $listId,
182
        $email,
183
        $ip = null,
184
        $customFields = [],
185
        $sourceUrl = null,
186
        $suppressEmailNotification = false,
187
        $suppressEmailWelcome = false,
188
        $ignoreDoubleOptin = false
189
    ) : Member {
190
        $member = new Member();
191
        $member->listId = $listId;
192
        $member->email = $email;
193
        $member->ip = $ip ?? (isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : '127.0.0.1');
194
        $member->setCustomFields($customFields);
195
        $member->sourceUrl = $sourceUrl;
196
197
        $data = $this->post('member', [
198
            'form_params' => MemberTransformer::toFormParamsForCreate(
199
                $member,
200
                $suppressEmailNotification,
201
                $suppressEmailWelcome,
202
                $ignoreDoubleOptin
203
            ),
204
        ]);
205
206
        $member->updateFromResponse($data['member']);
207
208
        return $member;
209
    }
210
211
    /**
212
     * @param Member $member
213
     */
214
    public function updateMember(Member $member)
215
    {
216
        $data = $this->post('member/'.$member->id.'?'.http_build_query(['list_id' => $member->listId]), [
217
            'form_params' => MemberTransformer::toFormParamsForUpdate($member),
218
        ]);
219
220
        $member->updateFromResponse($data['member']);
221
    }
222
223
    /**
224
     * @param Member $member
225
     */
226
    public function deleteMember(Member $member)
227
    {
228
        $data = $this->delete('member/'.$member->id.'?'.http_build_query(['list_id' => $member->listId]));
229
230
        $member->updateFromResponse($data['member']);
231
    }
232
233
    /**
234
     * @param string $uri
235
     * @param array $options
236
     * @return mixed
237
     */
238
    private function get($uri, $options = []) : array
239
    {
240
        return $this->request('get', $uri, $options);
241
    }
242
243
    /**
244
     * @param string $uri
245
     * @param array $options
246
     * @return mixed
247
     */
248
    private function post($uri, $options = []) : array
249
    {
250
        return $this->request('post', $uri, $options);
251
    }
252
253
    /**
254
     * @param string $uri
255
     * @param array $options
256
     * @return array
257
     */
258
    private function delete($uri, $options = []) : array
259
    {
260
        return $this->request('delete', $uri, $options);
261
    }
262
263
    /**
264
     * @param string $method
265
     * @param string $uri
266
     * @param array $options
267
     * @return array
268
     */
269
    private function request($method, $uri, $options = []) : array
270
    {
271
        $response = $this->client->request($method, $uri, $options);
272
273
        $data = json_decode($response->getBody()->getContents(), true);
274
275
        return $data;
276
    }
277
}
278