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\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());
|
||||||
@ -433,4 +445,4 @@ class Newsletters extends APIEndpoint {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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) {
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user