Nenhuma Descrição

SendingQueue.php 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. <?php
  2. namespace MailPoet\Models;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Entities\SendingQueueEntity;
  5. use MailPoet\Util\Helpers;
  6. use MailPoet\WP\Functions as WPFunctions;
  7. /**
  8. * @property int $countProcessed
  9. * @property int $countToProcess
  10. * @property int $countTotal
  11. * @property string|array $newsletterRenderedBody
  12. * @property string $newsletterRenderedSubject
  13. * @property int $taskId
  14. * @property int $newsletterId
  15. * @property string|object|array|null $meta
  16. * @property string|array $subscribers
  17. * @property string|null $deletedAt
  18. * @property string $scheduledAt
  19. * @property string $status
  20. */
  21. class SendingQueue extends Model {
  22. public static $_table = MP_SENDING_QUEUES_TABLE; // phpcs:ignore PSR2.Classes.PropertyDeclaration
  23. const STATUS_COMPLETED = SendingQueueEntity::STATUS_COMPLETED;
  24. const STATUS_SCHEDULED = SendingQueueEntity::STATUS_SCHEDULED;
  25. const STATUS_PAUSED = SendingQueueEntity::STATUS_PAUSED;
  26. const PRIORITY_HIGH = SendingQueueEntity::PRIORITY_HIGH;
  27. const PRIORITY_MEDIUM = SendingQueueEntity::PRIORITY_MEDIUM;
  28. const PRIORITY_LOW = SendingQueueEntity::PRIORITY_LOW;
  29. public function __construct() {
  30. parent::__construct();
  31. $this->addValidations('newsletter_rendered_body', [
  32. 'validRenderedNewsletterBody' => WPFunctions::get()->__('Rendered newsletter body is invalid!', 'mailpoet'),
  33. ]);
  34. }
  35. public function task() {
  36. return $this->hasOne(__NAMESPACE__ . '\ScheduledTask', 'id', 'task_id');
  37. }
  38. public function newsletter() {
  39. return $this->has_one(__NAMESPACE__ . '\Newsletter', 'id', 'newsletter_id');
  40. }
  41. public function pause() {
  42. if ($this->countProcessed === $this->countTotal) {
  43. return false;
  44. } else {
  45. return $this->task()->findOne()->pause();
  46. }
  47. }
  48. public function resume() {
  49. if ($this->countProcessed === $this->countTotal) {
  50. return $this->complete();
  51. } else {
  52. $this->newsletter()->findOne()->setStatus(Newsletter::STATUS_SENDING);
  53. return $this->task()->findOne()->resume();
  54. }
  55. }
  56. public function complete() {
  57. return $this->task()->findOne()->complete();
  58. }
  59. public function save() {
  60. $this->newsletterRenderedBody = $this->getNewsletterRenderedBody();
  61. if (!Helpers::isJson($this->newsletterRenderedBody) && !is_null($this->newsletterRenderedBody)) {
  62. $this->set(
  63. 'newsletter_rendered_body',
  64. (string)json_encode($this->newsletterRenderedBody)
  65. );
  66. }
  67. if (!is_null($this->meta) && !Helpers::isJson($this->meta)) {
  68. $this->set(
  69. 'meta',
  70. (string)json_encode($this->meta)
  71. );
  72. }
  73. parent::save();
  74. $this->newsletterRenderedBody = $this->getNewsletterRenderedBody();
  75. return $this;
  76. }
  77. public function getNewsletterRenderedBody($type = false) {
  78. $renderedNewsletter = $this->decodeRenderedNewsletterBodyObject($this->newsletterRenderedBody);
  79. return ($type && !empty($renderedNewsletter[$type])) ?
  80. $renderedNewsletter[$type] :
  81. $renderedNewsletter;
  82. }
  83. public function getMeta() {
  84. return (Helpers::isJson($this->meta) && is_string($this->meta)) ? json_decode($this->meta, true) : $this->meta;
  85. }
  86. public function asArray() {
  87. $model = parent::asArray();
  88. $model['newsletter_rendered_body'] = $this->getNewsletterRenderedBody();
  89. $model['meta'] = $this->getMeta();
  90. return $model;
  91. }
  92. private function decodeRenderedNewsletterBodyObject($renderedBody) {
  93. if (is_serialized($renderedBody)) {
  94. return unserialize($renderedBody);
  95. }
  96. if (Helpers::isJson($renderedBody)) {
  97. return json_decode($renderedBody, true);
  98. }
  99. return $renderedBody;
  100. }
  101. public static function getTasks() {
  102. return ScheduledTask::tableAlias('tasks')
  103. ->selectExpr('tasks.*')
  104. ->join(
  105. MP_SENDING_QUEUES_TABLE,
  106. 'tasks.id = queues.task_id',
  107. 'queues'
  108. );
  109. }
  110. public static function joinWithTasks() {
  111. return static::tableAlias('queues')
  112. ->join(
  113. MP_SCHEDULED_TASKS_TABLE,
  114. 'tasks.id = queues.task_id',
  115. 'tasks'
  116. );
  117. }
  118. public static function joinWithSubscribers() {
  119. return static::joinWithTasks()
  120. ->join(
  121. MP_SCHEDULED_TASK_SUBSCRIBERS_TABLE,
  122. 'tasks.id = subscribers.task_id',
  123. 'subscribers'
  124. );
  125. }
  126. public static function findTaskByNewsletterId($newsletterId) {
  127. return static::getTasks()
  128. ->where('queues.newsletter_id', $newsletterId);
  129. }
  130. }