| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186 |
- <?php
- namespace MailPoet\API\JSON\v1;
- if (!defined('ABSPATH')) exit;
- use MailPoet\API\JSON\Endpoint as APIEndpoint;
- use MailPoet\API\JSON\Error as APIError;
- use MailPoet\API\JSON\Response;
- use MailPoet\Config\AccessControl;
- use MailPoet\Cron\Triggers\WordPress;
- use MailPoet\Models\Newsletter;
- use MailPoet\Models\SendingQueue as SendingQueueModel;
- use MailPoet\Newsletter\Scheduler\Scheduler;
- use MailPoet\Segments\SubscribersFinder;
- use MailPoet\Tasks\Sending as SendingTask;
- use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
- class SendingQueue extends APIEndpoint {
- public $permissions = [
- 'global' => AccessControl::PERMISSION_MANAGE_EMAILS,
- ];
- /** @var SubscribersFeature */
- private $subscribersFeature;
- /** @var SubscribersFinder */
- private $subscribersFinder;
- public function __construct(
- SubscribersFeature $subscribersFeature,
- SubscribersFinder $subscribersFinder
- ) {
- $this->subscribersFeature = $subscribersFeature;
- $this->subscribersFinder = $subscribersFinder;
- }
- 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();
- $subscribersCount = $this->subscribersFinder->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'),
- ]);
- }
- }
- }
|