Pause sending tasks for inactive notifications
[MAILPOET-1376]
This commit is contained in:
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user