Prevents repeat subscription confirmation

Prevents scheduling of duplicate welcome notifications
This commit is contained in:
Vlad
2017-07-05 19:50:57 -04:00
parent 11bbf54aad
commit 89da4c9aae
4 changed files with 35 additions and 3 deletions

View File

@ -73,6 +73,10 @@ class Scheduler {
}
static function createWelcomeNotificationQueue($newsletter, $subscriber_id) {
$previously_scheduled_notification = SendingQueue::where('newsletter_id', $newsletter->id)
->whereLike('subscribers', '%' . serialize(array($subscriber_id)) . '%')
->findOne();
if(!empty($previously_scheduled_notification)) return;
$queue = SendingQueue::create();
$queue->newsletter_id = $newsletter->id;
$queue->subscribers = serialize(

View File

@ -57,7 +57,7 @@ class Pages {
}
function confirm() {
if($this->subscriber === false) {
if($this->subscriber === false || $this->subscriber->status === Subscriber::STATUS_SUBSCRIBED) {
return false;
}
@ -205,7 +205,6 @@ class Pages {
}
}
private function getConfirmContent() {
if($this->isPreview() || $this->subscriber !== false) {
return __("Yup, we've added you to our email list. You'll hear from us shortly.", 'mailpoet');

View File

@ -10,7 +10,7 @@ use MailPoet\Models\SendingQueue;
use MailPoet\Newsletter\Scheduler\Scheduler;
class NewsletterSchedulerTest extends MailPoetTest {
function testItSetsConstants() {
function testItSetsConstants() {
expect(Scheduler::SECONDS_IN_HOUR)->notEmpty();
expect(Scheduler::LAST_WEEKDAY_FORMAT)->notEmpty();
expect(Scheduler::WORDPRESS_ALL_ROLES)->notEmpty();
@ -63,6 +63,27 @@ class NewsletterSchedulerTest extends MailPoetTest {
expect(SendingQueue::findMany())->count(1);
}
function testItDoesNotCreateDuplicateWelcomeNotificationQueueRecords() {
$newsletter = (object)array(
'id' => 1,
'afterTimeNumber' => 2,
'afterTimeType' => 'hours'
);
$existing_subscriber = 678;
$existing_queue = SendingQueue::create();
$existing_queue->newsletter_id = $newsletter->id;
$existing_queue->subscribers = array('to_process' => array($existing_subscriber));
$existing_queue->save();
// queue is not scheduled
Scheduler::createWelcomeNotificationQueue($newsletter, $existing_subscriber);
expect(SendingQueue::findMany())->count(1);
// queue is not scheduled
Scheduler::createWelcomeNotificationQueue($newsletter, 1);
expect(SendingQueue::findMany())->count(2);
}
function testItCreatesWelcomeNotificationQueueRecord() {
$newsletter = (object)array(
'id' => 1,

View File

@ -27,6 +27,14 @@ class PagesTest extends MailPoetTest {
expect($confirmed_subscriber->status)->equals(Subscriber::STATUS_SUBSCRIBED);
}
function testItDoesNotConfirmSubscriptionOnDuplicateAttempt() {
$subscriber = $this->subscriber;
$subscriber->status = Subscriber::STATUS_SUBSCRIBED;
$subscriber->save();
$subscription = new Pages($action = false, $this->data);
expect($subscription->confirm())->false();
}
function testItSendsWelcomeNotificationUponConfirmingSubscription() {
// create segment
$segment = Segment::create();