| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- <?php
- namespace MailPoet\Tasks;
- if (!defined('ABSPATH')) exit;
- use MailPoet\Cron\Workers\Scheduler;
- use MailPoet\Models\Newsletter;
- use MailPoet\Models\ScheduledTask;
- use MailPoet\Models\SendingQueue;
- use MailPoet\Newsletter\Url as NewsletterUrl;
- class State {
- /** @var NewsletterUrl */
- private $newsletterUrl;
- public function __construct(
- NewsletterUrl $newsletterUrl
- ) {
- $this->newsletterUrl = $newsletterUrl;
- }
- /**
- * @return array
- */
- public function getCountsPerStatus() {
- $stats = [
- ScheduledTask::STATUS_COMPLETED => 0,
- ScheduledTask::STATUS_PAUSED => 0,
- ScheduledTask::STATUS_SCHEDULED => 0,
- ScheduledTask::VIRTUAL_STATUS_RUNNING => 0,
- ];
- $counts = ScheduledTask::rawQuery(
- "SELECT COUNT(*) as value, status
- FROM `" . ScheduledTask::$_table . "`
- WHERE deleted_at IS NULL AND `type` = 'sending'
- GROUP BY status;"
- )->findMany();
- foreach ($counts as $count) {
- if ($count->status === null) {
- $stats[ScheduledTask::VIRTUAL_STATUS_RUNNING] = (int)$count->value;
- continue;
- }
- $stats[$count->status] = (int)$count->value;
- }
- return $stats;
- }
- /**
- * @return array
- */
- public function getLatestTasks(
- $type = null,
- $statuses = [
- ScheduledTask::STATUS_COMPLETED,
- ScheduledTask::STATUS_SCHEDULED,
- ScheduledTask::VIRTUAL_STATUS_RUNNING,
- ],
- $limit = Scheduler::TASK_BATCH_SIZE
- ) {
- $tasks = [];
- foreach ($statuses as $status) {
- $query = ScheduledTask::orderByDesc('id')
- ->whereNull('deleted_at')
- ->limit($limit);
- if ($type) {
- $query = $query->where('type', $type);
- }
- if ($status === ScheduledTask::VIRTUAL_STATUS_RUNNING) {
- $query = $query->whereNull('status');
- } else {
- $query = $query->where('status', $status);
- }
- $tasks = array_merge($tasks, $query->findMany());
- }
- return array_map(function ($task) {
- return $this->buildTaskData($task);
- }, $tasks);
- }
- /**
- * @return array
- */
- private function buildTaskData(ScheduledTask $task) {
- $queue = $newsletter = null;
- if ($task->type === Sending::TASK_TYPE) {
- $queue = SendingQueue::where('task_id', $task->id)->findOne();
- $newsletter = $queue instanceof SendingQueue ? $queue->newsletter()->findOne() : null;
- }
- return [
- 'id' => (int)$task->id,
- 'type' => $task->type,
- 'priority' => (int)$task->priority,
- 'updated_at' => $task->updatedAt,
- 'scheduled_at' => $task->scheduledAt ? $task->scheduledAt : null,
- 'status' => $task->status,
- 'newsletter' => (($queue instanceof SendingQueue) && ($newsletter instanceof Newsletter)) ? [
- 'newsletter_id' => (int)$queue->newsletterId,
- 'queue_id' => (int)$queue->id,
- 'subject' => $queue->newsletterRenderedSubject ?: $newsletter->subject,
- 'preview_url' => $this->newsletterUrl->getViewInBrowserUrl(
- $newsletter,
- null,
- $queue
- ),
- ] : [
- 'newsletter_id' => null,
- 'queue_id' => null,
- 'subject' => null,
- 'preview_url' => null,
- ],
- ];
- }
- }
|