Improve email action filter api data validation

[MAILPOET-3177]
This commit is contained in:
Rostislav Wolny
2021-03-05 16:50:50 +01:00
committed by Veljko V
parent 6bc557ecb0
commit 1b74c3e195
5 changed files with 22 additions and 1 deletions

View File

@ -95,6 +95,7 @@ class DynamicSegments extends APIEndpoint {
case InvalidFilterException::MISSING_ROLE:
return WPFunctions::get()->__('Please select user role.', 'mailpoet');
case InvalidFilterException::MISSING_ACTION:
case InvalidFilterException::INVALID_EMAIL_ACTION:
return WPFunctions::get()->__('Please select email action.', 'mailpoet');
case InvalidFilterException::MISSING_NEWSLETTER_ID:
return WPFunctions::get()->__('Please select an email.', 'mailpoet');

View File

@ -13,5 +13,6 @@ class InvalidFilterException extends InvalidStateException {
const MISSING_NEWSLETTER_ID = 5;
const MISSING_CATEGORY_ID = 6;
const MISSING_PRODUCT_ID = 7;
const INVALID_EMAIL_ACTION = 8;
};

View File

@ -4,6 +4,7 @@ namespace MailPoet\Segments\DynamicSegments;
use MailPoet\Entities\DynamicSegmentFilterData;
use MailPoet\Segments\DynamicSegments\Exceptions\InvalidFilterException;
use MailPoet\Segments\DynamicSegments\Filters\EmailAction;
use MailPoet\Segments\DynamicSegments\Filters\WooCommerceCategory;
use MailPoet\Segments\DynamicSegments\Filters\WooCommerceProduct;
@ -39,9 +40,9 @@ class FilterDataMapper {
* @throws InvalidFilterException
*/
private function createEmail(array $data): DynamicSegmentFilterData {
if (empty($data['action'])) throw new InvalidFilterException('Missing action', InvalidFilterException::MISSING_ACTION);
if (empty($data['action'])) throw new InvalidFilterException('Missing action', InvalidFilterException::MISSING_ACTION);
if (empty($data['newsletter_id'])) throw new InvalidFilterException('Missing newsletter id', InvalidFilterException::MISSING_NEWSLETTER_ID);
if (!in_array($data['action'], EmailAction::ALLOWED_ACTIONS)) throw new InvalidFilterException('Invalid email action', InvalidFilterException::INVALID_EMAIL_ACTION);
$filterData = [
'segmentType' => DynamicSegmentFilterData::TYPE_EMAIL,
'action' => $data['action'],

View File

@ -16,6 +16,13 @@ class EmailAction implements Filter {
const ACTION_CLICKED = 'clicked';
const ACTION_NOT_CLICKED = 'notClicked';
const ALLOWED_ACTIONS = [
self::ACTION_OPENED,
self::ACTION_NOT_OPENED,
self::ACTION_CLICKED,
self::ACTION_NOT_CLICKED,
];
/** @var EntityManager */
private $entityManager;

View File

@ -68,6 +68,17 @@ class FilterDataMapperTest extends \MailPoetUnitTest {
]);
}
public function testItChecksFilterEmailActionIsSupported() {
$this->expectException(InvalidFilterException::class);
$this->expectExceptionMessage('Invalid email action');
$this->expectExceptionCode(InvalidFilterException::INVALID_EMAIL_ACTION);
$this->mapper->map([
'segmentType' => DynamicSegmentFilterData::TYPE_EMAIL,
'newsletter_id' => 1,
'action' => 'unknown',
]);
}
public function testItMapsUserRoleFilter() {
$data = [
'segmentType' => DynamicSegmentFilterData::TYPE_USER_ROLE,