Sets newsletter status to draft when it's unscheduled

This commit is contained in:
Vlad
2017-09-19 21:59:03 -04:00
parent 28c75c5b96
commit 6b16aa1692
2 changed files with 90 additions and 56 deletions

View File

@ -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()) {

View File

@ -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);