Completed
Push — master ( f34b50...86fc0d )
by Freek
04:55 queued 33s
created

Newsletter::removeTags()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 12

Duplication

Lines 12
Ratio 100 %

Importance

Changes 0
Metric Value
dl 12
loc 12
rs 9.8666
c 0
b 0
f 0
cc 1
nc 1
nop 3
1
<?php
2
3
namespace Spatie\Newsletter;
4
5
use DrewM\MailChimp\MailChimp;
6
7
class Newsletter
8
{
9
    /** @var \DrewM\MailChimp\MailChimp */
10
    protected $mailChimp;
11
12
    /** @var \Spatie\Newsletter\NewsletterListCollection */
13
    protected $lists;
14
15
    public function __construct(MailChimp $mailChimp, NewsletterListCollection $lists)
16
    {
17
        $this->mailChimp = $mailChimp;
18
19
        $this->lists = $lists;
20
    }
21
22 View Code Duplication
    public function subscribe(string $email, array $mergeFields = [], string $listName = '', array $options = [])
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
23
    {
24
        $list = $this->lists->findByName($listName);
25
26
        $options = $this->getSubscriptionOptions($email, $mergeFields, $options);
27
28
        $response = $this->mailChimp->post("lists/{$list->getId()}/members", $options);
29
30
        if (! $this->lastActionSucceeded()) {
31
            return false;
32
        }
33
34
        return $response;
35
    }
36
37
    public function subscribePending(string $email, array $mergeFields = [], string $listName = '', array $options = [])
38
    {
39
        $options = array_merge($options, ['status' => 'pending']);
40
41
        return $this->subscribe($email, $mergeFields, $listName, $options);
42
    }
43
44 View Code Duplication
    public function subscribeOrUpdate(string $email, array $mergeFields = [], string $listName = '', array $options = [])
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
45
    {
46
        $list = $this->lists->findByName($listName);
47
48
        $options = $this->getSubscriptionOptions($email, $mergeFields, $options);
49
50
        $response = $this->mailChimp->put("lists/{$list->getId()}/members/{$this->getSubscriberHash($email)}", $options);
51
52
        if (! $this->lastActionSucceeded()) {
53
            return false;
54
        }
55
56
        return $response;
57
    }
58
59
    public function getMembers(string $listName = '', array $parameters = [])
60
    {
61
        $list = $this->lists->findByName($listName);
62
63
        return $this->mailChimp->get("lists/{$list->getId()}/members", $parameters);
64
    }
65
66
    public function getMember(string $email, string $listName = '')
67
    {
68
        $list = $this->lists->findByName($listName);
69
70
        return $this->mailChimp->get("lists/{$list->getId()}/members/{$this->getSubscriberHash($email)}");
71
    }
72
73
    public function getMemberActivity(string $email, string $listName = '')
74
    {
75
        $list = $this->lists->findByName($listName);
76
77
        return $this->mailChimp->get("lists/{$list->getId()}/members/{$this->getSubscriberHash($email)}/activity");
78
    }
79
80
    public function hasMember(string $email, string $listName = ''): bool
81
    {
82
        $response = $this->getMember($email, $listName);
83
84
        if (! isset($response['email_address'])) {
85
            return false;
86
        }
87
88
        if (strtolower($response['email_address']) != strtolower($email)) {
89
            return false;
90
        }
91
92
        return true;
93
    }
94
95
    public function isSubscribed(string $email, string $listName = ''): bool
96
    {
97
        $response = $this->getMember($email, $listName);
98
99
        if (! isset($response)) {
100
            return false;
101
        }
102
103
        if ($response['status'] != 'subscribed') {
104
            return false;
105
        }
106
107
        return true;
108
    }
109
110 View Code Duplication
    public function unsubscribe(string $email, string $listName = '')
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
111
    {
112
        $list = $this->lists->findByName($listName);
113
114
        $response = $this->mailChimp->patch("lists/{$list->getId()}/members/{$this->getSubscriberHash($email)}", [
115
            'status' => 'unsubscribed',
116
        ]);
117
118
        if (! $this->lastActionSucceeded()) {
119
            return false;
120
        }
121
122
        return $response;
123
    }
124
125 View Code Duplication
    public function updateEmailAddress(string $currentEmailAddress, string $newEmailAddress, string $listName = '')
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
126
    {
127
        $list = $this->lists->findByName($listName);
128
129
        $response = $this->mailChimp->patch("lists/{$list->getId()}/members/{$this->getSubscriberHash($currentEmailAddress)}", [
130
            'email_address' => $newEmailAddress,
131
        ]);
132
133
        return $response;
134
    }
135
136
    public function delete(string $email, string $listName = '')
137
    {
138
        $list = $this->lists->findByName($listName);
139
140
        $response = $this->mailChimp->delete("lists/{$list->getId()}/members/{$this->getSubscriberHash($email)}");
141
142
        return $response;
143
    }
144
145
    public function getTags(string $email, string $listName = '')
146
    {
147
        $list = $this->lists->findByName($listName);
148
149
        return $this->mailChimp->get("lists/{$list->getId()}/members/{$this->getSubscriberHash($email)}/tags");
150
    }
151
152 View Code Duplication
    public function addTags(array $tags, string $email, string $listName = '')
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
153
    {
154
        $list = $this->lists->findByName($listName);
155
156
        $payload = collect($tags)->mapWithKeys(function ($tag) {
157
            return [$tag => 'active'];
158
        })->toArray();
159
160
        return $this->mailChimp->post("lists/{$list->getId()}/members/{$this->getSubscriberHash($email)}/tags", [
161
            'tags' => $payload,
162
        ]);
163
    }
164
165 View Code Duplication
    public function removeTags(array $tags, string $email, string $listName = '')
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
166
    {
167
        $list = $this->lists->findByName($listName);
168
169
        $payload = collect($tags)->mapWithKeys(function ($tag) {
170
            return [$tag => 'inactive'];
171
        })->toArray();
172
173
        return $this->mailChimp->post("lists/{$list->getId()}/members/{$this->getSubscriberHash($email)}/tags", [
174
            'tags' => $payload,
175
        ]);
176
    }
177
178
    public function createCampaign(
179
        string $fromName,
180
        string $replyTo,
181
        string $subject,
182
        string $html = '',
183
        string $listName = '',
184
        array $options = [],
185
        array $contentOptions = [])
186
    {
187
        $list = $this->lists->findByName($listName);
188
189
        $defaultOptions = [
190
            'type' => 'regular',
191
            'recipients' => [
192
                'list_id' => $list->getId(),
193
            ],
194
            'settings' => [
195
                'subject_line' => $subject,
196
                'from_name' => $fromName,
197
                'reply_to' => $replyTo,
198
            ],
199
        ];
200
201
        $options = array_merge($defaultOptions, $options);
202
203
        $response = $this->mailChimp->post('campaigns', $options);
204
205
        if (! $this->lastActionSucceeded()) {
206
            return false;
207
        }
208
209
        if ($html === '') {
210
            return $response;
211
        }
212
213
        if (! $this->updateContent($response['id'], $html, $contentOptions)) {
214
            return false;
215
        }
216
217
        return $response;
218
    }
219
220
    public function updateContent(string $campaignId, string $html, array $options = [])
221
    {
222
        $defaultOptions = compact('html');
223
224
        $options = array_merge($defaultOptions, $options);
225
226
        $response = $this->mailChimp->put("campaigns/{$campaignId}/content", $options);
227
228
        if (! $this->lastActionSucceeded()) {
229
            return false;
230
        }
231
232
        return $response;
233
    }
234
235
    public function getApi(): MailChimp
236
    {
237
        return $this->mailChimp;
238
    }
239
240
    /**
241
     * @return array|false
242
     */
243
    public function getLastError()
244
    {
245
        return $this->mailChimp->getLastError();
246
    }
247
248
    public function lastActionSucceeded(): bool
249
    {
250
        return $this->mailChimp->success();
251
    }
252
253
    protected function getSubscriberHash(string $email): string
254
    {
255
        return $this->mailChimp->subscriberHash($email);
256
    }
257
258
    protected function getSubscriptionOptions(string $email, array $mergeFields, array $options): array
259
    {
260
        $defaultOptions = [
261
            'email_address' => $email,
262
            'status' => 'subscribed',
263
            'email_type' => 'html',
264
        ];
265
266
        if (count($mergeFields)) {
267
            $defaultOptions['merge_fields'] = $mergeFields;
268
        }
269
270
        $options = array_merge($defaultOptions, $options);
271
272
        return $options;
273
    }
274
}
275