Refactor SendingQueue::add() to use Doctrine instead of Tasks\Sending

[MAILPOET-5684]
This commit is contained in:
Rodrigo Primo
2023-11-28 11:30:43 -03:00
committed by Aschepikov
parent 62db03d95b
commit 19b33e15f5

View File

@ -10,19 +10,17 @@ use MailPoet\Config\AccessControl;
use MailPoet\Cron\ActionScheduler\Actions\DaemonTrigger;
use MailPoet\Cron\CronTrigger;
use MailPoet\Cron\Triggers\WordPress;
use MailPoet\Cron\Workers\SendingQueue\SendingQueue as SendingQueueWorker;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\ScheduledTaskEntity;
use MailPoet\Entities\SendingQueueEntity;
use MailPoet\Mailer\MailerFactory;
use MailPoet\Models\SendingQueue as SendingQueueModel;
use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\Newsletter\NewsletterValidator;
use MailPoet\Newsletter\Scheduler\Scheduler;
use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
use MailPoet\Segments\SubscribersFinder;
use MailPoet\Settings\SettingsController;
use MailPoet\Tasks\Sending as SendingTask;
use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
use MailPoetVendor\Carbon\Carbon;
@ -52,9 +50,6 @@ class SendingQueue extends APIEndpoint {
/** @var NewsletterValidator */
private $newsletterValidator;
/** @var Scheduler */
private $scheduler;
/** @var SettingsController */
private $settings;
@ -71,7 +66,6 @@ class SendingQueue extends APIEndpoint {
SubscribersFinder $subscribersFinder,
ScheduledTasksRepository $scheduledTasksRepository,
MailerFactory $mailerFactory,
Scheduler $scheduler,
SettingsController $settings,
DaemonTrigger $actionSchedulerDaemonTriggerAction,
NewsletterValidator $newsletterValidator,
@ -83,7 +77,6 @@ class SendingQueue extends APIEndpoint {
$this->sendingQueuesRepository = $sendingQueuesRepository;
$this->scheduledTasksRepository = $scheduledTasksRepository;
$this->mailerFactory = $mailerFactory;
$this->scheduler = $scheduler;
$this->settings = $settings;
$this->actionSchedulerDaemonTriggerAction = $actionSchedulerDaemonTriggerAction;
$this->newsletterValidator = $newsletterValidator;
@ -118,98 +111,81 @@ class SendingQueue extends APIEndpoint {
]);
}
// check that the sending method has been configured properly by verifying that default mailer can be build
try {
// check that the sending method has been configured properly by verifying that default mailer can be build
$this->mailerFactory->getDefaultMailer();
} catch (\Exception $e) {
return $this->errorResponse([
$e->getCode() => $e->getMessage(),
]);
}
// add newsletter to the sending queue
$queue = SendingQueueModel::joinWithTasks()
->where('queues.newsletter_id', $newsletter->getId())
->whereNull('tasks.status')
->findOne();
$sendingQueue = $this->sendingQueuesRepository->findOneByNewsletterAndTaskStatus($newsletter, null);
if (!empty($queue)) {
return $this->errorResponse([
APIError::NOT_FOUND => __('This newsletter is already being sent.', 'mailpoet'),
]);
}
$scheduledQueue = SendingQueueModel::joinWithTasks()
->where('queues.newsletter_id', $newsletter->getId())
->where('tasks.status', SendingQueueModel::STATUS_SCHEDULED)
->findOne();
if ($scheduledQueue instanceof SendingQueueModel) {
$queue = SendingTask::createFromQueue($scheduledQueue);
} else {
$queue = SendingTask::create();
$queue->newsletterId = $newsletter->getId();
}
$taskModel = $queue->task();
$taskEntity = $this->scheduledTasksRepository->findOneById($taskModel->id);
if (!$taskEntity instanceof ScheduledTaskEntity) {
return $this->errorResponse([
APIError::NOT_FOUND => __('Unable to find scheduled task associated with this newsletter.', 'mailpoet'),
]);
}
WordPress::resetRunInterval();
if ((bool)$newsletter->getOptionValue('isScheduled')) {
// set newsletter status
$newsletter->setStatus(NewsletterEntity::STATUS_SCHEDULED);
// set queue status
$scheduledAt = $this->scheduler->formatDatetimeString($newsletter->getOptionValue('scheduledAt'));
$queue->status = SendingQueueModel::STATUS_SCHEDULED;
$queue->scheduledAt = $scheduledAt;
// we need to refresh the entity here for now while this method still uses Paris
$taskEntity->setStatus(SendingQueueModel::STATUS_SCHEDULED);
$taskEntity->setScheduledAt(new Carbon($scheduledAt));
} else {
$segments = $newsletter->getSegmentIds();
$subscribersCount = $this->subscribersFinder->addSubscribersToTaskFromSegments($taskEntity, $segments, $newsletter->getFilterSegmentId());
if (!$subscribersCount) {
if ($sendingQueue instanceof SendingQueueEntity) {
return $this->errorResponse([
APIError::UNKNOWN => __('There are no subscribers in that list!', 'mailpoet'),
APIError::NOT_FOUND => __('This newsletter is already being sent.', 'mailpoet'),
]);
}
$queue->updateCount();
$queue->status = null;
$queue->scheduledAt = null;
// we need to refresh the entity here for now while this method still uses Paris
$taskEntity->setStatus(null);
$taskEntity->setScheduledAt(null);
$sendingQueue = $this->sendingQueuesRepository->findOneByNewsletterAndTaskStatus($newsletter, ScheduledTaskEntity::STATUS_SCHEDULED);
// set newsletter status
$newsletter->setStatus(NewsletterEntity::STATUS_SENDING);
}
$queue->save();
$this->newsletterRepository->flush();
// refreshing is needed while this method still uses Paris
$this->newsletterRepository->refresh($newsletter);
$latestQueue = $newsletter->getLatestQueue();
if ($latestQueue instanceof SendingQueueEntity) {
$this->sendingQueuesRepository->refresh($latestQueue);
}
if (is_null($sendingQueue)) {
$scheduledTask = new ScheduledTaskEntity();
$scheduledTask->setType(SendingQueueWorker::TASK_TYPE);
$sendingQueue = new SendingQueueEntity();
$sendingQueue->setNewsletter($newsletter);
$sendingQueue->setTask($scheduledTask);
$this->sendingQueuesRepository->persist($sendingQueue);
$this->newsletterRepository->refresh($newsletter);
} else {
$scheduledTask = $sendingQueue->getTask();
}
if (!$scheduledTask instanceof ScheduledTaskEntity) {
return $this->errorResponse([
APIError::NOT_FOUND => __('Unable to find scheduled task associated with this newsletter.', 'mailpoet'),
]);
}
$scheduledTask->setPriority(ScheduledTaskEntity::PRIORITY_MEDIUM);
$this->scheduledTasksRepository->persist($scheduledTask);
$this->scheduledTasksRepository->flush();
WordPress::resetRunInterval();
if ((bool)$newsletter->getOptionValue('isScheduled')) {
// set newsletter status
$newsletter->setStatus(NewsletterEntity::STATUS_SCHEDULED);
// set scheduled task status
$scheduledTask->setStatus(ScheduledTaskEntity::STATUS_SCHEDULED);
$scheduledTask->setScheduledAt(new Carbon($newsletter->getOptionValue('scheduledAt')));
} else {
$segments = $newsletter->getSegmentIds();
$this->scheduledTasksRepository->refresh($scheduledTask);
$subscribersCount = $this->subscribersFinder->addSubscribersToTaskFromSegments($scheduledTask, $segments, $newsletter->getFilterSegmentId());
if (!$subscribersCount) {
return $this->errorResponse([
APIError::UNKNOWN => __('There are no subscribers in that list!', 'mailpoet'),
]);
}
$this->sendingQueuesRepository->updateCounts($sendingQueue);
$scheduledTask->setStatus(null);
$scheduledTask->setScheduledAt(null);
// set newsletter status
$newsletter->setStatus(NewsletterEntity::STATUS_SENDING);
}
$this->scheduledTasksRepository->persist($scheduledTask);
$this->newsletterRepository->flush();
$errors = $queue->getErrors();
if (!empty($errors)) {
return $this->errorResponse($errors);
} else {
$this->triggerSending($newsletter);
return $this->successResponse(
($newsletter->getLatestQueue() instanceof SendingQueueEntity) ? $this->sendingQueuesResponseBuilder->build($newsletter->getLatestQueue()) : null
);
} catch (\Exception $e) {
return $this->errorResponse([
$e->getCode() => $e->getMessage(),
]);
}
}