Reschedules previously scheduled sending queues when post notification's

scheduling options change
This commit is contained in:
Vlad
2017-03-07 17:47:13 -05:00
parent 3a9db95c37
commit b590586d4c
3 changed files with 81 additions and 10 deletions

View File

@ -4,6 +4,7 @@ namespace MailPoet\API\Endpoints;
use MailPoet\API\Endpoint as APIEndpoint; use MailPoet\API\Endpoint as APIEndpoint;
use MailPoet\API\Error as APIError; use MailPoet\API\Error as APIError;
use MailPoet\Listing; use MailPoet\Listing;
use MailPoet\Models\SendingQueue;
use MailPoet\Models\Setting; use MailPoet\Models\Setting;
use MailPoet\Models\Newsletter; use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterTemplate; use MailPoet\Models\NewsletterTemplate;
@ -75,6 +76,7 @@ class Newsletters extends APIEndpoint {
$newsletter->type $newsletter->type
)->findMany(); )->findMany();
// update newsletter options
foreach($option_fields as $option_field) { foreach($option_fields as $option_field) {
if(isset($options[$option_field->name])) { if(isset($options[$option_field->name])) {
$newsletter_option = NewsletterOption::createOrUpdate( $newsletter_option = NewsletterOption::createOrUpdate(
@ -86,13 +88,23 @@ class Newsletters extends APIEndpoint {
); );
} }
} }
}
$newsletter = Newsletter::filter('filterWithOptions')->findOne($newsletter->id); // reload newsletter with updated options
$newsletter = Newsletter::filter('filterWithOptions')
->findOne($newsletter->id);
// if this is a post notification, process options and update its schedule // if this is a post notification, process newsletter options and update its schedule
if($newsletter->type === Newsletter::TYPE_NOTIFICATION) { if($newsletter->type === Newsletter::TYPE_NOTIFICATION) {
Scheduler::processPostNotificationSchedule($newsletter); // generate the new schedule from options and get the new "next run" date
$newsletter->schedule = Scheduler::processPostNotificationSchedule($newsletter);
$next_run_date = Scheduler::getNextRunDate($newsletter->schedule);
// find previously scheduled jobs and reschedule them using the new "next run" date
SendingQueue::where('newsletter_id', $newsletter->id)
->where('status', SendingQueue::STATUS_SCHEDULED)
->findResultSet()
->set('scheduled_at', $next_run_date)
->save();
}
} }
return $this->successResponse($newsletter->asArray()); return $this->successResponse($newsletter->asArray());

View File

@ -157,6 +157,7 @@ class Scheduler {
} }
$relation->value = $schedule; $relation->value = $schedule;
$relation->save(); $relation->save();
return $relation->value;
} }
static function getNextRunDate($schedule) { static function getNextRunDate($schedule) {

View File

@ -1,4 +1,5 @@
<?php <?php
use Carbon\Carbon;
use Codeception\Util\Fixtures; use Codeception\Util\Fixtures;
use Codeception\Util\Stub; use Codeception\Util\Stub;
use MailPoet\API\Endpoints\Newsletters; use MailPoet\API\Endpoints\Newsletters;
@ -7,6 +8,7 @@ use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\NewsletterOptionField;
use MailPoet\Models\NewsletterSegment; use MailPoet\Models\NewsletterSegment;
use MailPoet\Models\Segment; use MailPoet\Models\Segment;
use MailPoet\Models\SendingQueue;
use MailPoet\Newsletter\Scheduler\Scheduler; use MailPoet\Newsletter\Scheduler\Scheduler;
use MailPoet\Newsletter\Url; use MailPoet\Newsletter\Url;
use MailPoet\Router\Router; use MailPoet\Router\Router;
@ -142,6 +144,61 @@ class NewslettersTest extends MailPoetTest {
expect($saved_newsletter->schedule)->equals('* * * * *'); expect($saved_newsletter->schedule)->equals('* * * * *');
} }
function testItCanReschedulePreviouslyScheduledSendingQueueJobs() {
// create newsletter options
$newsletter_options = array(
'intervalType',
'timeOfDay',
'weekDay',
'monthDay',
'nthWeekDay',
'schedule'
);
foreach($newsletter_options as $option) {
$newsletter_option_field = NewsletterOptionField::create();
$newsletter_option_field->name = $option;
$newsletter_option_field->newsletter_type = Newsletter::TYPE_NOTIFICATION;
$newsletter_option_field->save();
}
// create sending queues
$current_time = Carbon::now();
$sending_queue_1 = SendingQueue::create();
$sending_queue_1->newsletter_id = 1;
$sending_queue_1->status = SendingQueue::STATUS_SCHEDULED;
$sending_queue_1->scheduled_at = $current_time;
$sending_queue_1->save();
$sending_queue_2 = SendingQueue::create();
$sending_queue_2->newsletter_id = 1;
$sending_queue_2->save();
// save newsletter via router
$router = new Newsletters();
$newsletter_data = array(
'id' => 1,
'type' => Newsletter::TYPE_NOTIFICATION,
'subject' => 'Newsletter',
'options' => array(
// weekly on Monday @ 7am
'intervalType' => Scheduler::INTERVAL_WEEKLY,
'timeOfDay' => '25200',
'weekDay' => '1',
'monthDay' => '0',
'nthWeekDay' => '1',
'schedule' => '0 7 * * 1'
)
);
$newsletter = $router->save($newsletter_data);
$sending_queue_1 = SendingQueue::findOne($sending_queue_1->id);
$sending_queue_2 = SendingQueue::findOne($sending_queue_2->id);
expect($sending_queue_1->scheduled_at)->notEquals($current_time);
expect($sending_queue_1->scheduled_at)->equals(
Scheduler::getNextRunDate($newsletter->data['schedule'])
);
expect($sending_queue_2->scheduled_at)->null();
}
function testItCanModifySegmentsOfExistingNewsletter() { function testItCanModifySegmentsOfExistingNewsletter() {
$segment_1 = Segment::createOrUpdate(array('name' => 'Segment 1')); $segment_1 = Segment::createOrUpdate(array('name' => 'Segment 1'));
$fake_segment_id = 1; $fake_segment_id = 1;
@ -557,9 +614,10 @@ class NewslettersTest extends MailPoetTest {
} }
function _after() { function _after() {
Newsletter::deleteMany(); ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);
NewsletterSegment::deleteMany(); ORM::raw_execute('TRUNCATE ' . NewsletterSegment::$_table);
NewsletterOptionField::deleteMany(); ORM::raw_execute('TRUNCATE ' . NewsletterOptionField::$_table);
Segment::deleteMany(); ORM::raw_execute('TRUNCATE ' . Segment::$_table);
ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table);
} }
} }