Add per-subscriber rescheduling functionality for automatic emails

[PREMIUM-121]
This commit is contained in:
Jan Jakeš
2019-06-25 11:32:28 +02:00
committed by M. Shull
parent 440ed0aa23
commit dc5fa12b8e
2 changed files with 70 additions and 5 deletions

View File

@ -138,4 +138,20 @@ class ScheduledTask extends Model {
'WHERE `id` IN (' . join(',', $ids) . ')' 'WHERE `id` IN (' . join(',', $ids) . ')'
); );
} }
/**
* @return ScheduledTask|null
*/
static function findOneScheduledByNewsletterIdAndSubscriberId($newsletter_id, $subscriber_id) {
return ScheduledTask::tableAlias('tasks')
->select('tasks.*')
->innerJoin(SendingQueue::$_table, 'queues.task_id = tasks.id', 'queues')
->innerJoin(ScheduledTaskSubscriber::$_table, 'task_subscribers.task_id = tasks.id', 'task_subscribers')
->where('queues.newsletter_id', $newsletter_id)
->where('tasks.status', ScheduledTask::STATUS_SCHEDULED)
->where('task_subscribers.subscriber_id', $subscriber_id)
->whereNull('queues.deleted_at')
->whereNull('tasks.deleted_at')
->findOne() ?: null;
}
} }

View File

@ -9,6 +9,7 @@ use MailPoet\Models\NewsletterOption;
use MailPoet\Models\NewsletterOptionField; use MailPoet\Models\NewsletterOptionField;
use MailPoet\Models\NewsletterPost; use MailPoet\Models\NewsletterPost;
use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTask;
use MailPoet\Models\ScheduledTaskSubscriber;
use MailPoet\Models\SendingQueue; use MailPoet\Models\SendingQueue;
use MailPoet\Tasks\Sending as SendingTask; use MailPoet\Tasks\Sending as SendingTask;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
@ -82,6 +83,46 @@ class Scheduler {
} }
} }
static function scheduleOrRescheduleAutomaticEmail($group, $event, $subscriber_id, $meta = false, $time_offset = 0) {
$newsletters = self::getNewsletters(Newsletter::TYPE_AUTOMATIC, $group);
if (empty($newsletters)) {
return false;
}
foreach ($newsletters as $newsletter) {
if ($newsletter->event !== $event) {
continue;
}
// try to find existing scheduled task for given subscriber
$task = ScheduledTask::findOneScheduledByNewsletterIdAndSubscriberId($newsletter->id, $subscriber_id);
if ($task) {
self::rescheduleAutomaticEmailSendingTask($newsletter, $task, $time_offset);
} else {
self::createAutomaticEmailSendingTask($newsletter, $subscriber_id, $meta, $time_offset);
}
}
}
static function rescheduleAutomaticEmail($group, $event, $subscriber_id, $time_offset = 0) {
$newsletters = self::getNewsletters(Newsletter::TYPE_AUTOMATIC, $group);
if (empty($newsletters)) {
return false;
}
foreach ($newsletters as $newsletter) {
if ($newsletter->event !== $event) {
continue;
}
// try to find existing scheduled task for given subscriber
$task = ScheduledTask::findOneScheduledByNewsletterIdAndSubscriberId($newsletter->id, $subscriber_id);
if ($task) {
self::rescheduleAutomaticEmailSendingTask($newsletter, $task, $time_offset);
}
}
}
static function scheduleWPUserWelcomeNotification( static function scheduleWPUserWelcomeNotification(
$subscriber_id, $subscriber_id,
$wp_user, $wp_user,
@ -128,7 +169,7 @@ class Scheduler {
return $sending_task->save(); return $sending_task->save();
} }
static function createAutomaticEmailSendingTask($newsletter, $subscriber_id, $meta) { static function createAutomaticEmailSendingTask($newsletter, $subscriber_id, $meta, $time_offset = 0) {
$sending_task = SendingTask::create(); $sending_task = SendingTask::create();
$sending_task->newsletter_id = $newsletter->id; $sending_task->newsletter_id = $newsletter->id;
if ($newsletter->sendTo === 'user' && $subscriber_id) { if ($newsletter->sendTo === 'user' && $subscriber_id) {
@ -139,13 +180,21 @@ class Scheduler {
} }
$sending_task->status = SendingQueue::STATUS_SCHEDULED; $sending_task->status = SendingQueue::STATUS_SCHEDULED;
$sending_task->priority = SendingQueue::PRIORITY_MEDIUM; $sending_task->priority = SendingQueue::PRIORITY_MEDIUM;
$sending_task->scheduled_at = self::getScheduledTimeWithDelay(
$newsletter->afterTimeType, $scheduled_at = self::getScheduledTimeWithDelay($newsletter->afterTimeType, $newsletter->afterTimeNumber);
$newsletter->afterTimeNumber $scheduled_at->addSeconds($time_offset);
); $sending_task->scheduled_at = $scheduled_at;
return $sending_task->save(); return $sending_task->save();
} }
static function rescheduleAutomaticEmailSendingTask($newsletter, $task, $time_offset = 0) {
// compute new 'scheduled_at' from now
$scheduled_at = self::getScheduledTimeWithDelay($newsletter->afterTimeType, $newsletter->afterTimeNumber);
$scheduled_at->addSeconds($time_offset);
$task->scheduled_at = $scheduled_at;
$task->save();
}
static function createPostNotificationSendingTask($newsletter) { static function createPostNotificationSendingTask($newsletter) {
$existing_notification_history = Newsletter::tableAlias('newsletters') $existing_notification_history = Newsletter::tableAlias('newsletters')
->where('newsletters.parent_id', $newsletter->id) ->where('newsletters.parent_id', $newsletter->id)