From d16eb877826f7457abe607afd9223a82db71d65f Mon Sep 17 00:00:00 2001 From: Vlad Date: Wed, 30 Mar 2016 20:57:18 -0400 Subject: [PATCH] - Prevents welcome emails to be sent to unconfirmed subscribers - Closes #384 --- lib/Cron/Workers/Scheduler.php | 31 ++++++++++++++++++-------- lib/Models/SubscriberSegment.php | 4 ++++ lib/Newsletter/Scheduler/Scheduler.php | 8 +++---- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/lib/Cron/Workers/Scheduler.php b/lib/Cron/Workers/Scheduler.php index c2e682e2b7..162b4c083e 100644 --- a/lib/Cron/Workers/Scheduler.php +++ b/lib/Cron/Workers/Scheduler.php @@ -47,16 +47,16 @@ class Scheduler { function processWelcomeNewsletter($newsletter, $queue) { $subscriber = unserialize($queue->subscribers); $subscriber_id = $subscriber['to_process'][0]; - $result = false; if($newsletter->event === 'segment') { - $result = $this->verifyMailPoetSubscriber($subscriber_id, $newsletter); + if ($this->verifyMailPoetSubscriber($subscriber_id, $newsletter, $queue) === false) { + return; + } } else if($newsletter->event === 'user') { - $result = $this->verifyWPSubscriber($subscriber_id, $newsletter); - } - if(!$result) { - $queue->delete(); - return; + if ($this->verifyWPSubscriber($subscriber_id, $newsletter) === false) { + $queue->delete(); + return; + } } $queue->status = null; $queue->save(); @@ -95,14 +95,27 @@ class Scheduler { $new_queue->save(); } - private function verifyMailPoetSubscriber($subscriber_id, $newsletter) { + private function verifyMailPoetSubscriber($subscriber_id, $newsletter, $queue) { // check if subscriber is in proper segment $subscriber_in_segment = SubscriberSegment::where('subscriber_id', $subscriber_id) ->where('segment_id', $newsletter->segment) ->where('status', 'subscribed') ->findOne(); - return ($subscriber_in_segment) ? true : false; + if (!$subscriber_in_segment) { + $queue->delete(); + return false; + } + // check if subscriber is confirmed (subscribed) + $subscriber = $subscriber_in_segment->subscriber()->findOne(); + if ($subscriber->status !== 'subscribed') { + // reschedule delivery in 5 minutes + $scheduled_at = Carbon::createFromTimestamp(current_time('timestamp')); + $queue->scheduled_at = $scheduled_at->addMinutes(5); + $queue->save(); + return false; + } + return true; } private function verifyWPSubscriber($subscriber_id, $newsletter) { diff --git a/lib/Models/SubscriberSegment.php b/lib/Models/SubscriberSegment.php index 4555871e68..b6d35a8722 100644 --- a/lib/Models/SubscriberSegment.php +++ b/lib/Models/SubscriberSegment.php @@ -12,6 +12,10 @@ class SubscriberSegment extends Model { parent::__construct(); } + function subscriber() { + return $this->has_one(__NAMESPACE__.'\Subscriber', 'id'); + } + static function setSubscriptions($subscriber, $segment_ids = array()) { if($subscriber->id > 0) { // unsubscribe from current subscriptions diff --git a/lib/Newsletter/Scheduler/Scheduler.php b/lib/Newsletter/Scheduler/Scheduler.php index 7341d6e3f7..2ede28f150 100644 --- a/lib/Newsletter/Scheduler/Scheduler.php +++ b/lib/Newsletter/Scheduler/Scheduler.php @@ -120,11 +120,11 @@ class Scheduler { case 'weeks': $scheduled_at = $current_time->addWeeks($after_time_number); break; + default: + $scheduled_at = $current_time; } - if($scheduled_at) { - $queue->status = 'scheduled'; - $queue->scheduled_at = $scheduled_at; - } + $queue->status = 'scheduled'; + $queue->scheduled_at = $scheduled_at; $queue->save(); } } \ No newline at end of file