Completed
Push — master ( e65557...9ab3fa )
by Mark
01:50
created

Laposta::createMember()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 30
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 30
rs 8.8571
cc 1
eloc 24
nc 1
nop 8

How to fix   Many Parameters   

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

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,
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;
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 string $uri
225
     * @param array $options
226
     * @return mixed
227
     */
228
    private function get($uri, $options = []) : array
229
    {
230
        return $this->request('get', $uri, $options);
231
    }
232
233
    /**
234
     * @param string $uri
235
     * @param array $options
236
     * @return mixed
237
     */
238
    private function post($uri, $options = []) : array
239
    {
240
        return $this->request('post', $uri, $options);
241
    }
242
243
    /**
244
     * @param string $uri
245
     * @param array $options
246
     * @return array
247
     */
248
    private function delete($uri, $options = []) : array
249
    {
250
        return $this->request('delete', $uri, $options);
251
    }
252
253
    /**
254
     * @param string $method
255
     * @param string $uri
256
     * @param array $options
257
     * @return array
258
     */
259
    private function request($method, $uri, $options = []) : array
260
    {
261
        $response = $this->client->request($method, $uri, $options);
262
263
        $data = json_decode($response->getBody()->getContents(), true);
264
265
        return $data;
266
    }
267
}
268