diff --git a/lib/API/JSON/v1/Subscribers.php b/lib/API/JSON/v1/Subscribers.php index ce140b70d5..29ab881b7e 100644 --- a/lib/API/JSON/v1/Subscribers.php +++ b/lib/API/JSON/v1/Subscribers.php @@ -10,6 +10,7 @@ use MailPoet\Listing; use MailPoet\Models\Form; use MailPoet\Models\StatisticsForms; use MailPoet\Models\Subscriber; +use MailPoet\Models\SubscriberSegment; use MailPoet\Newsletter\Scheduler\Scheduler; use MailPoet\Segments\BulkAction; use MailPoet\Segments\SubscribersListings; @@ -229,6 +230,7 @@ class Subscribers extends APIEndpoint { if (empty($data['segments'])) { $data['segments'] = array(); } + $new_segments = $this->findNewSegments($data); $subscriber = Subscriber::createOrUpdate($data); $errors = $subscriber->getErrors(); @@ -241,8 +243,8 @@ class Subscribers extends APIEndpoint { $subscriber->save(); } - if (!empty($data['segments'])) { - Scheduler::scheduleSubscriberWelcomeNotification($subscriber->id, $data['segments']); + if (!empty($new_segments)) { + Scheduler::scheduleSubscriberWelcomeNotification($subscriber->id, $new_segments); } return $this->successResponse( @@ -250,6 +252,17 @@ class Subscribers extends APIEndpoint { ); } + private function findNewSegments(array $data) { + $old_segment_ids = []; + if (isset($data['id']) && (int)$data['id'] > 0) { + $old_segments = SubscriberSegment::where('subscriber_id', $data['id'])->findMany(); + foreach ($old_segments as $old_segment) { + $old_segment_ids[] = $old_segment->segment_id; + } + } + return array_diff($data['segments'], $old_segment_ids); + } + function restore($data = array()) { $id = (isset($data['id']) ? (int)$data['id'] : false); $subscriber = Subscriber::findOne($id); diff --git a/tests/integration/API/JSON/v1/SubscribersTest.php b/tests/integration/API/JSON/v1/SubscribersTest.php index 009a726088..cd5a87607c 100644 --- a/tests/integration/API/JSON/v1/SubscribersTest.php +++ b/tests/integration/API/JSON/v1/SubscribersTest.php @@ -601,6 +601,32 @@ class SubscribersTest extends \MailPoetTest { expect(SendingQueue::findMany())->count(1); } + function testItDoesNotSchedulesWelcomeEmailNotificationWhenNoNewSegmentIsAdded() { + $this->_createWelcomeNewsletter(); + $subscriber = Subscriber::createOrUpdate(array( + 'email' => 'raul.doe@mailpoet.com', + 'first_name' => 'Jane', + 'last_name' => 'Doe', + 'status' => Subscriber::STATUS_SUBSCRIBED, + 'segments' => [ + $this->segment_1->id + ], + 'source' => Source::IMPORTED, + )); + $subscriber_data = array( + 'id' => $subscriber->id(), + 'email' => 'raul.doe@mailpoet.com', + 'first_name' => 'Raul', + 'last_name' => 'Doe', + 'segments' => array( + $this->segment_1->id + ) + ); + + $this->endpoint->save($subscriber_data); + expect(SendingQueue::findMany())->count(0); + } + private function _createWelcomeNewsletter() { $welcome_newsletter = Newsletter::create(); $welcome_newsletter->type = Newsletter::TYPE_WELCOME;