77 lines
2.3 KiB
PHP
77 lines
2.3 KiB
PHP
<?php declare(strict_types=1);
|
|
|
|
namespace MailPoet\Cron\Workers;
|
|
|
|
use MailPoet\Models\ScheduledTask;
|
|
use MailPoet\Segments\SegmentsRepository;
|
|
use MailPoet\Statistics\StatisticsOpensRepository;
|
|
use MailPoet\Subscribers\SubscribersRepository;
|
|
use MailPoetVendor\Carbon\Carbon;
|
|
|
|
class SubscribersEngagementScore extends SimpleWorker {
|
|
const AUTOMATIC_SCHEDULING = true;
|
|
const BATCH_SIZE = 60;
|
|
const TASK_TYPE = 'subscribers_engagement_score';
|
|
|
|
/** @var SegmentsRepository */
|
|
private $segmentsRepository;
|
|
|
|
/** @var StatisticsOpensRepository */
|
|
private $statisticsOpensRepository;
|
|
|
|
/** @var SubscribersRepository */
|
|
private $subscribersRepository;
|
|
|
|
public function __construct(
|
|
SegmentsRepository $segmentsRepository,
|
|
StatisticsOpensRepository $statisticsOpensRepository,
|
|
SubscribersRepository $subscribersRepository
|
|
) {
|
|
parent::__construct();
|
|
$this->segmentsRepository = $segmentsRepository;
|
|
$this->statisticsOpensRepository = $statisticsOpensRepository;
|
|
$this->subscribersRepository = $subscribersRepository;
|
|
}
|
|
|
|
public function processTaskStrategy(ScheduledTask $task, $timer) {
|
|
$recalculatedSubscribersCount = $this->recalculateSubscribers();
|
|
if ($recalculatedSubscribersCount > 0) {
|
|
$this->scheduleImmediately();
|
|
return true;
|
|
}
|
|
|
|
$recalculatedSegmentsCount = $this->recalculateSegments();
|
|
if ($recalculatedSegmentsCount > 0) {
|
|
$this->scheduleImmediately();
|
|
return true;
|
|
}
|
|
|
|
$this->schedule();
|
|
return true;
|
|
}
|
|
|
|
private function recalculateSubscribers(): int {
|
|
$subscribers = $this->subscribersRepository->findByUpdatedScoreNotInLastMonth(self::BATCH_SIZE);
|
|
foreach ($subscribers as $subscriber) {
|
|
$this->statisticsOpensRepository->recalculateSubscriberScore($subscriber);
|
|
}
|
|
return count($subscribers);
|
|
}
|
|
|
|
private function recalculateSegments(): int {
|
|
$segments = $this->segmentsRepository->findByUpdatedScoreNotInLastDay(self::BATCH_SIZE);
|
|
foreach ($segments as $segment) {
|
|
$this->statisticsOpensRepository->recalculateSegmentScore($segment);
|
|
}
|
|
return count($segments);
|
|
}
|
|
|
|
public function getNextRunDate() {
|
|
// random day of the next week
|
|
$date = Carbon::createFromTimestamp($this->wp->currentTime('timestamp'));
|
|
$date->addDay();
|
|
$date->setTime(mt_rand(0, 23), mt_rand(0, 59));
|
|
return $date;
|
|
}
|
|
}
|