diff --git a/lib/API/JSON/v1/SendingQueue.php b/lib/API/JSON/v1/SendingQueue.php index 03754fe580..fae28476e5 100644 --- a/lib/API/JSON/v1/SendingQueue.php +++ b/lib/API/JSON/v1/SendingQueue.php @@ -8,10 +8,12 @@ use MailPoet\API\JSON\Response; use MailPoet\Config\AccessControl; use MailPoet\Cron\Triggers\WordPress; use MailPoet\Entities\NewsletterEntity; +use MailPoet\Entities\SendingQueueEntity; use MailPoet\Models\Newsletter; use MailPoet\Models\SendingQueue as SendingQueueModel; use MailPoet\Newsletter\NewslettersRepository; use MailPoet\Newsletter\Scheduler\Scheduler; +use MailPoet\Newsletter\Sending\SendingQueuesRepository; use MailPoet\Segments\SubscribersFinder; use MailPoet\Services\Bridge; use MailPoet\Tasks\Sending as SendingTask; @@ -34,9 +36,13 @@ class SendingQueue extends APIEndpoint { /** @var Bridge */ private $bridge; + /** @var SendingQueuesRepository */ + private $sendingQueuesRepository; + public function __construct( SubscribersFeature $subscribersFeature, NewslettersRepository $newsletterRepository, + SendingQueuesRepository $sendingQueuesRepository, Bridge $bridge, SubscribersFinder $subscribersFinder ) { @@ -44,6 +50,7 @@ class SendingQueue extends APIEndpoint { $this->subscribersFinder = $subscribersFinder; $this->newsletterRepository = $newsletterRepository; $this->bridge = $bridge; + $this->sendingQueuesRepository = $sendingQueuesRepository; } public function add($data = []) { @@ -65,7 +72,7 @@ class SendingQueue extends APIEndpoint { APIError::NOT_FOUND => __('This newsletter does not exist.', 'mailpoet'), ]); } - $newsletterEntity = $this->newsletterRepository->findOneById($newsletter->id); + $newsletterEntity = $this->newsletterRepository->findOneById($newsletterId); if (!$newsletterEntity instanceof NewsletterEntity) { return $this->errorResponse([ APIError::NOT_FOUND => __('This newsletter does not exist.', 'mailpoet'), @@ -177,20 +184,18 @@ class SendingQueue extends APIEndpoint { ? (int)$data['newsletter_id'] : false ); - $newsletter = Newsletter::findOne($newsletterId); + $newsletter = $this->newsletterRepository->findOneById($newsletterId); - if ($newsletter instanceof Newsletter) { - $queue = $newsletter->getQueue(); + if ($newsletter instanceof NewsletterEntity) { + $queue = $newsletter->getLatestQueue(); - if ($queue === false) { + if (!$queue instanceof SendingQueueEntity) { return $this->errorResponse([ APIError::UNKNOWN => __('This newsletter has not been sent yet.', 'mailpoet'), ]); } else { - $queue->pause(); - return $this->successResponse( - $newsletter->getQueue()->asArray() - ); + $this->sendingQueuesRepository->pause($queue); + return $this->successResponse(); } } else { return $this->errorResponse([ @@ -209,19 +214,18 @@ class SendingQueue extends APIEndpoint { ? (int)$data['newsletter_id'] : false ); - $newsletter = Newsletter::findOne($newsletterId); - if ($newsletter instanceof Newsletter) { - $queue = $newsletter->getQueue(); + $newsletter = $this->newsletterRepository->findOneById($newsletterId); - if ($queue === false) { + if ($newsletter instanceof NewsletterEntity) { + $queue = $newsletter->getLatestQueue(); + + if (!$queue instanceof SendingQueueEntity) { return $this->errorResponse([ APIError::UNKNOWN => __('This newsletter has not been sent yet.', 'mailpoet'), ]); } else { - $queue->resume(); - return $this->successResponse( - $newsletter->getQueue()->asArray() - ); + $this->sendingQueuesRepository->resume($queue); + return $this->successResponse(); } } else { return $this->errorResponse([ diff --git a/lib/Newsletter/Sending/SendingQueuesRepository.php b/lib/Newsletter/Sending/SendingQueuesRepository.php index 5be20464c6..7372ea85b0 100644 --- a/lib/Newsletter/Sending/SendingQueuesRepository.php +++ b/lib/Newsletter/Sending/SendingQueuesRepository.php @@ -7,6 +7,7 @@ use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\ScheduledTaskEntity; use MailPoet\Entities\SendingQueueEntity; use MailPoet\Entities\SubscriberEntity; +use MailPoet\WP\Functions as WPFunctions; use MailPoetVendor\Doctrine\ORM\EntityManager; /** @@ -16,12 +17,17 @@ class SendingQueuesRepository extends Repository { /** @var ScheduledTaskSubscribersRepository */ private $scheduledTaskSubscribersRepository; + /** @var WPFunctions */ + private $wp; + public function __construct( EntityManager $entityManager, + WPFunctions $wp, ScheduledTaskSubscribersRepository $scheduledTaskSubscribersRepository ) { parent::__construct($entityManager); $this->scheduledTaskSubscribersRepository = $scheduledTaskSubscribersRepository; + $this->wp = $wp; } protected function getEntityClassName() { @@ -77,4 +83,31 @@ class SendingQueuesRepository extends Repository { } return $qb->getQuery()->getResult(); } + + public function pause(SendingQueueEntity $queue): void { + if ($queue->getCountProcessed() !== $queue->getCountTotal()) { + $task = $queue->getTask(); + if ($task instanceof ScheduledTaskEntity) { + $task->setStatus(ScheduledTaskEntity::STATUS_PAUSED); + $this->flush(); + } + } + } + + public function resume(SendingQueueEntity $queue): void { + $task = $queue->getTask(); + if (!$task instanceof ScheduledTaskEntity) return; + + if ($queue->getCountProcessed() === $queue->getCountTotal()) { + $task->setProcessedAt($this->wp->currentTime('mysql')); + $task->setStatus(ScheduledTaskEntity::STATUS_COMPLETED); + $this->flush(); + } else { + $newsletter = $queue->getNewsletter(); + if (!$newsletter instanceof NewsletterEntity) return; + $newsletter->setStatus(NewsletterEntity::STATUS_SENDING); + $task->setStatus(null); + $this->flush(); + } + } }