Add new segment to data mapper
[MAILPOET-3224]
This commit is contained in:
@ -135,6 +135,8 @@ class DynamicSegments extends APIEndpoint {
|
|||||||
return WPFunctions::get()->__('Please select product.', 'mailpoet');
|
return WPFunctions::get()->__('Please select product.', 'mailpoet');
|
||||||
case InvalidFilterException::MISSING_CATEGORY_ID:
|
case InvalidFilterException::MISSING_CATEGORY_ID:
|
||||||
return WPFunctions::get()->__('Please select category.', 'mailpoet');
|
return WPFunctions::get()->__('Please select category.', 'mailpoet');
|
||||||
|
case InvalidFilterException::MISSING_VALUE:
|
||||||
|
return WPFunctions::get()->__('Please fill all required values.', 'mailpoet');
|
||||||
default:
|
default:
|
||||||
return WPFunctions::get()->__('An error occurred while saving data.', 'mailpoet');
|
return WPFunctions::get()->__('An error occurred while saving data.', 'mailpoet');
|
||||||
}
|
}
|
||||||
|
@ -14,5 +14,6 @@ class InvalidFilterException extends InvalidStateException {
|
|||||||
const MISSING_CATEGORY_ID = 6;
|
const MISSING_CATEGORY_ID = 6;
|
||||||
const MISSING_PRODUCT_ID = 7;
|
const MISSING_PRODUCT_ID = 7;
|
||||||
const INVALID_EMAIL_ACTION = 8;
|
const INVALID_EMAIL_ACTION = 8;
|
||||||
|
const MISSING_VALUE = 9;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
@ -5,6 +5,7 @@ namespace MailPoet\Segments\DynamicSegments;
|
|||||||
use MailPoet\Entities\DynamicSegmentFilterData;
|
use MailPoet\Entities\DynamicSegmentFilterData;
|
||||||
use MailPoet\Segments\DynamicSegments\Exceptions\InvalidFilterException;
|
use MailPoet\Segments\DynamicSegments\Exceptions\InvalidFilterException;
|
||||||
use MailPoet\Segments\DynamicSegments\Filters\EmailAction;
|
use MailPoet\Segments\DynamicSegments\Filters\EmailAction;
|
||||||
|
use MailPoet\Segments\DynamicSegments\Filters\EmailOpensAbsoluteCountAction;
|
||||||
use MailPoet\Segments\DynamicSegments\Filters\WooCommerceCategory;
|
use MailPoet\Segments\DynamicSegments\Filters\WooCommerceCategory;
|
||||||
use MailPoet\Segments\DynamicSegments\Filters\WooCommerceProduct;
|
use MailPoet\Segments\DynamicSegments\Filters\WooCommerceProduct;
|
||||||
|
|
||||||
@ -41,8 +42,9 @@ class FilterDataMapper {
|
|||||||
*/
|
*/
|
||||||
private function createEmail(array $data): DynamicSegmentFilterData {
|
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);
|
if (!in_array($data['action'], EmailAction::ALLOWED_ACTIONS)) throw new InvalidFilterException('Invalid email action', InvalidFilterException::INVALID_EMAIL_ACTION);
|
||||||
|
if ($data['action'] === EmailOpensAbsoluteCountAction::TYPE) return $this->createEmailOpensAbsoluteCount($data);
|
||||||
|
if (empty($data['newsletter_id'])) throw new InvalidFilterException('Missing newsletter id', InvalidFilterException::MISSING_NEWSLETTER_ID);
|
||||||
$filterData = [
|
$filterData = [
|
||||||
'segmentType' => DynamicSegmentFilterData::TYPE_EMAIL,
|
'segmentType' => DynamicSegmentFilterData::TYPE_EMAIL,
|
||||||
'action' => $data['action'],
|
'action' => $data['action'],
|
||||||
@ -54,6 +56,22 @@ class FilterDataMapper {
|
|||||||
return new DynamicSegmentFilterData($filterData);
|
return new DynamicSegmentFilterData($filterData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @throws InvalidFilterException
|
||||||
|
*/
|
||||||
|
private function createEmailOpensAbsoluteCount(array $data): DynamicSegmentFilterData {
|
||||||
|
if (empty($data['opens'])) throw new InvalidFilterException('Missing number of opens', InvalidFilterException::MISSING_VALUE);
|
||||||
|
if (empty($data['days'])) throw new InvalidFilterException('Missing number of days', InvalidFilterException::MISSING_VALUE);
|
||||||
|
$filterData = [
|
||||||
|
'segmentType' => DynamicSegmentFilterData::TYPE_EMAIL,
|
||||||
|
'action' => $data['action'],
|
||||||
|
'opens' => $data['opens'],
|
||||||
|
'days' => $data['days'],
|
||||||
|
'operator' => $data['operator'] ?? 'more',
|
||||||
|
];
|
||||||
|
return new DynamicSegmentFilterData($filterData);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws InvalidFilterException
|
* @throws InvalidFilterException
|
||||||
*/
|
*/
|
||||||
|
@ -21,6 +21,7 @@ class EmailAction implements Filter {
|
|||||||
self::ACTION_NOT_OPENED,
|
self::ACTION_NOT_OPENED,
|
||||||
self::ACTION_CLICKED,
|
self::ACTION_CLICKED,
|
||||||
self::ACTION_NOT_CLICKED,
|
self::ACTION_NOT_CLICKED,
|
||||||
|
EmailOpensAbsoluteCountAction::TYPE,
|
||||||
];
|
];
|
||||||
|
|
||||||
/** @var EntityManager */
|
/** @var EntityManager */
|
||||||
|
@ -42,5 +42,4 @@ class EmailOpensAbsoluteCountAction implements Filter {
|
|||||||
$queryBuilder->setParameter('opens' . $filter->getId(), $filterData->getParam('opens'));
|
$queryBuilder->setParameter('opens' . $filter->getId(), $filterData->getParam('opens'));
|
||||||
return $queryBuilder;
|
return $queryBuilder;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ namespace MailPoet\Segments\DynamicSegments;
|
|||||||
use MailPoet\Entities\DynamicSegmentFilterData;
|
use MailPoet\Entities\DynamicSegmentFilterData;
|
||||||
use MailPoet\Segments\DynamicSegments\Exceptions\InvalidFilterException;
|
use MailPoet\Segments\DynamicSegments\Exceptions\InvalidFilterException;
|
||||||
use MailPoet\Segments\DynamicSegments\Filters\EmailAction;
|
use MailPoet\Segments\DynamicSegments\Filters\EmailAction;
|
||||||
|
use MailPoet\Segments\DynamicSegments\Filters\EmailOpensAbsoluteCountAction;
|
||||||
use MailPoet\Segments\DynamicSegments\Filters\WooCommerceCategory;
|
use MailPoet\Segments\DynamicSegments\Filters\WooCommerceCategory;
|
||||||
use MailPoet\Segments\DynamicSegments\Filters\WooCommerceProduct;
|
use MailPoet\Segments\DynamicSegments\Filters\WooCommerceProduct;
|
||||||
|
|
||||||
@ -166,4 +167,23 @@ class FilterDataMapperTest extends \MailPoetUnitTest {
|
|||||||
'action' => WooCommerceProduct::ACTION_PRODUCT,
|
'action' => WooCommerceProduct::ACTION_PRODUCT,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testItCreatesEmailOpens() {
|
||||||
|
$data = [
|
||||||
|
'segmentType' => DynamicSegmentFilterData::TYPE_EMAIL,
|
||||||
|
'action' => EmailOpensAbsoluteCountAction::TYPE,
|
||||||
|
'opens' => 5,
|
||||||
|
'days' => 3,
|
||||||
|
];
|
||||||
|
$filter = $this->mapper->map($data);
|
||||||
|
expect($filter)->isInstanceOf(DynamicSegmentFilterData::class);
|
||||||
|
expect($filter->getFilterType())->equals(DynamicSegmentFilterData::TYPE_EMAIL);
|
||||||
|
expect($filter->getData())->equals([
|
||||||
|
'segmentType' => DynamicSegmentFilterData::TYPE_EMAIL,
|
||||||
|
'action' => EmailOpensAbsoluteCountAction::TYPE,
|
||||||
|
'opens' => 5,
|
||||||
|
'days' => 3,
|
||||||
|
'operator' => 'more',
|
||||||
|
]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user