diff --git a/lib/API/JSON/v1/Newsletters.php b/lib/API/JSON/v1/Newsletters.php index c31835c932..12e7209e2a 100644 --- a/lib/API/JSON/v1/Newsletters.php +++ b/lib/API/JSON/v1/Newsletters.php @@ -65,70 +65,72 @@ class Newsletters extends APIEndpoint { $newsletter = Newsletter::createOrUpdate($data); $errors = $newsletter->getErrors(); - if(!empty($errors)) { - return $this->badRequest($errors); - } else { - if(!empty($segments)) { - NewsletterSegment::where('newsletter_id', $newsletter->id) - ->deleteMany(); + if(!empty($errors)) return $this->badRequest($errors); - foreach($segments as $segment) { - if(!is_array($segment)) continue; - $relation = NewsletterSegment::create(); - $relation->segment_id = (int)$segment['id']; - $relation->newsletter_id = $newsletter->id; - $relation->save(); + if(!empty($segments)) { + NewsletterSegment::where('newsletter_id', $newsletter->id) + ->deleteMany(); + foreach($segments as $segment) { + if(!is_array($segment)) continue; + $relation = NewsletterSegment::create(); + $relation->segment_id = (int)$segment['id']; + $relation->newsletter_id = $newsletter->id; + $relation->save(); + } + } + + if(!empty($options)) { + $option_fields = NewsletterOptionField::where( + 'newsletter_type', + $newsletter->type + )->findMany(); + // update newsletter options + foreach($option_fields as $option_field) { + if(isset($options[$option_field->name])) { + $newsletter_option = NewsletterOption::createOrUpdate( + array( + 'newsletter_id' => $newsletter->id, + 'option_field_id' => $option_field->id, + 'value' => $options[$option_field->name] + ) + ); } } - - if(!empty($options)) { - $option_fields = NewsletterOptionField::where( - 'newsletter_type', - $newsletter->type - )->findMany(); - - // update newsletter options - foreach($option_fields as $option_field) { - if(isset($options[$option_field->name])) { - $newsletter_option = NewsletterOption::createOrUpdate( - array( - 'newsletter_id' => $newsletter->id, - 'option_field_id' => $option_field->id, - 'value' => $options[$option_field->name] - ) - ); - } - } - - // reload newsletter with updated options - $newsletter = Newsletter::filter('filterWithOptions') - ->findOne($newsletter->id); - - // 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(); - } + // reload newsletter with updated options + $newsletter = Newsletter::filter('filterWithOptions') + ->findOne($newsletter->id); + // 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(); } + } - $queue = $newsletter->getQueue(); - if($queue) { + $queue = $newsletter->getQueue(); + if($queue) { + // if newsletter was previously scheduled and is now unscheduled, set its status to DRAFT and delete associated queue record + if($newsletter->status === Newsletter::STATUS_SCHEDULED && isset($options['isScheduled']) && empty($options['isScheduled'])) { + $queue->delete(); + $newsletter->status = Newsletter::STATUS_DRAFT; + $newsletter->save(); + } else { + $queue->newsletter_rendered_body = null; $queue->newsletter_rendered_body = null; $queue->newsletter_rendered_subject = null; $queue->save(); } - - Hooks::doAction('mailpoet_api_newsletters_save_after', $newsletter); - - return $this->successResponse($newsletter->asArray()); } + + Hooks::doAction('mailpoet_api_newsletters_save_after', $newsletter); + + return $this->successResponse($newsletter->asArray()); } function setStatus($data = array()) { diff --git a/tests/unit/API/JSON/v1/NewslettersTest.php b/tests/unit/API/JSON/v1/NewslettersTest.php index 70a65a3825..3f8b95f229 100644 --- a/tests/unit/API/JSON/v1/NewslettersTest.php +++ b/tests/unit/API/JSON/v1/NewslettersTest.php @@ -169,9 +169,9 @@ class NewslettersTest extends \MailPoetTest { $sending_queue = SendingQueue::create(); $sending_queue->newsletter_id = $this->newsletter->id; $sending_queue->status = SendingQueue::STATUS_SCHEDULED; - $sending_queue->newsletter_rendered_body = 'Rendered body ...'; - $sending_queue->newsletter_rendered_subject = 'Rendered subject ...'; + $sending_queue->newsletter_rendered_body = array('html' => 'html', 'text' => 'text'); $sending_queue->save(); + expect($sending_queue->getErrors())->false(); $router = new Newsletters(); $newsletter_data = array( @@ -771,6 +771,38 @@ class NewslettersTest extends \MailPoetTest { expect((boolean)$preview_link_data['preview'])->true(); } + function testItDeletesSendingQueueAndSetsNewsletterStatusToDraftWhenItIsUnscheduled() { + $newsletter = $this->newsletter; + $newsletter->status = Newsletter::STATUS_SCHEDULED; + $newsletter->save(); + expect($newsletter->getErrors())->false(); + + $sending_queue = SendingQueue::create(); + $sending_queue->newsletter_id = $newsletter->id; + $sending_queue->newsletter_rendered_body = array( + 'html' => 'html', + 'text' => 'text' + ); + $sending_queue->status = SendingQueue::STATUS_SCHEDULED; + $sending_queue->scheduled_at = Carbon::now()->format('Y-m-d H:i'); + $sending_queue->save(); + expect($sending_queue->getErrors())->false(); + + $newsletter_data = array( + 'id' => $newsletter->id, + 'options' => array( + 'isScheduled' => false + ) + ); + + $router = new Newsletters(); + $response = $router->save($newsletter_data); + $newsletter = Newsletter::findOne($newsletter->id); + $sending_queue = SendingQueue::findOne($sending_queue->id); + expect($newsletter->status)->equals(Newsletter::STATUS_DRAFT); + expect($sending_queue)->false(); + } + function _after() { WPHooksHelper::releaseAllHooks(); \ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);