diff --git a/lib/API/Endpoints/Newsletters.php b/lib/API/Endpoints/Newsletters.php index c7aa28ef75..ee8d302c86 100644 --- a/lib/API/Endpoints/Newsletters.php +++ b/lib/API/Endpoints/Newsletters.php @@ -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()); @@ -433,4 +445,4 @@ class Newsletters extends APIEndpoint { ); } } -} +} \ No newline at end of file diff --git a/lib/Newsletter/Scheduler/Scheduler.php b/lib/Newsletter/Scheduler/Scheduler.php index c10a7f4db3..3fe0381106 100644 --- a/lib/Newsletter/Scheduler/Scheduler.php +++ b/lib/Newsletter/Scheduler/Scheduler.php @@ -157,6 +157,7 @@ class Scheduler { } $relation->value = $schedule; $relation->save(); + return $relation->value; } static function getNextRunDate($schedule) { diff --git a/tests/unit/API/Endpoints/NewslettersTest.php b/tests/unit/API/Endpoints/NewslettersTest.php index abf9f260c4..2ab9e11c17 100644 --- a/tests/unit/API/Endpoints/NewslettersTest.php +++ b/tests/unit/API/Endpoints/NewslettersTest.php @@ -1,4 +1,5 @@ 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); } }