Pause sending tasks for inactive notifications

[MAILPOET-1376]
This commit is contained in:
Pavel Dohnal
2018-05-15 16:40:31 +01:00
parent d44c275790
commit 941b88495a
6 changed files with 134 additions and 0 deletions

View File

@ -325,6 +325,12 @@ class Newsletter extends Model {
$this->set('status', $status);
$this->save();
}
if(($status === self::STATUS_DRAFT) && ($this->type === self::TYPE_NOTIFICATION)) {
ScheduledTask::pauseAllByNewsletter($this);
}
if(($status === self::STATUS_ACTIVE) && ($this->type === self::TYPE_NOTIFICATION)) {
ScheduledTask::setScheduledAllByNewsletter($this);
}
return $this;
}

View File

@ -30,12 +30,35 @@ class ScheduledTask extends Model {
return ($this->getErrors() === false && $this->id() > 0);
}
static function pauseAllByNewsletter(Newsletter $newsletter) {
ScheduledTask::rawExecute(
'UPDATE `' . ScheduledTask::$_table . '` t ' .
'JOIN `' . SendingQueue::$_table . '` q ON t.`id` = q.`task_id` ' .
'SET t.`status` = "' . self::STATUS_PAUSED . '" ' .
'WHERE ' .
'q.`newsletter_id` = ' . $newsletter->id() .
' AND t.`status` = "' . self::STATUS_SCHEDULED . '" '
);
}
function resume() {
$this->setExpr('status', 'NULL');
$this->save();
return ($this->getErrors() === false && $this->id() > 0);
}
static function setScheduledAllByNewsletter(Newsletter $newsletter) {
ScheduledTask::rawExecute(
'UPDATE `' . ScheduledTask::$_table . '` t ' .
'JOIN `' . SendingQueue::$_table . '` q ON t.`id` = q.`task_id` ' .
'SET t.`status` = "' . self::STATUS_SCHEDULED . '" ' .
'WHERE ' .
'q.`newsletter_id` = ' . $newsletter->id() .
' AND t.`status` = "' . self::STATUS_PAUSED . '" ' .
' AND t.`scheduled_at` > NOW()'
);
}
function complete() {
$this->processed_at = WPFunctions::currentTime('mysql');
$this->set('status', self::STATUS_COMPLETED);

View File

@ -226,6 +226,7 @@ class Sending {
$tasks = ScheduledTask::where('status', ScheduledTask::STATUS_SCHEDULED)
->whereLte('scheduled_at', Carbon::createFromTimestamp(WPFunctions::currentTime('timestamp')))
->where('type', 'sending')
->whereNotEqual('status', ScheduledTask::STATUS_PAUSED)
->limit($amount)
->findMany();
$result = array();

View File

@ -1,6 +1,7 @@
<?php
namespace MailPoet\Test\Models;
use Carbon\Carbon;
use MailPoet\Models\Newsletter;
use MailPoet\Models\Segment;
use MailPoet\Models\Subscriber;
@ -839,6 +840,38 @@ class NewsletterTest extends \MailPoetTest {
expect($result[1]->id)->equals($newsletter_2->id);
}
function testPauseTaskWhenDisablePostNotification() {
$newsletter = Newsletter::createOrUpdate(array(
'type' => Newsletter::TYPE_NOTIFICATION
));
$task = ScheduledTask::createOrUpdate(array('status' => ScheduledTask::STATUS_SCHEDULED));
SendingQueue::createOrUpdate(array(
'newsletter_id' => $newsletter->id(),
'task_id' => $task->id(),
));
$newsletter->setStatus(Newsletter::STATUS_DRAFT);
$task_found = ScheduledTask::findOne($task->id());
expect($task_found->status)->equals(ScheduledTask::STATUS_PAUSED);
}
function testUnPauseTaskWhenEnablePostNotification() {
$newsletter = Newsletter::createOrUpdate(array(
'type' => Newsletter::TYPE_NOTIFICATION
));
$task = ScheduledTask::createOrUpdate(array(
'status' => ScheduledTask::STATUS_PAUSED,
'scheduled_at' => Carbon::createFromTimestamp(current_time('timestamp'))->addDays(10)->format('Y-m-d H:i:s'),
));
SendingQueue::createOrUpdate(array(
'newsletter_id' => $newsletter->id(),
'task_id' => $task->id(),
));
$newsletter->setStatus(Newsletter::STATUS_ACTIVE);
$task_found = ScheduledTask::findOne($task->id());
expect($task_found->status)->equals(ScheduledTask::STATUS_SCHEDULED);
}
function _after() {
\ORM::raw_execute('TRUNCATE ' . NewsletterOption::$_table);
\ORM::raw_execute('TRUNCATE ' . Newsletter::$_table);

View File

@ -1,7 +1,10 @@
<?php
namespace MailPoet\Test\Models;
use Carbon\Carbon;
use MailPoet\Models\Newsletter;
use MailPoet\Models\ScheduledTask;
use MailPoet\Models\SendingQueue;
class ScheduledTaskTest extends \MailPoetTest {
function _before() {
@ -21,6 +24,68 @@ class ScheduledTaskTest extends \MailPoetTest {
expect($this->task->priority)->equals(ScheduledTask::PRIORITY_MEDIUM);
}
function testItUnPauseAllByNewsletters() {
$newsletter = Newsletter::createOrUpdate(array(
'type' => Newsletter::TYPE_NOTIFICATION
));
$task1 = ScheduledTask::createOrUpdate(array(
'status' => ScheduledTask::STATUS_PAUSED,
'scheduled_at' => Carbon::createFromTimestamp(current_time('timestamp'))->addDays(10)->format('Y-m-d H:i:s'),
));
$task2 = ScheduledTask::createOrUpdate(array(
'status' => ScheduledTask::STATUS_COMPLETED,
'scheduled_at' => Carbon::createFromTimestamp(current_time('timestamp'))->addDays(10)->format('Y-m-d H:i:s'),
));
$task3 = ScheduledTask::createOrUpdate(array(
'status' => ScheduledTask::STATUS_PAUSED,
'scheduled_at' => Carbon::createFromTimestamp(current_time('timestamp'))->subDays(10)->format('Y-m-d H:i:s'),
));
SendingQueue::createOrUpdate(array(
'newsletter_id' => $newsletter->id(),
'task_id' => $task1->id(),
));
SendingQueue::createOrUpdate(array(
'newsletter_id' => $newsletter->id(),
'task_id' => $task2->id(),
));
SendingQueue::createOrUpdate(array(
'newsletter_id' => $newsletter->id(),
'task_id' => $task3->id(),
));
ScheduledTask::setScheduledAllByNewsletter($newsletter);
$task1_found = ScheduledTask::findOne($task1->id());
expect($task1_found->status)->equals(ScheduledTask::STATUS_SCHEDULED);
$task2_found = ScheduledTask::findOne($task2->id());
expect($task2_found->status)->equals(ScheduledTask::STATUS_COMPLETED);
$task3_found = ScheduledTask::findOne($task3->id());
expect($task3_found->status)->equals(ScheduledTask::STATUS_PAUSED);
}
function testItPauseAllByNewsletters() {
$newsletter = Newsletter::createOrUpdate(array(
'type' => Newsletter::TYPE_NOTIFICATION
));
$task1 = ScheduledTask::createOrUpdate(array(
'status' => ScheduledTask::STATUS_COMPLETED,
));
$task2 = ScheduledTask::createOrUpdate(array(
'status' => ScheduledTask::STATUS_SCHEDULED,
));
SendingQueue::createOrUpdate(array(
'newsletter_id' => $newsletter->id(),
'task_id' => $task1->id(),
));
SendingQueue::createOrUpdate(array(
'newsletter_id' => $newsletter->id(),
'task_id' => $task2->id(),
));
ScheduledTask::pauseAllByNewsletter($newsletter);
$task1_found = ScheduledTask::findOne($task1->id());
expect($task1_found->status)->equals(ScheduledTask::STATUS_COMPLETED);
$task2_found = ScheduledTask::findOne($task2->id());
expect($task2_found->status)->equals(ScheduledTask::STATUS_PAUSED);
}
function _after() {
\ORM::raw_execute('TRUNCATE ' . ScheduledTask::$_table);
}

View File

@ -145,6 +145,12 @@ class SendingTest extends \MailPoetTest {
expect(SendingTask::getScheduledQueues($amount))->count($amount);
}
function testItDoesNotGetPaused() {
$this->_after();
$this->createNewSendingTask(['status' => ScheduledTask::STATUS_PAUSED]);
expect(SendingTask::getScheduledQueues())->count(0);
}
function testItGetsRunningQueues() {
$this->sending->status = null;
$this->sending->scheduled_at = Carbon::createFromTimestamp(current_time('timestamp'))->subHours(1);