Reschedules previously scheduled sending queues when post notification's
scheduling options change
This commit is contained in:
@ -4,6 +4,7 @@ namespace MailPoet\API\Endpoints;
|
||||
use MailPoet\API\Endpoint as APIEndpoint;
|
||||
use MailPoet\API\Error as APIError;
|
||||
use MailPoet\Listing;
|
||||
use MailPoet\Models\SendingQueue;
|
||||
use MailPoet\Models\Setting;
|
||||
use MailPoet\Models\Newsletter;
|
||||
use MailPoet\Models\NewsletterTemplate;
|
||||
@ -75,6 +76,7 @@ class Newsletters extends APIEndpoint {
|
||||
$newsletter->type
|
||||
)->findMany();
|
||||
|
||||
// update newsletter options
|
||||
foreach($option_fields as $option_field) {
|
||||
if(isset($options[$option_field->name])) {
|
||||
$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($newsletter->type === Newsletter::TYPE_NOTIFICATION) {
|
||||
Scheduler::processPostNotificationSchedule($newsletter);
|
||||
// if this is a post notification, process newsletter options and update its schedule
|
||||
if($newsletter->type === Newsletter::TYPE_NOTIFICATION) {
|
||||
// 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());
|
||||
|
@ -157,6 +157,7 @@ class Scheduler {
|
||||
}
|
||||
$relation->value = $schedule;
|
||||
$relation->save();
|
||||
return $relation->value;
|
||||
}
|
||||
|
||||
static function getNextRunDate($schedule) {
|
||||
|
@ -1,4 +1,5 @@
|
||||
<?php
|
||||
use Carbon\Carbon;
|
||||
use Codeception\Util\Fixtures;
|
||||
use Codeception\Util\Stub;
|
||||
use MailPoet\API\Endpoints\Newsletters;
|
||||
@ -7,6 +8,7 @@ use MailPoet\Models\Newsletter;
|
||||
use MailPoet\Models\NewsletterOptionField;
|
||||
use MailPoet\Models\NewsletterSegment;
|
||||
use MailPoet\Models\Segment;
|
||||
use MailPoet\Models\SendingQueue;
|
||||
use MailPoet\Newsletter\Scheduler\Scheduler;
|
||||
use MailPoet\Newsletter\Url;
|
||||
use MailPoet\Router\Router;
|
||||
@ -142,6 +144,61 @@ class NewslettersTest extends MailPoetTest {
|
||||
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() {
|
||||
$segment_1 = Segment::createOrUpdate(array('name' => 'Segment 1'));
|
||||
$fake_segment_id = 1;
|
||||
@ -557,9 +614,10 @@ class NewslettersTest extends MailPoetTest {
|
||||
}
|
||||
|
||||
function _after() {
|
||||
Newsletter::deleteMany();
|
||||
NewsletterSegment::deleteMany();
|
||||
NewsletterOptionField::deleteMany();
|
||||
Segment::deleteMany();
|
||||
ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . NewsletterSegment::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . NewsletterOptionField::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . Segment::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . SendingQueue::$_table);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user