169 lines
6.5 KiB
PHP
169 lines
6.5 KiB
PHP
<?php declare(strict_types = 1);
|
||
|
||
namespace MailPoet\AdminPages\Pages;
|
||
|
||
if (!defined('ABSPATH')) exit;
|
||
|
||
|
||
use MailPoet\AdminPages\PageRenderer;
|
||
use MailPoet\Cron\ActionScheduler\Actions\DaemonRun;
|
||
use MailPoet\Cron\ActionScheduler\Actions\DaemonTrigger;
|
||
use MailPoet\Cron\CronHelper;
|
||
use MailPoet\Cron\Workers\SendingQueue\SendingQueue;
|
||
use MailPoet\Entities\ScheduledTaskEntity;
|
||
use MailPoet\Mailer\MailerLog;
|
||
use MailPoet\Newsletter\Sending\ScheduledTasksRepository;
|
||
use MailPoet\Newsletter\Sending\SendingQueuesRepository;
|
||
use MailPoet\Newsletter\Url as NewsletterURL;
|
||
use MailPoet\Router\Endpoints\CronDaemon;
|
||
use MailPoet\Services\Bridge;
|
||
use MailPoet\SystemReport\SystemReportCollector;
|
||
use MailPoet\WP\DateTime;
|
||
use MailPoet\WP\Functions as WPFunctions;
|
||
|
||
class Help {
|
||
private PageRenderer $pageRenderer;
|
||
private CronHelper $cronHelper;
|
||
private SystemReportCollector $systemReportCollector;
|
||
private Bridge $bridge;
|
||
private ScheduledTasksRepository $scheduledTasksRepository;
|
||
private SendingQueuesRepository $sendingQueuesRepository;
|
||
private NewsletterURL $newsletterUrl;
|
||
|
||
public function __construct(
|
||
PageRenderer $pageRenderer,
|
||
CronHelper $cronHelper,
|
||
SystemReportCollector $systemReportCollector,
|
||
Bridge $bridge,
|
||
ScheduledTasksRepository $scheduledTasksRepository,
|
||
SendingQueuesRepository $sendingQueuesRepository,
|
||
NewsletterURL $newsletterUrl
|
||
) {
|
||
$this->pageRenderer = $pageRenderer;
|
||
$this->cronHelper = $cronHelper;
|
||
$this->systemReportCollector = $systemReportCollector;
|
||
$this->bridge = $bridge;
|
||
$this->scheduledTasksRepository = $scheduledTasksRepository;
|
||
$this->sendingQueuesRepository = $sendingQueuesRepository;
|
||
$this->newsletterUrl = $newsletterUrl;
|
||
}
|
||
|
||
public function render() {
|
||
/**
|
||
* Filter the system info.
|
||
*
|
||
* @param array<string, string> $systemInfoData The system info data array.
|
||
*/
|
||
$systemInfoData = WPFunctions::get()->applyFilters('mailpoet_system_info_data', $this->systemReportCollector->getData(true));
|
||
|
||
try {
|
||
$cronPingUrl = $this->cronHelper->getCronUrl(CronDaemon::ACTION_PING);
|
||
$cronPingResponse = $this->systemReportCollector->getCronPingResponse();
|
||
} catch (\Exception $e) {
|
||
$cronPingResponse = __('Can‘t generate cron URL.', 'mailpoet') . ' (' . $e->getMessage() . ')';
|
||
$cronPingUrl = $cronPingResponse;
|
||
}
|
||
|
||
$mailerLog = MailerLog::getMailerLog();
|
||
$mailerLog['sent'] = MailerLog::sentSince();
|
||
$bridgePingResponse = $this->systemReportCollector->getBridgePingResponse();
|
||
$systemStatusData = [
|
||
'cron' => [
|
||
'url' => $cronPingUrl,
|
||
'isReachable' => $this->cronHelper->validatePingResponse($cronPingResponse),
|
||
'pingResponse' => $cronPingResponse,
|
||
],
|
||
'mss' => [
|
||
'enabled' => $this->bridge->isMailpoetSendingServiceEnabled(),
|
||
'isReachable' => $this->bridge->validateBridgePingResponse($bridgePingResponse),
|
||
],
|
||
'cronStatus' => $this->cronHelper->getDaemon(),
|
||
'queueStatus' => $mailerLog,
|
||
];
|
||
|
||
$systemStatusData['cronStatus']['accessible'] = $this->cronHelper->isDaemonAccessible();
|
||
$systemStatusData['queueStatus']['tasksStatusCounts'] = $this->scheduledTasksRepository->getCountsPerStatus();
|
||
|
||
$scheduledTasks = $this->scheduledTasksRepository->getLatestTasks(SendingQueue::TASK_TYPE);
|
||
$systemStatusData['queueStatus']['latestTasks'] = array_map(fn($task) => $this->buildTaskData($task), $scheduledTasks);
|
||
|
||
$this->pageRenderer->displayPage(
|
||
'help.html',
|
||
[
|
||
'systemInfoData' => $systemInfoData,
|
||
'systemStatusData' => $systemStatusData,
|
||
'actionSchedulerData' => $this->getActionSchedulerData(),
|
||
]
|
||
);
|
||
}
|
||
|
||
private function getActionSchedulerData(): ?array {
|
||
if (!class_exists(\ActionScheduler_Store::class)) {
|
||
return null;
|
||
}
|
||
$actionSchedulerData = [];
|
||
$actionSchedulerData['version'] = \ActionScheduler_Versions::instance()->latest_version();
|
||
$actionSchedulerData['storage'] = str_replace('ActionScheduler_', '', get_class(\ActionScheduler_Store::instance()));
|
||
$actionSchedulerData['latestTrigger'] = $this->getLatestActionSchedulerActionDate(DaemonTrigger::NAME);
|
||
$actionSchedulerData['latestCompletedTrigger'] = $this->getLatestActionSchedulerActionDate(DaemonTrigger::NAME, 'complete');
|
||
$actionSchedulerData['latestCompletedRun'] = $this->getLatestActionSchedulerActionDate(DaemonRun::NAME, 'complete');
|
||
return $actionSchedulerData;
|
||
}
|
||
|
||
private function getLatestActionSchedulerActionDate(string $hook, ?string $status = null): ?string {
|
||
$query = [
|
||
'per_page' => 1,
|
||
'order' => 'DESC',
|
||
'hook' => $hook,
|
||
];
|
||
if ($status) {
|
||
$query['status'] = $status;
|
||
}
|
||
$store = \ActionScheduler_Store::instance();
|
||
$action = $store->query_actions($query);
|
||
if (!empty($action)) {
|
||
$dateObject = $store->get_date($action[0]);
|
||
return $dateObject->format('Y-m-d H:i:s');
|
||
}
|
||
return null;
|
||
}
|
||
|
||
public function buildTaskData(ScheduledTaskEntity $task): array {
|
||
$queue = $newsletter = $subscriber = null;
|
||
if ($task->getType() === SendingQueue::TASK_TYPE) {
|
||
$queue = $this->sendingQueuesRepository->findOneBy(['task' => $task]);
|
||
$newsletter = $queue ? $queue->getNewsletter() : null;
|
||
$subscribers = $task->getSubscribers();
|
||
// We only show subscriber's email for 1:1 emails (e.g. automations) and not bulk campaigns
|
||
if ($subscribers->count() === 1) {
|
||
$subscriber = $subscribers->first() ? $subscribers->first()->getSubscriber() : null;
|
||
}
|
||
}
|
||
|
||
return [
|
||
'id' => $task->getId(),
|
||
'type' => $task->getType(),
|
||
'priority' => $task->getPriority(),
|
||
'updatedAt' => $task->getUpdatedAt()->format(DateTime::DEFAULT_DATE_TIME_FORMAT),
|
||
'scheduledAt' => $task->getScheduledAt() ?
|
||
$task->getScheduledAt()->format(DateTime::DEFAULT_DATE_TIME_FORMAT)
|
||
: null,
|
||
'cancelledAt' => $task->getCancelledAt() ?
|
||
$task->getCancelledAt()->format(DateTime::DEFAULT_DATE_TIME_FORMAT)
|
||
: null,
|
||
'status' => $task->getStatus(),
|
||
'newsletter' => $queue && $newsletter ? [
|
||
'newsletterId' => $newsletter->getId(),
|
||
'queueId' => $queue->getId(),
|
||
'subject' => $queue->getNewsletterRenderedSubject() ?: $newsletter->getSubject(),
|
||
'previewUrl' => $this->newsletterUrl->getViewInBrowserUrl($newsletter, null, $queue),
|
||
] : [
|
||
'newsletterId' => null,
|
||
'queueId' => null,
|
||
'subject' => null,
|
||
'previewUrl' => null,
|
||
],
|
||
'subscriberEmail' => $subscriber ? $subscriber->getEmail() : null,
|
||
];
|
||
}
|
||
}
|