geno/wp-content/plugins/mailpoet/lib/Cron/Workers/SubscribersEmailCount.php
2024-02-01 11:54:18 +00:00

98 lines
3.3 KiB
PHP

<?php declare(strict_types = 1);
namespace MailPoet\Cron\Workers;
if (!defined('ABSPATH')) exit;
use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\SubscriberEntity;
use MailPoet\Settings\SettingsController;
use MailPoet\Settings\TrackingConfig;
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;
/** @var SettingsController */
private $settings;
/** @var TrackingConfig */
private $trackingConfig;
public function __construct(
SubscribersEmailCountsController $subscribersEmailCountsController,
EntityManager $entityManager,
SettingsController $settings,
TrackingConfig $trackingConfig
) {
$this->subscribersEmailCountsController = $subscribersEmailCountsController;
$this->entityManager = $entityManager;
$this->settings = $settings;
$this->trackingConfig = $trackingConfig;
parent::__construct();
}
public function checkProcessingRequirements() {
if (!$this->trackingConfig->isEmailTrackingEnabled()) {
return false;
}
$daysToInactive = (int)$this->settings->get('deactivate_subscriber_after_inactive_days');
if ($daysToInactive === 0) {
return false;
}
return true;
}
public function processTaskStrategy(ScheduledTaskEntity $task, $timer) {
$previousTask = $this->findPreviousTask($task);
$dateFromLastRun = null;
if ($previousTask instanceof ScheduledTaskEntity) {
$dateFromLastRun = $previousTask->getScheduledAt();
}
$meta = $task->getMeta();
$lastSubscriberId = isset($meta['last_subscriber_id']) ? (int)$meta['last_subscriber_id'] : 0;
$highestSubscriberId = isset($meta['highest_subscriber_id']) ? (int)$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;
}
}