Files
piratepoet/lib/Mailer/Methods/ErrorMappers/MailPoetMapper.php
Rostislav Wolny 223c2e1562 Add subscriber errors passing via MailerError object
We want to process errors for individual subscribers.
Subscriber errors were inlined into error message string.
This commit changes this so that we are now able to get
subscriber errors as a data which are easy to process further.

[MAILPOET-1154]
2018-09-13 09:48:54 +02:00

77 lines
2.7 KiB
PHP

<?php
namespace MailPoet\Mailer\Methods\ErrorMappers;
use MailPoet\Mailer\MailerError;
use MailPoet\Mailer\SubscriberError;
use MailPoet\Services\Bridge\API;
use InvalidArgumentException;
if(!defined('ABSPATH')) exit;
class MailPoetMapper {
use ConnectionErrorMapperTrait;
const TEMPORARY_UNAVAILABLE_RETRY_INTERVAL = 300; // seconds
function getInvalidApiKeyError() {
return new MailerError(
MailerError::OPERATION_SEND,
MailerError::LEVEL_HARD,
__('MailPoet API key is invalid!', 'mailpoet')
);
}
function getErrorForResult(array $result, $subscribers) {
$level = MailerError::LEVEL_HARD;
$retry_interval = null;
$subscribers_errors = [];
$result_code = !empty($result['code']) ? $result['code'] : null;
switch($result_code) {
case API::RESPONSE_CODE_NOT_ARRAY:
$message = __('JSON input is not an array', 'mailpoet');
break;
case API::RESPONSE_CODE_PAYLOAD_ERROR:
$result_parsed = json_decode($result['message'], true);
$message = __('Error while sending.', 'mailpoet');
if(is_array($result_parsed)) {
try {
$subscribers_errors = $this->getSubscribersErrors($result_parsed, $subscribers);
} catch (InvalidArgumentException $e) {
$message .= ' ' . $e->getMessage();
}
} else {
$message .= ' ' . $result['message'];
}
break;
case API::RESPONSE_CODE_TEMPORARY_UNAVAILABLE:
$message = __('Email service is temporarily not available, please try again in a few minutes.', 'mailpoet');
$retry_interval = self::TEMPORARY_UNAVAILABLE_RETRY_INTERVAL;
break;
case API::RESPONSE_CODE_KEY_INVALID:
case API::RESPONSE_CODE_PAYLOAD_TOO_BIG:
default:
$message = $result['message'];
}
return new MailerError(MailerError::OPERATION_SEND, $level, $message, $retry_interval, $subscribers_errors);
}
private function getSubscribersErrors($result_parsed, $subscribers) {
$errors = [];
foreach($result_parsed as $result_error) {
if(!is_array($result_error) || !isset($result_error['index']) || !isset($subscribers[$result_error['index']])) {
throw new InvalidArgumentException( __('Invalid MSS response format.', 'mailpoet'));
}
$subscriber_errors = [];
if(isset($result_error['errors']) && is_array($result_error['errors'])) {
array_walk_recursive($result_error['errors'], function($item) use (&$subscriber_errors) {
$subscriber_errors[] = $item;
});
}
$message = join(', ', $subscriber_errors);
$errors[] = new SubscriberError($subscribers[$result_error['index']], $message);
}
return $errors;
}
}