Files
piratepoet/lib/Cron/Workers/StatsNotifications/Scheduler.php
Pavel Dohnal 92bbb3f4e8 Create StatsNotifications entity
[MAILPOET-2439]
2019-11-05 13:38:51 +00:00

104 lines
2.7 KiB
PHP

<?php
namespace MailPoet\Cron\Workers\StatsNotifications;
use Carbon\Carbon;
use Doctrine\ORM\EntityManager;
use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\StatsNotificationEntity;
use MailPoet\Models\Newsletter;
use MailPoet\Models\ScheduledTask;
use MailPoet\Models\StatsNotification;
use MailPoet\Settings\SettingsController;
class Scheduler {
/**
* How many hours after the newsletter will be the stats notification sent
* @var int
*/
const HOURS_TO_SEND_AFTER_NEWSLETTER = 24;
/** @var SettingsController */
private $settings;
private $supported_types = [
Newsletter::TYPE_NOTIFICATION_HISTORY,
Newsletter::TYPE_STANDARD,
];
/** @var EntityManager */
private $entity_manager;
function __construct(SettingsController $settings, EntityManager $entity_manager) {
$this->settings = $settings;
$this->entity_manager = $entity_manager;
}
function schedule(Newsletter $newsletter) {
if (!$this->shouldSchedule($newsletter)) {
return false;
}
$task = new ScheduledTaskEntity();
$task->setType(Worker::TASK_TYPE);
$task->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED);
$task->setScheduledAt($this->getNextRunDate());
$this->entity_manager->persist($task);
$this->entity_manager->flush();
$stats_notifications = new StatsNotificationEntity($newsletter->id, $task->getId());
$this->entity_manager->persist($stats_notifications);
$this->entity_manager->flush();
}
private function shouldSchedule(Newsletter $newsletter) {
if ($this->isDisabled()) {
return false;
}
if ($this->isTaskScheduled($newsletter->id)) {
return false;
}
if (!in_array($newsletter->type, $this->supported_types)) {
return false;
}
return true;
}
private function isDisabled() {
$settings = $this->settings->get(Worker::SETTINGS_KEY);
if (!is_array($settings)) {
return true;
}
if (!isset($settings['enabled'])) {
return true;
}
if (!isset($settings['address'])) {
return true;
}
if (empty(trim($settings['address']))) {
return true;
}
if (!(bool)$this->settings->get('tracking.enabled')) {
return true;
}
return !(bool)$settings['enabled'];
}
private function isTaskScheduled($newsletter_id) {
$existing = ScheduledTask::tableAlias('tasks')
->join(StatsNotification::$_table, 'tasks.id = notification.task_id', 'notification')
->where('tasks.type', Worker::TASK_TYPE)
->where('notification.newsletter_id', $newsletter_id)
->findMany();
return (bool)$existing;
}
private function getNextRunDate() {
$date = new Carbon();
$date->addHours(self::HOURS_TO_SEND_AFTER_NEWSLETTER);
return $date;
}
}