Нет описания

SendingQueue.php 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <?php
  2. namespace MailPoet\API\JSON\v1;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\API\JSON\Endpoint as APIEndpoint;
  5. use MailPoet\API\JSON\Error as APIError;
  6. use MailPoet\API\JSON\Response;
  7. use MailPoet\Config\AccessControl;
  8. use MailPoet\Cron\Triggers\WordPress;
  9. use MailPoet\Models\Newsletter;
  10. use MailPoet\Models\SendingQueue as SendingQueueModel;
  11. use MailPoet\Newsletter\Scheduler\Scheduler;
  12. use MailPoet\Segments\SubscribersFinder;
  13. use MailPoet\Tasks\Sending as SendingTask;
  14. use MailPoet\Util\License\Features\Subscribers as SubscribersFeature;
  15. class SendingQueue extends APIEndpoint {
  16. public $permissions = [
  17. 'global' => AccessControl::PERMISSION_MANAGE_EMAILS,
  18. ];
  19. /** @var SubscribersFeature */
  20. private $subscribersFeature;
  21. /** @var SubscribersFinder */
  22. private $subscribersFinder;
  23. public function __construct(
  24. SubscribersFeature $subscribersFeature,
  25. SubscribersFinder $subscribersFinder
  26. ) {
  27. $this->subscribersFeature = $subscribersFeature;
  28. $this->subscribersFinder = $subscribersFinder;
  29. }
  30. public function add($data = []) {
  31. if ($this->subscribersFeature->check()) {
  32. return $this->errorResponse([
  33. APIError::FORBIDDEN => __('Subscribers limit reached.', 'mailpoet'),
  34. ], [], Response::STATUS_FORBIDDEN);
  35. }
  36. $newsletterId = (isset($data['newsletter_id'])
  37. ? (int)$data['newsletter_id']
  38. : false
  39. );
  40. // check that the newsletter exists
  41. $newsletter = Newsletter::findOneWithOptions($newsletterId);
  42. if (!$newsletter instanceof Newsletter) {
  43. return $this->errorResponse([
  44. APIError::NOT_FOUND => __('This newsletter does not exist.', 'mailpoet'),
  45. ]);
  46. }
  47. // check that the sending method has been configured properly
  48. try {
  49. $mailer = new \MailPoet\Mailer\Mailer();
  50. $mailer->init();
  51. } catch (\Exception $e) {
  52. return $this->errorResponse([
  53. $e->getCode() => $e->getMessage(),
  54. ]);
  55. }
  56. // add newsletter to the sending queue
  57. $queue = SendingQueueModel::joinWithTasks()
  58. ->where('queues.newsletter_id', $newsletter->id)
  59. ->whereNull('tasks.status')
  60. ->findOne();
  61. if (!empty($queue)) {
  62. return $this->errorResponse([
  63. APIError::NOT_FOUND => __('This newsletter is already being sent.', 'mailpoet'),
  64. ]);
  65. }
  66. $scheduledQueue = SendingQueueModel::joinWithTasks()
  67. ->where('queues.newsletter_id', $newsletter->id)
  68. ->where('tasks.status', SendingQueueModel::STATUS_SCHEDULED)
  69. ->findOne();
  70. if ($scheduledQueue instanceof SendingQueueModel) {
  71. $queue = SendingTask::createFromQueue($scheduledQueue);
  72. } else {
  73. $queue = SendingTask::create();
  74. $queue->newsletterId = $newsletter->id;
  75. }
  76. WordPress::resetRunInterval();
  77. if ((bool)$newsletter->isScheduled) {
  78. // set newsletter status
  79. $newsletter->setStatus(Newsletter::STATUS_SCHEDULED);
  80. // set queue status
  81. $queue->status = SendingQueueModel::STATUS_SCHEDULED;
  82. $queue->scheduledAt = Scheduler::formatDatetimeString($newsletter->scheduledAt);
  83. } else {
  84. $segments = $newsletter->segments()->findMany();
  85. $subscribersCount = $this->subscribersFinder->addSubscribersToTaskFromSegments($queue->task(), $segments);
  86. if (!$subscribersCount) {
  87. return $this->errorResponse([
  88. APIError::UNKNOWN => __('There are no subscribers in that list!', 'mailpoet'),
  89. ]);
  90. }
  91. $queue->updateCount();
  92. $queue->status = null;
  93. $queue->scheduledAt = null;
  94. // set newsletter status
  95. $newsletter->setStatus(Newsletter::STATUS_SENDING);
  96. }
  97. $queue->save();
  98. $errors = $queue->getErrors();
  99. if (!empty($errors)) {
  100. return $this->errorResponse($errors);
  101. } else {
  102. return $this->successResponse(
  103. $newsletter->getQueue()->asArray()
  104. );
  105. }
  106. }
  107. public function pause($data = []) {
  108. $newsletterId = (isset($data['newsletter_id'])
  109. ? (int)$data['newsletter_id']
  110. : false
  111. );
  112. $newsletter = Newsletter::findOne($newsletterId);
  113. if ($newsletter instanceof Newsletter) {
  114. $queue = $newsletter->getQueue();
  115. if ($queue === false) {
  116. return $this->errorResponse([
  117. APIError::UNKNOWN => __('This newsletter has not been sent yet.', 'mailpoet'),
  118. ]);
  119. } else {
  120. $queue->pause();
  121. return $this->successResponse(
  122. $newsletter->getQueue()->asArray()
  123. );
  124. }
  125. } else {
  126. return $this->errorResponse([
  127. APIError::NOT_FOUND => __('This newsletter does not exist.', 'mailpoet'),
  128. ]);
  129. }
  130. }
  131. public function resume($data = []) {
  132. if ($this->subscribersFeature->check()) {
  133. return $this->errorResponse([
  134. APIError::FORBIDDEN => __('Subscribers limit reached.', 'mailpoet'),
  135. ], [], Response::STATUS_FORBIDDEN);
  136. }
  137. $newsletterId = (isset($data['newsletter_id'])
  138. ? (int)$data['newsletter_id']
  139. : false
  140. );
  141. $newsletter = Newsletter::findOne($newsletterId);
  142. if ($newsletter instanceof Newsletter) {
  143. $queue = $newsletter->getQueue();
  144. if ($queue === false) {
  145. return $this->errorResponse([
  146. APIError::UNKNOWN => __('This newsletter has not been sent yet.', 'mailpoet'),
  147. ]);
  148. } else {
  149. $queue->resume();
  150. return $this->successResponse(
  151. $newsletter->getQueue()->asArray()
  152. );
  153. }
  154. } else {
  155. return $this->errorResponse([
  156. APIError::NOT_FOUND => __('This newsletter does not exist.', 'mailpoet'),
  157. ]);
  158. }
  159. }
  160. }