- Adds queue rescheduling for post notifications

This commit is contained in:
Vlad
2016-05-18 14:33:55 -04:00
parent 5a03eb9a17
commit 2784bb7282
3 changed files with 42 additions and 12 deletions

View File

@@ -66,19 +66,34 @@ class Scheduler {
}
function processPostNotificationNewsletter($newsletter, $queue) {
$immediate_interval =
\MailPoet\Newsletter\Scheduler\Scheduler::INTERVAL_IMMEDIATELY;
$segments = unserialize($newsletter->segments);
if(empty($segments)) {
if(empty($segments) && $newsletter->intervalType === $immediate_interval) {
$queue->delete();
return;
} else {
self::updateQueueNextRunDate($queue, $newsletter);
return;
}
$subscribers = Subscriber::getSubscribedInSegments($segments)
->findArray();
$subscribers = Helpers::arrayColumn($subscribers, 'subscriber_id');
$subscribers = array_unique($subscribers);
if(empty($subscribers)) {
if(empty($subscribers) && $newsletter->intervalType === $immediate_interval) {
$queue->delete();
return;
} else {
self::updateQueueNextRunDate($queue, $newsletter);
return;
}
// schedule new queue if the post notification is not destined for immediate delivery
if ($newsletter->intervalType !== $immediate_interval) {
$new_queue = clone($queue);
$new_queue->scheduled_at = self::updateQueueNextRunDate($new_queue, $newsletter);
$new_queue->save();
}
$new_scheduled_queue = SendingQueue::create();
$queue->subscribers = serialize(
array(
'to_process' => $subscribers
@@ -152,4 +167,11 @@ class Scheduler {
}
return true;
}
private function updateQueueNextRunDate($queue, $newsletter) {
$next_run_date =
\MailPoet\Newsletter\Scheduler\Scheduler::getNextRunDate($newsletter->schedule);
$queue->scheduled_at = $next_run_date;
$queue->save();
}
}

View File

@@ -23,6 +23,7 @@ class SendingQueue {
private $timer;
const BATCH_SIZE = 50;
const DIVIDER = '***MailPoet***';
const STATUS_COMPLETED = 'completed';
function __construct($timer = false) {
$this->mta_config = $this->getMailerConfig();
@@ -320,7 +321,7 @@ class SendingQueue {
$queue->count_processed + $queue->count_to_process;
if(!$queue->count_to_process) {
$queue->processed_at = current_time('mysql');
$queue->status = 'completed';
$queue->status = self::STATUS_COMPLETED;
}
$queue->subscribers = serialize((array) $queue->subscribers);
$queue->save();

View File

@@ -12,6 +12,13 @@ class Scheduler {
const SECONDS_IN_HOUR = 3600;
const LAST_WEEKDAY_FORMAT = 'L';
const WORDPRESS_ALL_ROLES = 'mailpoet_all';
const INTERVAL_IMMEDIATELY = 'immediately';
const INTERVAL_IMMEDIATE = 'immediate';
const INTERVAL_DAILY = 'daily';
const INTERVAL_WEEKLY = 'weekly';
const INTERVAL_MONTHLY = 'monthly';
const INTERVAL_NTHWEEKDAY = 'nthWeekDay';
const STATUS_SCHEDULED = 'scheduled';
static function processPostNotificationSchedule($newsletter_id) {
$newsletter = Newsletter::filter('filterWithOptions')
@@ -26,22 +33,22 @@ class Scheduler {
$newsletter['nthWeekDay'] :
'#' . $newsletter['nthWeekDay'];
switch($interval_type) {
case 'immediately':
case self::INTERVAL_IMMEDIATELY:
$schedule = '* * * * *';
break;
case 'immediate':
case 'daily':
case self::INTERVAL_IMMEDIATE:
case self::INTERVAL_DAILY:
$schedule = sprintf('0 %s * * *', $hour);
break;
case 'weekly':
case self::INTERVAL_WEEKLY:
$schedule = sprintf('0 %s * * %s', $hour, $week_day);
break;
case 'monthly':
$schedule = sprintf('0 %s %s * *', $hour, $month_day);
break;
case 'nthWeekDay':
case self::INTERVAL_NTHWEEKDAY:
$schedule = sprintf('0 %s ? * %s%s', $hour, $week_day, $nth_week_day);
break;
case self::INTERVAL_MONTHLY:
$schedule = sprintf('0 %s %s * *', $hour, $month_day);
break;
}
$option_field = NewsletterOptionField::where('name', 'schedule')
->findOne()
@@ -157,7 +164,7 @@ class Scheduler {
default:
$scheduled_at = $current_time;
}
$queue->status = 'scheduled';
$queue->status = self::STATUS_SCHEDULED;
$queue->scheduled_at = $scheduled_at;
$queue->save();
}