Display subscribers with correct status

[MAILPOET-1944]
This commit is contained in:
Pavel Dohnal
2019-04-23 16:50:49 +02:00
committed by M. Shull
parent 7b61df02e5
commit ae70f7ae9b
4 changed files with 50 additions and 7 deletions

View File

@ -95,24 +95,46 @@ class Subscribers extends APIEndpoint {
$listing_data = $this->subscribers_listings->getListingsInSegment($data); $listing_data = $this->subscribers_listings->getListingsInSegment($data);
} }
$data = array(); $result = array();
foreach ($listing_data['items'] as $subscriber) { foreach ($listing_data['items'] as $subscriber) {
$data[] = $subscriber $subscriber_result = $subscriber
->withSubscriptions() ->withSubscriptions()
->asArray(); ->asArray();
if (isset($data['filter']['segment'])) {
$subscriber_result = $this->preferUnsubscribedStatusFromSegment($subscriber_result, $data['filter']['segment']);
}
$result[] = $subscriber_result;
} }
$listing_data['filters']['segment'] = $this->wp->applyFilters( $listing_data['filters']['segment'] = $this->wp->applyFilters(
'mailpoet_subscribers_listings_filters_segments', 'mailpoet_subscribers_listings_filters_segments',
$listing_data['filters']['segment'] $listing_data['filters']['segment']
); );
return $this->successResponse($data, array(
return $this->successResponse($result, array(
'count' => $listing_data['count'], 'count' => $listing_data['count'],
'filters' => $listing_data['filters'], 'filters' => $listing_data['filters'],
'groups' => $listing_data['groups'] 'groups' => $listing_data['groups']
)); ));
} }
private function preferUnsubscribedStatusFromSegment(array $subscriber, $segment_id) {
$segment_status = $this->findSegmentStatus($subscriber, $segment_id);
if ($segment_status === Subscriber::STATUS_UNSUBSCRIBED) {
$subscriber['status'] = $segment_status;
}
return $subscriber;
}
private function findSegmentStatus(array $subscriber, $segment_id) {
foreach ($subscriber['subscriptions'] as $segment) {
if ($segment['segment_id'] === $segment_id) {
return $segment['status'];
}
}
}
function subscribe($data = array()) { function subscribe($data = array()) {
$form_id = (isset($data['form_id']) ? (int)$data['form_id'] : false); $form_id = (isset($data['form_id']) ? (int)$data['form_id'] : false);
$form = Form::findOne($form_id); $form = Form::findOne($form_id);

View File

@ -47,7 +47,7 @@ class Segment extends Model {
__NAMESPACE__.'\SubscriberSegment', __NAMESPACE__.'\SubscriberSegment',
'segment_id', 'segment_id',
'subscriber_id' 'subscriber_id'
)->where(MP_SUBSCRIBER_SEGMENT_TABLE.'.status', Subscriber::STATUS_SUBSCRIBED); );
} }
function duplicate($data = array()) { function duplicate($data = array()) {

View File

@ -322,6 +322,30 @@ class SubscribersTest extends \MailPoetTest {
); );
} }
function testItCorrectSubscriptionStatus() {
$segment = Segment::createOrUpdate(array('name' => 'Segment185245'));
$subscriber = Subscriber::createOrUpdate([
'email' => 'third@example.com',
'status' => Subscriber::STATUS_SUBSCRIBED,
'segments' => array(
$segment->id,
),
'source' => Source::API,
]);
SubscriberSegment::createOrUpdate([
'subscriber_id' => $subscriber->id,
'segment_id' => $segment->id,
'status' => Subscriber::STATUS_UNSUBSCRIBED,
]);
$response = $this->endpoint->listing([
'filter' => [
'segment' => $segment->id,
],
]);
expect($response->data[0]['status'])->equals(Subscriber::STATUS_UNSUBSCRIBED);
}
function testItCanSortAndLimitListing() { function testItCanSortAndLimitListing() {
// get 1st page (limit items per page to 1) // get 1st page (limit items per page to 1)
$response = $this->endpoint->listing(array( $response = $this->endpoint->listing(array(

View File

@ -241,9 +241,6 @@ class SubscriberTest extends \MailPoetTest {
$subscribers = Subscriber::filter('filterBy', array('segment' => 'none')) $subscribers = Subscriber::filter('filterBy', array('segment' => 'none'))
->findMany(); ->findMany();
expect($subscribers)->count(1); expect($subscribers)->count(1);
$subscribers = Subscriber::filter('filterBy', array('segment' => $segment->id))
->findMany();
expect($subscribers)->count(0);
// subscribed to trashed segments // subscribed to trashed segments
SubscriberSegment::subscribeToSegments( SubscriberSegment::subscribeToSegments(