Sending queue refactoring WIP [MAILPOET-903]

This commit is contained in:
stoletniy
2017-12-21 23:50:43 +03:00
parent bf8b0c81df
commit c0c57f6b67
17 changed files with 684 additions and 171 deletions

View File

@ -105,8 +105,8 @@ class Newsletters extends APIEndpoint {
$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)
SendingQueue::findTaskByNewsletterId($newsletter->id)
->where('tasks.status', SendingQueue::STATUS_SCHEDULED)
->findResultSet()
->set('scheduled_at', $next_run_date)
->save();
@ -166,7 +166,7 @@ class Newsletters extends APIEndpoint {
// if there are past due notifications, reschedule them for the next send date
if($newsletter->type === Newsletter::TYPE_NOTIFICATION && $status === Newsletter::STATUS_ACTIVE) {
$next_run_date = Scheduler::getNextRunDate($newsletter->schedule);
$newsletter->queue()
$newsletter->queue()->task()
->whereLte('scheduled_at', Carbon::createFromTimestamp(current_time('timestamp')))
->where('status', SendingQueue::STATUS_SCHEDULED)
->findResultSet()

View File

@ -8,9 +8,9 @@ use MailPoet\Config\AccessControl;
use MailPoet\Mailer\Mailer;
use MailPoet\Models\Newsletter;
use MailPoet\Models\SendingQueue as SendingQueueModel;
use MailPoet\Models\Subscriber;
use MailPoet\Newsletter\Scheduler\Scheduler;
use MailPoet\Segments\SubscribersFinder;
use MailPoet\Tasks\Sending as SendingTask;
use MailPoet\Util\Helpers;
if(!defined('ABSPATH')) exit;
@ -46,20 +46,22 @@ class SendingQueue extends APIEndpoint {
}
// add newsletter to the sending queue
$queue = SendingQueueModel::whereNull('status')
->where('newsletter_id', $newsletter->id)
->findOne();
$queue = SendingQueueModel::findTaskByNewsletterId($newsletter->id)
->whereNull('tasks.status')
->findOne();
if(!empty($queue)) {
return $this->errorResponse(array(
APIError::NOT_FOUND => __('This newsletter is already being sent.', 'mailpoet')
));
}
$queue = SendingQueueModel::where('newsletter_id', $newsletter->id)
->where('status', SendingQueueModel::STATUS_SCHEDULED)
$task = SendingQueueModel::findTaskByNewsletterId($newsletter->id)
->where('tasks.status', SendingQueueModel::STATUS_SCHEDULED)
->findOne();
if(!$queue) {
$queue = SendingQueueModel::create();
if($task) {
$queue = SendingTask::createFromTask($task);
} else {
$queue = SendingTask::create();
$queue->newsletter_id = $newsletter->id;
}
@ -72,8 +74,7 @@ class SendingQueue extends APIEndpoint {
$queue->scheduled_at = Scheduler::formatDatetimeString(
$newsletter->scheduledAt
);
$queue->subscribers = null;
$queue->count_total = $queue->count_to_process = 0;
$queue->removeAllSubscribers();
} else {
$segments = $newsletter->segments()->findArray();
$finder = new SubscribersFinder();
@ -86,12 +87,7 @@ class SendingQueue extends APIEndpoint {
}
$queue->status = null;
$queue->scheduled_at = null;
$queue->subscribers = serialize(
array(
'to_process' => $subscribers
)
);
$queue->count_total = $queue->count_to_process = count($subscribers);
$queue->setSubscribers($subscribers);
// set newsletter status
$newsletter->setStatus(Newsletter::STATUS_SENDING);