From 19b33e15f57591b889897efb6e0419f1efcef397 Mon Sep 17 00:00:00 2001 From: Rodrigo Primo Date: Tue, 28 Nov 2023 11:30:43 -0300 Subject: [PATCH] Refactor SendingQueue::add() to use Doctrine instead of Tasks\Sending [MAILPOET-5684] --- mailpoet/lib/API/JSON/v1/SendingQueue.php | 148 +++++++++------------- 1 file changed, 62 insertions(+), 86 deletions(-) diff --git a/mailpoet/lib/API/JSON/v1/SendingQueue.php b/mailpoet/lib/API/JSON/v1/SendingQueue.php index 3d4265b02b..dd8a8ec2a3 100644 --- a/mailpoet/lib/API/JSON/v1/SendingQueue.php +++ b/mailpoet/lib/API/JSON/v1/SendingQueue.php @@ -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(), + ]); } }