diff --git a/lib/API/JSON/v1/Subscribers.php b/lib/API/JSON/v1/Subscribers.php index 88dad9282f..3522fea9c0 100644 --- a/lib/API/JSON/v1/Subscribers.php +++ b/lib/API/JSON/v1/Subscribers.php @@ -95,24 +95,46 @@ class Subscribers extends APIEndpoint { $listing_data = $this->subscribers_listings->getListingsInSegment($data); } - $data = array(); + $result = array(); foreach ($listing_data['items'] as $subscriber) { - $data[] = $subscriber + $subscriber_result = $subscriber ->withSubscriptions() ->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( 'mailpoet_subscribers_listings_filters_segments', $listing_data['filters']['segment'] ); - return $this->successResponse($data, array( + + return $this->successResponse($result, array( 'count' => $listing_data['count'], 'filters' => $listing_data['filters'], '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()) { $form_id = (isset($data['form_id']) ? (int)$data['form_id'] : false); $form = Form::findOne($form_id); diff --git a/lib/Models/Segment.php b/lib/Models/Segment.php index 679d9708c7..b05214b436 100644 --- a/lib/Models/Segment.php +++ b/lib/Models/Segment.php @@ -47,7 +47,7 @@ class Segment extends Model { __NAMESPACE__.'\SubscriberSegment', 'segment_id', 'subscriber_id' - )->where(MP_SUBSCRIBER_SEGMENT_TABLE.'.status', Subscriber::STATUS_SUBSCRIBED); + ); } function duplicate($data = array()) { diff --git a/tests/integration/API/JSON/v1/SubscribersTest.php b/tests/integration/API/JSON/v1/SubscribersTest.php index 10f60a168d..574c7f10b3 100644 --- a/tests/integration/API/JSON/v1/SubscribersTest.php +++ b/tests/integration/API/JSON/v1/SubscribersTest.php @@ -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() { // get 1st page (limit items per page to 1) $response = $this->endpoint->listing(array( diff --git a/tests/integration/Models/SubscriberTest.php b/tests/integration/Models/SubscriberTest.php index c49e829d20..ee338d85f8 100644 --- a/tests/integration/Models/SubscriberTest.php +++ b/tests/integration/Models/SubscriberTest.php @@ -241,9 +241,6 @@ class SubscriberTest extends \MailPoetTest { $subscribers = Subscriber::filter('filterBy', array('segment' => 'none')) ->findMany(); expect($subscribers)->count(1); - $subscribers = Subscriber::filter('filterBy', array('segment' => $segment->id)) - ->findMany(); - expect($subscribers)->count(0); // subscribed to trashed segments SubscriberSegment::subscribeToSegments(