Rewrite SendingErrorHandler using Doctrine
[MAILPOET-5682]
This commit is contained in:
@ -2,30 +2,36 @@
|
|||||||
|
|
||||||
namespace MailPoet\Cron\Workers\SendingQueue;
|
namespace MailPoet\Cron\Workers\SendingQueue;
|
||||||
|
|
||||||
|
use MailPoet\Entities\ScheduledTaskEntity;
|
||||||
use MailPoet\Mailer\MailerError;
|
use MailPoet\Mailer\MailerError;
|
||||||
use MailPoet\Mailer\MailerLog;
|
use MailPoet\Mailer\MailerLog;
|
||||||
use MailPoet\Tasks\Sending as SendingTask;
|
use MailPoet\Newsletter\Sending\ScheduledTaskSubscribersRepository;
|
||||||
|
|
||||||
class SendingErrorHandler {
|
class SendingErrorHandler {
|
||||||
|
/** @var ScheduledTaskSubscribersRepository */
|
||||||
|
private $scheduledTaskSubscribersRepository;
|
||||||
|
|
||||||
/** @var SendingThrottlingHandler */
|
/** @var SendingThrottlingHandler */
|
||||||
private $throttlingHandler;
|
private $throttlingHandler;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
|
ScheduledTaskSubscribersRepository $scheduledTaskSubscribersRepository,
|
||||||
SendingThrottlingHandler $throttlingHandler
|
SendingThrottlingHandler $throttlingHandler
|
||||||
) {
|
) {
|
||||||
|
$this->scheduledTaskSubscribersRepository = $scheduledTaskSubscribersRepository;
|
||||||
$this->throttlingHandler = $throttlingHandler;
|
$this->throttlingHandler = $throttlingHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function processError(
|
public function processError(
|
||||||
MailerError $error,
|
MailerError $error,
|
||||||
SendingTask $sendingTask,
|
ScheduledTaskEntity $task,
|
||||||
array $preparedSubscribersIds,
|
array $preparedSubscribersIds,
|
||||||
array $preparedSubscribers
|
array $preparedSubscribers
|
||||||
) {
|
) {
|
||||||
if ($error->getLevel() === MailerError::LEVEL_HARD) {
|
if ($error->getLevel() === MailerError::LEVEL_HARD) {
|
||||||
return $this->processHardError($error);
|
return $this->processHardError($error);
|
||||||
}
|
}
|
||||||
$this->processSoftError($error, $sendingTask, $preparedSubscribersIds, $preparedSubscribers);
|
$this->processSoftError($error, $task, $preparedSubscribersIds, $preparedSubscribers);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function processHardError(MailerError $error) {
|
private function processHardError(MailerError $error) {
|
||||||
@ -40,11 +46,11 @@ class SendingErrorHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function processSoftError(MailerError $error, SendingTask $sendingTask, $preparedSubscribersIds, $preparedSubscribers) {
|
private function processSoftError(MailerError $error, ScheduledTaskEntity $task, $preparedSubscribersIds, $preparedSubscribers) {
|
||||||
foreach ($error->getSubscriberErrors() as $subscriberError) {
|
foreach ($error->getSubscriberErrors() as $subscriberError) {
|
||||||
$subscriberIdIndex = array_search($subscriberError->getEmail(), $preparedSubscribers);
|
$subscriberIdIndex = array_search($subscriberError->getEmail(), $preparedSubscribers);
|
||||||
$message = $subscriberError->getMessage() ?: $error->getMessage();
|
$message = $subscriberError->getMessage() ?: $error->getMessage();
|
||||||
$sendingTask->saveSubscriberError($preparedSubscribersIds[$subscriberIdIndex], $message);
|
$this->scheduledTaskSubscribersRepository->saveError($task, $preparedSubscribersIds[$subscriberIdIndex], $message ?? '');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -508,11 +508,7 @@ class SendingQueue {
|
|||||||
// log error message and schedule retry/pause sending
|
// log error message and schedule retry/pause sending
|
||||||
if ($sendResult['response'] === false) {
|
if ($sendResult['response'] === false) {
|
||||||
$error = $sendResult['error'];
|
$error = $sendResult['error'];
|
||||||
$legacyTask = ScheduledTask::findOne($task->getId());
|
$this->errorHandler->processError($error, $task, $preparedSubscribersIds, $preparedSubscribers);
|
||||||
$legacyQueue = $legacyTask ? SendingTask::createFromScheduledTask($legacyTask) : null;
|
|
||||||
if ($legacyQueue) {
|
|
||||||
$this->errorHandler->processError($error, $legacyQueue, $preparedSubscribersIds, $preparedSubscribers);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
$queue = $task->getSendingQueue();
|
$queue = $task->getSendingQueue();
|
||||||
if (!$queue) {
|
if (!$queue) {
|
||||||
|
@ -279,23 +279,6 @@ class Sending {
|
|||||||
return $this->updateCount(count($processedSubscribers))->getErrors() === false;
|
return $this->updateCount(count($processedSubscribers))->getErrors() === false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function saveSubscriberError($subcriberId, $errorMessage) {
|
|
||||||
$this->scheduledTaskSubscribersRepository->saveError($this->scheduledTaskEntity, $subcriberId, $errorMessage);
|
|
||||||
|
|
||||||
$this->updateTaskStatus();
|
|
||||||
|
|
||||||
return $this->updateCount()->getErrors() === false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function updateTaskStatus() {
|
|
||||||
// we need to update those fields here as the Sending class is in a mixed state using Paris and Doctrine at the same time
|
|
||||||
// this probably won't be necessary anymore once https://mailpoet.atlassian.net/browse/MAILPOET-4375 is finished
|
|
||||||
$this->task->status = $this->scheduledTaskEntity->getStatus();
|
|
||||||
if (!is_null($this->scheduledTaskEntity->getProcessedAt())) {
|
|
||||||
$this->task->processedAt = $this->scheduledTaskEntity->getProcessedAt()->format('Y-m-d H:i:s');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function updateCount(?int $count = null) {
|
public function updateCount(?int $count = null) {
|
||||||
if ($count) {
|
if ($count) {
|
||||||
// increment/decrement counts based on known subscriber count, don't exceed the bounds
|
// increment/decrement counts based on known subscriber count, don't exceed the bounds
|
||||||
|
Reference in New Issue
Block a user