AccessControl::PERMISSION_MANAGE_EMAILS, ]; /** @var SubscribersFeature */ private $subscribersFeature; public function __construct(SubscribersFeature $subscribersFeature) { $this->subscribersFeature = $subscribersFeature; } public function add($data = []) { if ($this->subscribersFeature->check()) { return $this->errorResponse([ APIError::FORBIDDEN => __('Subscribers limit reached.', 'mailpoet'), ], [], Response::STATUS_FORBIDDEN); } $newsletterId = (isset($data['newsletter_id']) ? (int)$data['newsletter_id'] : false ); // check that the newsletter exists $newsletter = Newsletter::findOneWithOptions($newsletterId); if (!$newsletter instanceof Newsletter) { return $this->errorResponse([ APIError::NOT_FOUND => __('This newsletter does not exist.', 'mailpoet'), ]); } // check that the sending method has been configured properly try { $mailer = new \MailPoet\Mailer\Mailer(); $mailer->init(); } catch (\Exception $e) { return $this->errorResponse([ $e->getCode() => $e->getMessage(), ]); } // add newsletter to the sending queue $queue = SendingQueueModel::joinWithTasks() ->where('queues.newsletter_id', $newsletter->id) ->whereNull('tasks.status') ->findOne(); if (!empty($queue)) { return $this->errorResponse([ APIError::NOT_FOUND => __('This newsletter is already being sent.', 'mailpoet'), ]); } $scheduledQueue = SendingQueueModel::joinWithTasks() ->where('queues.newsletter_id', $newsletter->id) ->where('tasks.status', SendingQueueModel::STATUS_SCHEDULED) ->findOne(); if ($scheduledQueue instanceof SendingQueueModel) { $queue = SendingTask::createFromQueue($scheduledQueue); } else { $queue = SendingTask::create(); $queue->newsletterId = $newsletter->id; } WordPress::resetRunInterval(); if ((bool)$newsletter->isScheduled) { // set newsletter status $newsletter->setStatus(Newsletter::STATUS_SCHEDULED); // set queue status $queue->status = SendingQueueModel::STATUS_SCHEDULED; $queue->scheduledAt = Scheduler::formatDatetimeString($newsletter->scheduledAt); } else { $segments = $newsletter->segments()->findMany(); $finder = new SubscribersFinder(); $subscribersCount = $finder->addSubscribersToTaskFromSegments($queue->task(), $segments); if (!$subscribersCount) { return $this->errorResponse([ APIError::UNKNOWN => __('There are no subscribers in that list!', 'mailpoet'), ]); } $queue->updateCount(); $queue->status = null; $queue->scheduledAt = null; // set newsletter status $newsletter->setStatus(Newsletter::STATUS_SENDING); } $queue->save(); $errors = $queue->getErrors(); if (!empty($errors)) { return $this->errorResponse($errors); } else { return $this->successResponse( $newsletter->getQueue()->asArray() ); } } public function pause($data = []) { $newsletterId = (isset($data['newsletter_id']) ? (int)$data['newsletter_id'] : false ); $newsletter = Newsletter::findOne($newsletterId); if ($newsletter instanceof Newsletter) { $queue = $newsletter->getQueue(); if ($queue === false) { return $this->errorResponse([ APIError::UNKNOWN => __('This newsletter has not been sent yet.', 'mailpoet'), ]); } else { $queue->pause(); return $this->successResponse( $newsletter->getQueue()->asArray() ); } } else { return $this->errorResponse([ APIError::NOT_FOUND => __('This newsletter does not exist.', 'mailpoet'), ]); } } public function resume($data = []) { if ($this->subscribersFeature->check()) { return $this->errorResponse([ APIError::FORBIDDEN => __('Subscribers limit reached.', 'mailpoet'), ], [], Response::STATUS_FORBIDDEN); } $newsletterId = (isset($data['newsletter_id']) ? (int)$data['newsletter_id'] : false ); $newsletter = Newsletter::findOne($newsletterId); if ($newsletter instanceof Newsletter) { $queue = $newsletter->getQueue(); if ($queue === false) { return $this->errorResponse([ APIError::UNKNOWN => __('This newsletter has not been sent yet.', 'mailpoet'), ]); } else { $queue->resume(); return $this->successResponse( $newsletter->getQueue()->asArray() ); } } else { return $this->errorResponse([ APIError::NOT_FOUND => __('This newsletter does not exist.', 'mailpoet'), ]); } } }