Refactor re-engagement scheduling code to more methods
[MAILPOET-3782]
This commit is contained in:
committed by
Veljko V
parent
3c5a368c2c
commit
bafb41c94e
@@ -2,7 +2,6 @@
|
|||||||
|
|
||||||
namespace MailPoet\Newsletter\Scheduler;
|
namespace MailPoet\Newsletter\Scheduler;
|
||||||
|
|
||||||
use MailPoet\Cron\Workers\ReEngagementEmailsScheduler;
|
|
||||||
use MailPoet\Entities\NewsletterEntity;
|
use MailPoet\Entities\NewsletterEntity;
|
||||||
use MailPoet\Entities\NewsletterOptionFieldEntity;
|
use MailPoet\Entities\NewsletterOptionFieldEntity;
|
||||||
use MailPoet\Entities\ScheduledTaskEntity;
|
use MailPoet\Entities\ScheduledTaskEntity;
|
||||||
@@ -10,8 +9,10 @@ use MailPoet\Entities\ScheduledTaskSubscriberEntity;
|
|||||||
use MailPoet\Entities\SendingQueueEntity;
|
use MailPoet\Entities\SendingQueueEntity;
|
||||||
use MailPoet\Entities\StatisticsNewsletterEntity;
|
use MailPoet\Entities\StatisticsNewsletterEntity;
|
||||||
use MailPoet\Entities\SubscriberEntity;
|
use MailPoet\Entities\SubscriberEntity;
|
||||||
|
use MailPoet\Entities\SubscriberSegmentEntity;
|
||||||
use MailPoet\Newsletter\NewslettersRepository;
|
use MailPoet\Newsletter\NewslettersRepository;
|
||||||
use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
|
use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
|
||||||
|
use MailPoet\Tasks\Sending;
|
||||||
use MailPoet\WP\Functions as WPFunctions;
|
use MailPoet\WP\Functions as WPFunctions;
|
||||||
use MailPoetVendor\Carbon\Carbon;
|
use MailPoetVendor\Carbon\Carbon;
|
||||||
use MailPoetVendor\Doctrine\DBAL\ParameterType;
|
use MailPoetVendor\Doctrine\DBAL\ParameterType;
|
||||||
@@ -73,27 +74,39 @@ class ReEngagementScheduler {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
$thresholdDate = Carbon::createFromTimestamp($this->wp->currentTime('timestamp'));
|
$scheduledTask = $this->scheduleTask($email);
|
||||||
if ($intervalUnit === 'months') {
|
$this->enqueueSubscribers($email, $scheduledTask, $intervalUnit, $intervalValue);
|
||||||
$thresholdDate->subMonths($intervalValue);
|
return $scheduledTask;
|
||||||
} else {
|
}
|
||||||
$thresholdDate->subWeeks($intervalValue);
|
|
||||||
}
|
private function scheduleTask(NewsletterEntity $email): ScheduledTaskEntity {
|
||||||
// Scheduled task
|
// Scheduled task
|
||||||
$scheduledTask = new ScheduledTaskEntity();
|
$scheduledTask = new ScheduledTaskEntity();
|
||||||
$scheduledTask->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED);
|
$scheduledTask->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED);
|
||||||
$scheduledTask->setScheduledAt(Carbon::createFromTimestamp($this->wp->currentTime('timestamp')));
|
$scheduledTask->setScheduledAt(Carbon::createFromTimestamp($this->wp->currentTime('timestamp')));
|
||||||
$scheduledTask->setType(ReEngagementEmailsScheduler::TASK_TYPE);
|
$scheduledTask->setType(Sending::TASK_TYPE);
|
||||||
|
$scheduledTask->setPriority(SendingQueueEntity::PRIORITY_MEDIUM);
|
||||||
$this->scheduledTasksRepository->persist($scheduledTask);
|
$this->scheduledTasksRepository->persist($scheduledTask);
|
||||||
|
|
||||||
// Sending queue
|
// Sending queue
|
||||||
$sendingQueue = new SendingQueueEntity();
|
$sendingQueue = new SendingQueueEntity();
|
||||||
$sendingQueue->setTask($scheduledTask);
|
$sendingQueue->setTask($scheduledTask);
|
||||||
$sendingQueue->setNewsletter($email);
|
$sendingQueue->setNewsletter($email);
|
||||||
$this->scheduledTasksRepository->persist($sendingQueue);
|
$this->scheduledTasksRepository->persist($sendingQueue);
|
||||||
$this->scheduledTasksRepository->flush();
|
$this->scheduledTasksRepository->flush();
|
||||||
|
return $scheduledTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finds subscribers that should receive re-engagement email and saves scheduled tasks subscribers
|
||||||
|
*/
|
||||||
|
private function enqueueSubscribers(NewsletterEntity $email, ScheduledTaskEntity $scheduledTask, string $intervalUnit, int $intervalValue) {
|
||||||
// Parameters for scheduled task subscribers query
|
// Parameters for scheduled task subscribers query
|
||||||
|
$thresholdDate = Carbon::createFromTimestamp($this->wp->currentTime('timestamp'));
|
||||||
|
if ($intervalUnit === 'months') {
|
||||||
|
$thresholdDate->subMonths($intervalValue);
|
||||||
|
} else {
|
||||||
|
$thresholdDate->subWeeks($intervalValue);
|
||||||
|
}
|
||||||
$taskId = $scheduledTask->getId();
|
$taskId = $scheduledTask->getId();
|
||||||
$subscribedStatus = SubscriberEntity::STATUS_SUBSCRIBED;
|
$subscribedStatus = SubscriberEntity::STATUS_SUBSCRIBED;
|
||||||
$thresholdDateSql = $thresholdDate->toDateTimeString();
|
$thresholdDateSql = $thresholdDate->toDateTimeString();
|
||||||
@@ -101,6 +114,7 @@ class ReEngagementScheduler {
|
|||||||
$segmentIds = $email->getSegmentIds();
|
$segmentIds = $email->getSegmentIds();
|
||||||
$newsletterStatsTable = $this->entityManager->getClassMetadata(StatisticsNewsletterEntity::class)->getTableName();
|
$newsletterStatsTable = $this->entityManager->getClassMetadata(StatisticsNewsletterEntity::class)->getTableName();
|
||||||
$scheduledTaskSubscribersTable = $this->entityManager->getClassMetadata(ScheduledTaskSubscriberEntity::class)->getTableName();
|
$scheduledTaskSubscribersTable = $this->entityManager->getClassMetadata(ScheduledTaskSubscriberEntity::class)->getTableName();
|
||||||
|
$subscriberSegmentTable = $this->entityManager->getClassMetadata(SubscriberSegmentEntity::class)->getTableName();
|
||||||
$subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
|
$subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
|
||||||
$nowSql = Carbon::createFromTimestamp($this->wp->currentTime('timestamp'))->toDateTimeString();
|
$nowSql = Carbon::createFromTimestamp($this->wp->currentTime('timestamp'))->toDateTimeString();
|
||||||
|
|
||||||
@@ -108,7 +122,7 @@ class ReEngagementScheduler {
|
|||||||
(subscriber_id, task_id, processed, created_at)
|
(subscriber_id, task_id, processed, created_at)
|
||||||
SELECT DISTINCT ns.subscriber_id as subscriber_id, :taskId as task_id, 0 as processed, :now as created_at FROM $newsletterStatsTable as ns
|
SELECT DISTINCT ns.subscriber_id as subscriber_id, :taskId as task_id, 0 as processed, :now as created_at FROM $newsletterStatsTable as ns
|
||||||
JOIN $subscribersTable s ON ns.subscriber_id = s.id AND s.deleted_at is NULL AND s.status = :subscribed AND GREATEST(COALESCE(s.created_at, '0'), COALESCE(s.last_subscribed_at, '0'), COALESCE(s.last_engagement_at, '0')) < :thresholdDate
|
JOIN $subscribersTable s ON ns.subscriber_id = s.id AND s.deleted_at is NULL AND s.status = :subscribed AND GREATEST(COALESCE(s.created_at, '0'), COALESCE(s.last_subscribed_at, '0'), COALESCE(s.last_engagement_at, '0')) < :thresholdDate
|
||||||
JOIN wp_mailpoet_subscriber_segment as ss ON ns.subscriber_id = ss.subscriber_id AND ss.segment_id IN (" . implode(',', $segmentIds) . ") AND ss.status = :subscribed
|
JOIN $subscriberSegmentTable as ss ON ns.subscriber_id = ss.subscriber_id AND ss.segment_id IN (" . implode(',', $segmentIds) . ") AND ss.status = :subscribed
|
||||||
WHERE ns.sent_at > :thresholdDate AND ns.subscriber_id NOT IN (SELECT DISTINCT subscriber_id as id FROM $newsletterStatsTable WHERE newsletter_id = :newsletterId AND sent_at > :thresholdDate);
|
WHERE ns.sent_at > :thresholdDate AND ns.subscriber_id NOT IN (SELECT DISTINCT subscriber_id as id FROM $newsletterStatsTable WHERE newsletter_id = :newsletterId AND sent_at > :thresholdDate);
|
||||||
";
|
";
|
||||||
|
|
||||||
@@ -120,6 +134,5 @@ class ReEngagementScheduler {
|
|||||||
$statement->bindParam('newsletterId', $newsletterId, ParameterType::INTEGER);
|
$statement->bindParam('newsletterId', $newsletterId, ParameterType::INTEGER);
|
||||||
|
|
||||||
$statement->executeQuery();
|
$statement->executeQuery();
|
||||||
return $scheduledTask;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -13,6 +13,7 @@ use MailPoet\Entities\SendingQueueEntity;
|
|||||||
use MailPoet\Entities\StatisticsNewsletterEntity;
|
use MailPoet\Entities\StatisticsNewsletterEntity;
|
||||||
use MailPoet\Entities\SubscriberEntity;
|
use MailPoet\Entities\SubscriberEntity;
|
||||||
use MailPoet\Entities\SubscriberSegmentEntity;
|
use MailPoet\Entities\SubscriberSegmentEntity;
|
||||||
|
use MailPoet\Tasks\Sending;
|
||||||
use MailPoet\Test\DataFactories\Newsletter;
|
use MailPoet\Test\DataFactories\Newsletter;
|
||||||
use MailPoet\Test\DataFactories\Segment;
|
use MailPoet\Test\DataFactories\Segment;
|
||||||
use MailPoet\Test\DataFactories\Subscriber;
|
use MailPoet\Test\DataFactories\Subscriber;
|
||||||
|
Reference in New Issue
Block a user