Refactor SendingQueue::add() to use Doctrine instead of Tasks\Sending
[MAILPOET-5684]
This commit is contained in:
committed by
Aschepikov
parent
62db03d95b
commit
19b33e15f5
@ -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(),
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user