Files
piratepoet/mailpoet/lib/Cron/Workers/SubscribersEmailCount.php
2022-04-07 10:17:38 +02:00

71 lines
2.5 KiB
PHP

<?php declare(strict_types = 1);
namespace MailPoet\Cron\Workers;
use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Subscribers\SubscribersEmailCountsController;
use MailPoetVendor\Doctrine\ORM\EntityManager;
class SubscribersEmailCount extends SimpleWorker {
const TASK_TYPE = 'subscribers_email_count';
const BATCH_SIZE = 1000;
const SUPPORT_MULTIPLE_INSTANCES = false;
/** @var SubscribersEmailCountsController */
private $subscribersEmailCountsController;
/** @var EntityManager */
private $entityManager;
public function __construct(
SubscribersEmailCountsController $subscribersEmailCountsController,
EntityManager $entityManager
) {
$this->subscribersEmailCountsController = $subscribersEmailCountsController;
$this->entityManager = $entityManager;
parent::__construct();
}
public function processTaskStrategy(ScheduledTaskEntity $task, $timer) {
$previousTask = $this->findPreviousTask($task);
$dateFromLastRun = null;
if ($previousTask instanceof ScheduledTaskEntity) {
$dateFromLastRun = $previousTask->getScheduledAt();
}
$meta = $task->getMeta();
$lastSubscriberId = $meta['last_subscriber_id'] ?? 0;
$highestSubscriberId = $meta['highest_subscriber_id'] ?? $this->getHighestSubscriberId();
$meta['highest_subscriber_id'] = $highestSubscriberId;
$task->setMeta($meta);
while ($lastSubscriberId <= $highestSubscriberId) {
[$count, $lastSubscriberId] = $this->subscribersEmailCountsController->updateSubscribersEmailCounts($dateFromLastRun, self::BATCH_SIZE, $lastSubscriberId);
if ($count === 0) {
break;
}
$meta['last_subscriber_id'] = $lastSubscriberId++;
$task->setMeta($meta);
$this->scheduledTasksRepository->persist($task);
$this->scheduledTasksRepository->flush();
$this->cronHelper->enforceExecutionLimit($timer);
};
$this->schedule();
return true;
}
private function findPreviousTask(ScheduledTaskEntity $task): ?ScheduledTaskEntity {
return $this->scheduledTasksRepository->findPreviousTask($task);
}
private function getHighestSubscriberId(): int {
$subscribersTable = $this->entityManager->getClassMetadata(SubscriberEntity::class)->getTableName();
$result = $this->entityManager->getConnection()->executeQuery("SELECT MAX(id) FROM $subscribersTable LIMIT 1;")->fetchNumeric();
/** @var int[] $result - it's required for PHPStan */
return is_array($result) && isset($result[0]) ? (int)$result[0] : 0;
}
}