Brak opisu

State.php 3.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <?php
  2. namespace MailPoet\Tasks;
  3. if (!defined('ABSPATH')) exit;
  4. use MailPoet\Cron\Workers\Scheduler;
  5. use MailPoet\Models\Newsletter;
  6. use MailPoet\Models\ScheduledTask;
  7. use MailPoet\Models\SendingQueue;
  8. use MailPoet\Newsletter\Url as NewsletterUrl;
  9. class State {
  10. /** @var NewsletterUrl */
  11. private $newsletterUrl;
  12. public function __construct(
  13. NewsletterUrl $newsletterUrl
  14. ) {
  15. $this->newsletterUrl = $newsletterUrl;
  16. }
  17. /**
  18. * @return array
  19. */
  20. public function getCountsPerStatus() {
  21. $stats = [
  22. ScheduledTask::STATUS_COMPLETED => 0,
  23. ScheduledTask::STATUS_PAUSED => 0,
  24. ScheduledTask::STATUS_SCHEDULED => 0,
  25. ScheduledTask::VIRTUAL_STATUS_RUNNING => 0,
  26. ];
  27. $counts = ScheduledTask::rawQuery(
  28. "SELECT COUNT(*) as value, status
  29. FROM `" . ScheduledTask::$_table . "`
  30. WHERE deleted_at IS NULL AND `type` = 'sending'
  31. GROUP BY status;"
  32. )->findMany();
  33. foreach ($counts as $count) {
  34. if ($count->status === null) {
  35. $stats[ScheduledTask::VIRTUAL_STATUS_RUNNING] = (int)$count->value;
  36. continue;
  37. }
  38. $stats[$count->status] = (int)$count->value;
  39. }
  40. return $stats;
  41. }
  42. /**
  43. * @return array
  44. */
  45. public function getLatestTasks(
  46. $type = null,
  47. $statuses = [
  48. ScheduledTask::STATUS_COMPLETED,
  49. ScheduledTask::STATUS_SCHEDULED,
  50. ScheduledTask::VIRTUAL_STATUS_RUNNING,
  51. ],
  52. $limit = Scheduler::TASK_BATCH_SIZE
  53. ) {
  54. $tasks = [];
  55. foreach ($statuses as $status) {
  56. $query = ScheduledTask::orderByDesc('id')
  57. ->whereNull('deleted_at')
  58. ->limit($limit);
  59. if ($type) {
  60. $query = $query->where('type', $type);
  61. }
  62. if ($status === ScheduledTask::VIRTUAL_STATUS_RUNNING) {
  63. $query = $query->whereNull('status');
  64. } else {
  65. $query = $query->where('status', $status);
  66. }
  67. $tasks = array_merge($tasks, $query->findMany());
  68. }
  69. return array_map(function ($task) {
  70. return $this->buildTaskData($task);
  71. }, $tasks);
  72. }
  73. /**
  74. * @return array
  75. */
  76. private function buildTaskData(ScheduledTask $task) {
  77. $queue = $newsletter = null;
  78. if ($task->type === Sending::TASK_TYPE) {
  79. $queue = SendingQueue::where('task_id', $task->id)->findOne();
  80. $newsletter = $queue instanceof SendingQueue ? $queue->newsletter()->findOne() : null;
  81. }
  82. return [
  83. 'id' => (int)$task->id,
  84. 'type' => $task->type,
  85. 'priority' => (int)$task->priority,
  86. 'updated_at' => $task->updatedAt,
  87. 'scheduled_at' => $task->scheduledAt ? $task->scheduledAt : null,
  88. 'status' => $task->status,
  89. 'newsletter' => (($queue instanceof SendingQueue) && ($newsletter instanceof Newsletter)) ? [
  90. 'newsletter_id' => (int)$queue->newsletterId,
  91. 'queue_id' => (int)$queue->id,
  92. 'subject' => $queue->newsletterRenderedSubject ?: $newsletter->subject,
  93. 'preview_url' => $this->newsletterUrl->getViewInBrowserUrl(
  94. $newsletter,
  95. null,
  96. $queue
  97. ),
  98. ] : [
  99. 'newsletter_id' => null,
  100. 'queue_id' => null,
  101. 'subject' => null,
  102. 'preview_url' => null,
  103. ],
  104. ];
  105. }
  106. }