Add cron pinging endpoint

[MAILPOET-6029]
This commit is contained in:
alex-mpoet
2024-06-03 16:26:24 +03:00
committed by Aschepikov
parent 07ef513bce
commit c59ae2d82c
2 changed files with 62 additions and 1 deletions

View File

@@ -8,6 +8,7 @@ use MailPoet\API\JSON\Response;
use MailPoet\API\JSON\ResponseBuilders\SendingQueuesResponseBuilder; use MailPoet\API\JSON\ResponseBuilders\SendingQueuesResponseBuilder;
use MailPoet\Config\AccessControl; use MailPoet\Config\AccessControl;
use MailPoet\Cron\ActionScheduler\Actions\DaemonTrigger; use MailPoet\Cron\ActionScheduler\Actions\DaemonTrigger;
use MailPoet\Cron\CronHelper;
use MailPoet\Cron\CronTrigger; use MailPoet\Cron\CronTrigger;
use MailPoet\Cron\Triggers\WordPress; use MailPoet\Cron\Triggers\WordPress;
use MailPoet\Cron\Workers\SendingQueue\SendingQueue as SendingQueueWorker; use MailPoet\Cron\Workers\SendingQueue\SendingQueue as SendingQueueWorker;
@@ -59,6 +60,9 @@ class SendingQueue extends APIEndpoint {
/** @var SendingQueuesResponseBuilder */ /** @var SendingQueuesResponseBuilder */
private $sendingQueuesResponseBuilder; private $sendingQueuesResponseBuilder;
/** @var CronHelper */
private $cronHelper;
public function __construct( public function __construct(
SubscribersFeature $subscribersFeature, SubscribersFeature $subscribersFeature,
NewslettersRepository $newsletterRepository, NewslettersRepository $newsletterRepository,
@@ -69,7 +73,8 @@ class SendingQueue extends APIEndpoint {
SettingsController $settings, SettingsController $settings,
DaemonTrigger $actionSchedulerDaemonTriggerAction, DaemonTrigger $actionSchedulerDaemonTriggerAction,
NewsletterValidator $newsletterValidator, NewsletterValidator $newsletterValidator,
SendingQueuesResponseBuilder $sendingQueuesResponseBuilder SendingQueuesResponseBuilder $sendingQueuesResponseBuilder,
CronHelper $cronHelper
) { ) {
$this->subscribersFeature = $subscribersFeature; $this->subscribersFeature = $subscribersFeature;
$this->subscribersFinder = $subscribersFinder; $this->subscribersFinder = $subscribersFinder;
@@ -81,6 +86,7 @@ class SendingQueue extends APIEndpoint {
$this->actionSchedulerDaemonTriggerAction = $actionSchedulerDaemonTriggerAction; $this->actionSchedulerDaemonTriggerAction = $actionSchedulerDaemonTriggerAction;
$this->newsletterValidator = $newsletterValidator; $this->newsletterValidator = $newsletterValidator;
$this->sendingQueuesResponseBuilder = $sendingQueuesResponseBuilder; $this->sendingQueuesResponseBuilder = $sendingQueuesResponseBuilder;
$this->cronHelper = $cronHelper;
} }
public function add($data = []) { public function add($data = []) {
@@ -245,6 +251,22 @@ class SendingQueue extends APIEndpoint {
} }
} }
public function pingCron() {
try {
$cronPingResponse = $this->cronHelper->pingDaemon();
} catch (\Exception $e) {
return $this->errorResponse([
APIError::UNKNOWN => $e->getMessage(),
]);
}
if (!$this->cronHelper->validatePingResponse($cronPingResponse)) {
return $this->errorResponse([
APIError::UNKNOWN => $cronPingResponse,
]);
}
return $this->successResponse();
}
/** /**
* In case the newsletter was switched to sending trigger the background job immediately. * In case the newsletter was switched to sending trigger the background job immediately.
* This is done so that user immediately sees that email is sending and doesn't have to wait on WP Cron to start it. * This is done so that user immediately sees that email is sending and doesn't have to wait on WP Cron to start it.

View File

@@ -5,6 +5,8 @@ namespace MailPoet\Test\API\JSON\v1;
use Codeception\Util\Stub; use Codeception\Util\Stub;
use MailPoet\API\JSON\Response as APIResponse; use MailPoet\API\JSON\Response as APIResponse;
use MailPoet\API\JSON\v1\SendingQueue as SendingQueueAPI; use MailPoet\API\JSON\v1\SendingQueue as SendingQueueAPI;
use MailPoet\Cron\CronHelper;
use MailPoet\Cron\DaemonHttpRunner;
use MailPoet\Cron\Workers\SendingQueue\SendingQueue; use MailPoet\Cron\Workers\SendingQueue\SendingQueue;
use MailPoet\Entities\NewsletterEntity; use MailPoet\Entities\NewsletterEntity;
use MailPoet\Entities\ScheduledTaskEntity; use MailPoet\Entities\ScheduledTaskEntity;
@@ -228,4 +230,41 @@ class SendingQueueTest extends \MailPoetTest {
$this->assertSame($expectedResult, $data); $this->assertSame($expectedResult, $data);
} }
public function testItReturnsErrorIfCronPingThrowsException() {
$errorMessage = 'some error';
$sendingQueue = $this->getServiceWithOverrides(SendingQueueAPI::class, [
'cronHelper' => Stub::make(CronHelper::class, ['pingDaemon' => function () use ($errorMessage) {
throw new \Exception($errorMessage);
}]),
]);
$response = $sendingQueue->pingCron();
$response = $response->getData();
verify($response['errors'][0])->isArray();
verify($response['errors'][0]['message'])->stringContainsString($errorMessage);
verify($response['errors'][0]['error'])->stringContainsString('unknown');
}
public function testItReturnsErrorIfCronPingResponseIsInvalid() {
$errorResponse = 'timed out';
$sendingQueue = $this->getServiceWithOverrides(SendingQueueAPI::class, [
'cronHelper' => Stub::make(CronHelper::class, ['pingDaemon' => $errorResponse]),
]);
$response = $sendingQueue->pingCron();
$response = $response->getData();
verify($response['errors'][0])->isArray();
verify($response['errors'][0]['message'])->stringContainsString($errorResponse);
verify($response['errors'][0]['error'])->stringContainsString('unknown');
}
public function testItPingsCronSuccessfully() {
$sendingQueue = $this->getServiceWithOverrides(SendingQueueAPI::class, [
'cronHelper' => Stub::make(CronHelper::class, ['pingDaemon' => DaemonHttpRunner::PING_SUCCESS_RESPONSE]),
]);
$response = $sendingQueue->pingCron();
verify($response->status)->equals(200);
$response = $response->getData();
verify($response['data'])->empty();
verify(empty($response['errors']))->true();
}
} }