Update queue counts or delete scheduled task

[MAILPOET-3782]
This commit is contained in:
Rostislav Wolny
2021-10-06 10:35:29 +02:00
committed by Veljko V
parent bafb41c94e
commit 9aae441d99
2 changed files with 39 additions and 9 deletions

View File

@@ -75,11 +75,20 @@ class ReEngagementScheduler {
}
$scheduledTask = $this->scheduleTask($email);
$this->enqueueSubscribers($email, $scheduledTask, $intervalUnit, $intervalValue);
$enqueuedCount = $this->enqueueSubscribers($email, $scheduledTask, $intervalUnit, $intervalValue);
if ($enqueuedCount) {
$this->createSendingQueue($email, $scheduledTask, $enqueuedCount);
return $scheduledTask;
} else {
// Nothing to send
$this->scheduledTasksRepository->remove($scheduledTask);
$this->scheduledTasksRepository->flush();
return null;
}
}
private function scheduleTask(NewsletterEntity $email): ScheduledTaskEntity {
private function scheduleTask(NewsletterEntity $email) {
// Scheduled task
$scheduledTask = new ScheduledTaskEntity();
$scheduledTask->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED);
@@ -87,19 +96,27 @@ class ReEngagementScheduler {
$scheduledTask->setType(Sending::TASK_TYPE);
$scheduledTask->setPriority(SendingQueueEntity::PRIORITY_MEDIUM);
$this->scheduledTasksRepository->persist($scheduledTask);
// Sending queue
$sendingQueue = new SendingQueueEntity();
$sendingQueue->setTask($scheduledTask);
$sendingQueue->setNewsletter($email);
$this->scheduledTasksRepository->persist($sendingQueue);
$this->scheduledTasksRepository->flush();
return $scheduledTask;
}
private function createSendingQueue(NewsletterEntity $email, ScheduledTaskEntity $scheduledTask, int $countToProcess): SendingQueueEntity {
// Sending queue
$sendingQueue = new SendingQueueEntity();
$sendingQueue->setTask($scheduledTask);
$sendingQueue->setNewsletter($email);
$sendingQueue->setCountToProcess($countToProcess);
$sendingQueue->setCountTotal($countToProcess);
$this->entityManager->persist($sendingQueue);
$this->entityManager->flush();
return $sendingQueue;
}
/**
* Finds subscribers that should receive re-engagement email and saves scheduled tasks subscribers
* @return int Count of enqueued subscribers
*/
private function enqueueSubscribers(NewsletterEntity $email, ScheduledTaskEntity $scheduledTask, string $intervalUnit, int $intervalValue) {
private function enqueueSubscribers(NewsletterEntity $email, ScheduledTaskEntity $scheduledTask, string $intervalUnit, int $intervalValue): int {
// Parameters for scheduled task subscribers query
$thresholdDate = Carbon::createFromTimestamp($this->wp->currentTime('timestamp'));
if ($intervalUnit === 'months') {
@@ -134,5 +151,6 @@ class ReEngagementScheduler {
$statement->bindParam('newsletterId', $newsletterId, ParameterType::INTEGER);
$statement->executeQuery();
return $statement->rowCount();
}
}

View File

@@ -59,6 +59,12 @@ class ReEngagementSchedulerTest extends \MailPoetTest {
expect($scheduled)->count(0);
}
public function testItDoesntScheduleAnythingIfThereAreNoSubscribersToSendTo() {
$this->createReEngagementEmail(5);
$scheduled = $this->scheduler->scheduleAll();
expect($scheduled)->count(0);
}
public function testItScheduleEmailWithCorrectSubscribers() {
$beforeCheckInterval = Carbon::now();
$beforeCheckInterval->subMonths(10);
@@ -119,6 +125,12 @@ class ReEngagementSchedulerTest extends \MailPoetTest {
$this->assertInstanceOf(\DateTimeInterface::class, $scheduledAt);
expect($scheduledAt->getTimestamp())->equals(Carbon::now()->getTimestamp(), 1);
expect($task->getSubscribers()->count())->equals(2);
$sendingQueue = $this->entityManager->getRepository(SendingQueueEntity::class)->findOneBy(['task' => $task]);
$this->assertInstanceOf(SendingQueueEntity::class, $sendingQueue);
expect($sendingQueue->getCountToProcess())->equals(2);
expect($sendingQueue->getCountTotal())->equals(2);
expect($sendingQueue->getCountProcessed())->equals(0);
}
private function createReEngagementEmail(int $monthsAfter, string $status = NewsletterEntity::STATUS_ACTIVE) {