CustomFieldsResponseBuilder.php
11 months ago
DynamicSegmentsResponseBuilder.php
2 months ago
FormsResponseBuilder.php
11 months ago
NewsletterTemplatesResponseBuilder.php
11 months ago
NewslettersResponseBuilder.php
3 weeks ago
ScheduledTaskSubscriberResponseBuilder.php
3 years ago
SegmentsResponseBuilder.php
2 months ago
SendingQueuesResponseBuilder.php
2 months ago
SubscribersResponseBuilder.php
2 weeks ago
index.php
3 years ago
SendingQueuesResponseBuilder.php
63 lines
| 1 | <?php declare(strict_types = 1); |
| 2 | |
| 3 | namespace MailPoet\API\JSON\ResponseBuilders; |
| 4 | |
| 5 | if (!defined('ABSPATH')) exit; |
| 6 | |
| 7 | |
| 8 | use MailPoet\Entities\NewsletterEntity; |
| 9 | use MailPoet\Entities\ScheduledTaskEntity; |
| 10 | use MailPoet\Entities\SendingQueueEntity; |
| 11 | use MailPoet\Newsletter\Sending\TimeZoneCampaignScheduler; |
| 12 | |
| 13 | class SendingQueuesResponseBuilder { |
| 14 | private ?TimeZoneCampaignScheduler $timeZoneCampaignScheduler; |
| 15 | |
| 16 | public function __construct( |
| 17 | ?TimeZoneCampaignScheduler $timeZoneCampaignScheduler = null |
| 18 | ) { |
| 19 | $this->timeZoneCampaignScheduler = $timeZoneCampaignScheduler; |
| 20 | } |
| 21 | |
| 22 | public function build(SendingQueueEntity $sendingQueue): array { |
| 23 | $task = $sendingQueue->getTask(); |
| 24 | if (!$task instanceof ScheduledTaskEntity) { |
| 25 | throw new \RuntimeException('Invalid state. SendingQueue has no ScheduledTask associated.'); |
| 26 | } |
| 27 | |
| 28 | // When $aggregateData is non-null we are looking at a time zone campaign and ALL its fields |
| 29 | // are authoritative — including a null `status`, which represents VIRTUAL_STATUS_RUNNING (a |
| 30 | // sibling batch is actively sending). Using `??` here would silently fall back to this single |
| 31 | // task's status (e.g. 'scheduled' for a future batch) and misreport the campaign. |
| 32 | $aggregateData = $this->timeZoneCampaignScheduler |
| 33 | ? $this->timeZoneCampaignScheduler->getAggregateQueueData($sendingQueue) |
| 34 | : null; |
| 35 | |
| 36 | return [ |
| 37 | 'id' => $sendingQueue->getId(), |
| 38 | 'type' => $task->getType(), |
| 39 | 'status' => $aggregateData ? $aggregateData['status'] : $task->getStatus(), |
| 40 | 'priority' => $task->getPriority(), |
| 41 | 'scheduled_at' => $this->getFormattedDateOrNull($aggregateData ? $aggregateData['scheduledAt'] : $task->getScheduledAt()), |
| 42 | 'processed_at' => $this->getFormattedDateOrNull($aggregateData ? $aggregateData['processedAt'] : $task->getProcessedAt()), |
| 43 | 'created_at' => $this->getFormattedDateOrNull($task->getCreatedAt()), |
| 44 | 'updated_at' => $this->getFormattedDateOrNull($task->getUpdatedAt()), |
| 45 | 'deleted_at' => $this->getFormattedDateOrNull($task->getDeletedAt()), |
| 46 | 'in_progress' => $task->getInProgress(), |
| 47 | 'reschedule_count' => $task->getRescheduleCount(), |
| 48 | 'meta' => $aggregateData ? $aggregateData['meta'] : $sendingQueue->getMeta(), |
| 49 | 'task_id' => $task->getId(), |
| 50 | 'newsletter_id' => ($sendingQueue->getNewsletter() instanceof NewsletterEntity) ? $sendingQueue->getNewsletter()->getId() : null, |
| 51 | 'newsletter_rendered_body' => $sendingQueue->getNewsletterRenderedBody(), |
| 52 | 'newsletter_rendered_subject' => $sendingQueue->getNewsletterRenderedSubject(), |
| 53 | 'count_total' => $aggregateData ? $aggregateData['countTotal'] : $sendingQueue->getCountTotal(), |
| 54 | 'count_processed' => $aggregateData ? $aggregateData['countProcessed'] : $sendingQueue->getCountProcessed(), |
| 55 | 'count_to_process' => $aggregateData ? $aggregateData['countToProcess'] : $sendingQueue->getCountToProcess(), |
| 56 | ]; |
| 57 | } |
| 58 | |
| 59 | private function getFormattedDateOrNull(?\DateTimeInterface $date): ?string { |
| 60 | return $date ? $date->format('Y-m-d H:i:s') : null; |
| 61 | } |
| 62 | } |
| 63 |