Skip to content

Commit c38c30f

Browse files
committed
handle all user status (subscribed, pending, ...) issue #9
1 parent 5715036 commit c38c30f

File tree

7 files changed

+207
-26
lines changed

7 files changed

+207
-26
lines changed

spec/Event/SubscriberListenerSpec.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,18 @@ function it_listen_to_unsubscribe_events($listRepository, $event, $subscriber)
3737
$this->onUnsubscribe($event);
3838
}
3939

40+
function it_listen_to_pending_events($listRepository, $event, $subscriber)
41+
{
42+
$listRepository->pending('foo', $subscriber)->shouldBeCalled();
43+
$this->onPending($event);
44+
}
45+
46+
function it_listen_to_clean_events($listRepository, $event, $subscriber)
47+
{
48+
$listRepository->clean('foo', $subscriber)->shouldBeCalled();
49+
$this->onClean($event);
50+
}
51+
4052
function it_listen_to_delete_events($listRepository, $event, $subscriber)
4153
{
4254
$listRepository->delete('foo', $subscriber)->shouldBeCalled();

spec/Subscriber/ListRepositorySpec.php

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,22 @@ function it_subscribe_a_subscriber(MailChimp $mailchimp, $subscriber)
5454

5555
function it_unsubscribe_a_subscriber(MailChimp $mailchimp, $subscriber)
5656
{
57-
$mailchimp->patch("lists/ba039c6198/members/md5ofthesubscribermail", [
58-
'status' => 'unsubscribed'
59-
])->willReturn('unsubscribed');
6057

6158
$this->unsubscribe('ba039c6198', $subscriber)->shouldReturn('unsubscribed');
6259
}
6360

61+
function it_pending_a_subscriber(MailChimp $mailchimp, $subscriber)
62+
{
63+
64+
$this->pending('ba039c6198', $subscriber)->shouldReturn('pending');
65+
}
66+
67+
function it_clean_a_subscriber(MailChimp $mailchimp, $subscriber)
68+
{
69+
70+
$this->clean('ba039c6198', $subscriber)->shouldReturn('cleaned');
71+
}
72+
6473
function it_delete_a_subscriber(MailChimp $mailchimp, $subscriber)
6574
{
6675
$mailchimp->delete("lists/ba039c6198/members/md5ofthesubscribermail")->willReturn('deleted');
@@ -206,6 +215,30 @@ protected function prepareMailchimpLists(MailChimp $mailchimp)
206215
'email_type' => 'html',
207216
'status' => 'subscribed'
208217
]);
218+
219+
$mailchimp->put("lists/ba039c6198/members/md5ofthesubscribermail", [
220+
'email_address' => 'charles@terrasse.fr',
221+
'merge_fields' => ['FNAME' => 'Charles', 'LNAME' => 'Terrasse'],
222+
'language' => 'fr',
223+
'email_type' => 'html',
224+
'status' => 'unsubscribed'
225+
])->willReturn('unsubscribed');
226+
227+
$mailchimp->put("lists/ba039c6198/members/md5ofthesubscribermail", [
228+
'email_address' => 'charles@terrasse.fr',
229+
'merge_fields' => ['FNAME' => 'Charles', 'LNAME' => 'Terrasse'],
230+
'language' => 'fr',
231+
'email_type' => 'html',
232+
'status' => 'pending'
233+
])->willReturn('pending');
234+
235+
$mailchimp->put("lists/ba039c6198/members/md5ofthesubscribermail", [
236+
'email_address' => 'charles@terrasse.fr',
237+
'merge_fields' => ['FNAME' => 'Charles', 'LNAME' => 'Terrasse'],
238+
'language' => 'fr',
239+
'email_type' => 'html',
240+
'status' => 'cleaned'
241+
])->willReturn('cleaned');
209242
}
210243

211244
protected function getSubscriberChunk($count, $offset)

src/Event/SubscriberEvent.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,18 @@ class SubscriberEvent extends Event
2222
*/
2323
const EVENT_UNSUBSCRIBE = 'welp.mailchimp.unsubscribe';
2424

25+
/**
26+
* Event to pending a User
27+
* @var string
28+
*/
29+
const EVENT_PENDING = 'welp.mailchimp.pending';
30+
31+
/**
32+
* Event to clean a User
33+
* @var string
34+
*/
35+
const EVENT_CLEAN = 'welp.mailchimp.clean';
36+
2537
/**
2638
* Event to update a User
2739
* @var string

src/Event/SubscriberListener.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,32 @@ public function onUnsubscribe(SubscriberEvent $event)
4949
);
5050
}
5151

52+
/**
53+
* Action when a User is pending
54+
* @param SubscriberEvent $event
55+
* @return void
56+
*/
57+
public function onPending(SubscriberEvent $event)
58+
{
59+
$this->listRepository->pending(
60+
$event->getListId(),
61+
$event->getSubscriber()
62+
);
63+
}
64+
65+
/**
66+
* Action when a User is cleaned
67+
* @param SubscriberEvent $event
68+
* @return void
69+
*/
70+
public function onClean(SubscriberEvent $event)
71+
{
72+
$this->listRepository->clean(
73+
$event->getListId(),
74+
$event->getSubscriber()
75+
);
76+
}
77+
5278
/**
5379
* Action when a User update its info
5480
* @param SubscriberEvent $event

src/Resources/config/services.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ services:
2727
tags:
2828
- { name: kernel.event_listener, event: welp.mailchimp.subscribe, method: onSubscribe }
2929
- { name: kernel.event_listener, event: welp.mailchimp.unsubscribe, method: onUnsubscribe }
30+
- { name: kernel.event_listener, event: welp.mailchimp.pending, method: onPending }
31+
- { name: kernel.event_listener, event: welp.mailchimp.clean, method: onClean }
3032
- { name: kernel.event_listener, event: welp.mailchimp.update, method: onUpdate }
3133
- { name: kernel.event_listener, event: welp.mailchimp.change_email, method: onChangeEmail }
3234
- { name: kernel.event_listener, event: welp.mailchimp.delete, method: onDelete }

src/Resources/doc/usage.md

Lines changed: 61 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ If you want realtime synchronization, you can dispatch custom events on your con
3434

3535
SubscriberEvent::EVENT_SUBSCRIBE = 'welp.mailchimp.subscribe';
3636
SubscriberEvent::EVENT_UNSUBSCRIBE = 'welp.mailchimp.unsubscribe';
37+
SubscriberEvent::EVENT_PENDING = 'welp.mailchimp.pending';
38+
SubscriberEvent::EVENT_CLEAN = 'welp.mailchimp.clean';
3739
SubscriberEvent::EVENT_UPDATE = 'welp.mailchimp.update';
3840
SubscriberEvent::EVENT_CHANGE_EMAIL = 'welp.mailchimp.change_email';
3941
SubscriberEvent::EVENT_DELETE = 'welp.mailchimp.delete';
@@ -69,7 +71,7 @@ public function newUser(User $user)
6971

7072
### Unsubscribe a User
7173

72-
Unsubscribe is simpler, you only need the email, all merge fields will be ignored:
74+
Here is an example of unsubscribe event dispatch:
7375

7476
```php
7577
<?php
@@ -92,6 +94,64 @@ public function unsubscribeUser(User $user)
9294
}
9395
```
9496

97+
### Pending a User
98+
99+
Here is an example of pending event dispatch:
100+
101+
```php
102+
<?php
103+
104+
use Welp\MailchimpBundle\Event\SubscriberEvent;
105+
use Welp\MailchimpBundle\Subscriber\Subscriber;
106+
107+
// ...
108+
109+
public function pendingUser(User $user)
110+
{
111+
// ...
112+
113+
$subscriber = new Subscriber($user->getEmail(), [
114+
'FIRSTNAME' => $user->getFirstname(),
115+
], [
116+
'language' => 'fr'
117+
]);
118+
119+
$this->container->get('event_dispatcher')->dispatch(
120+
SubscriberEvent::EVENT_PENDING,
121+
new SubscriberEvent('your_list_id', $subscriber)
122+
);
123+
}
124+
```
125+
126+
### Clean a User
127+
128+
Here is an example of clean event dispatch:
129+
130+
```php
131+
<?php
132+
133+
use Welp\MailchimpBundle\Event\SubscriberEvent;
134+
use Welp\MailchimpBundle\Subscriber\Subscriber;
135+
136+
// ...
137+
138+
public function cleanUser(User $user)
139+
{
140+
// ...
141+
142+
$subscriber = new Subscriber($user->getEmail(), [
143+
'FIRSTNAME' => $user->getFirstname(),
144+
], [
145+
'language' => 'fr'
146+
]);
147+
148+
$this->container->get('event_dispatcher')->dispatch(
149+
SubscriberEvent::EVENT_CLEAN,
150+
new SubscriberEvent('your_list_id', $subscriber)
151+
);
152+
}
153+
```
154+
95155
### Update a User
96156

97157
If your User changes his information, you can sync with MailChimp:

src/Subscriber/ListRepository.php

Lines changed: 58 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -60,18 +60,22 @@ public function findById($listId)
6060
}
6161

6262
/**
63-
* Subscribe a Subscriber to a list
63+
* core function to put (add or edit) subscriber to a list
6464
* @param string $listId
6565
* @param Subscriber $subscriber
66+
* @param string $status
6667
* @return array
6768
*/
68-
public function subscribe($listId, Subscriber $subscriber)
69+
protected function putSubscriberInList($listId, Subscriber $subscriber, $status)
6970
{
71+
if(!in_array($status, ['subscribed', 'unsubscribed', 'cleaned', 'pending', 'transactional'])){
72+
throw new \RuntimeException('$status must be one of these values: subscribed, unsubscribed, cleaned, pending, transactional');
73+
}
7074
$subscriberHash = $this->mailchimp->subscriberHash($subscriber->getEmail());
7175
$result = $this->mailchimp->put("lists/$listId/members/$subscriberHash",
7276
array_merge(
7377
$subscriber->formatMailChimp(),
74-
['status' => 'subscribed']
78+
['status' => $status]
7579
)
7680
);
7781

@@ -82,6 +86,57 @@ public function subscribe($listId, Subscriber $subscriber)
8286
return $result;
8387
}
8488

89+
/**
90+
* Subscribe a Subscriber to a list
91+
* @param string $listId
92+
* @param Subscriber $subscriber
93+
* @return array
94+
*/
95+
public function subscribe($listId, Subscriber $subscriber)
96+
{
97+
return $this->putSubscriberInList($listId, $subscriber, 'subscribed');
98+
}
99+
100+
/**
101+
* Subscribe a Subscriber to a list
102+
* @param string $listId
103+
* @param Subscriber $subscriber
104+
*/
105+
public function unsubscribe($listId, Subscriber $subscriber)
106+
{
107+
return $this->putSubscriberInList($listId, $subscriber, 'unsubscribed');
108+
}
109+
110+
/**
111+
* Clean a Subscriber to a list
112+
* @param string $listId
113+
* @param Subscriber $subscriber
114+
*/
115+
public function clean($listId, Subscriber $subscriber)
116+
{
117+
return $this->putSubscriberInList($listId, $subscriber, 'cleaned');
118+
}
119+
120+
/**
121+
* Add/set pending a Subscriber to a list
122+
* @param string $listId
123+
* @param Subscriber $subscriber
124+
*/
125+
public function pending($listId, Subscriber $subscriber)
126+
{
127+
return $this->putSubscriberInList($listId, $subscriber, 'pending');
128+
}
129+
130+
/**
131+
* set transactional a Subscriber to a list
132+
* @param string $listId
133+
* @param Subscriber $subscriber
134+
*/
135+
public function transactional($listId, Subscriber $subscriber)
136+
{
137+
return $this->putSubscriberInList($listId, $subscriber, 'transactional');
138+
}
139+
85140
/**
86141
* Update a Subscriber to a list
87142
* http://developer.mailchimp.com/documentation/mailchimp/reference/lists/members/#edit-patch_lists_list_id_members_subscriber_hash
@@ -156,25 +211,6 @@ public function changeEmailAddress($listId, Subscriber $newSubscriber, $oldEmail
156211
return $result;
157212
}
158213

159-
/**
160-
* Subscribe a Subscriber to a list
161-
* @param string $listId
162-
* @param Subscriber $subscriber
163-
*/
164-
public function unsubscribe($listId, Subscriber $subscriber)
165-
{
166-
$subscriberHash = $this->mailchimp->subscriberHash($subscriber->getEmail());
167-
$result = $this->mailchimp->patch("lists/$listId/members/$subscriberHash", [
168-
'status' => 'unsubscribed'
169-
]);
170-
171-
if (!$this->mailchimp->success()) {
172-
throw new \RuntimeException($this->mailchimp->getLastError());
173-
}
174-
175-
return $result;
176-
}
177-
178214
/**
179215
* Delete a Subscriber to a list
180216
* @param string $listId

0 commit comments

Comments
 (0)