Add new segment to data mapper

[MAILPOET-3224]
This commit is contained in:
Pavel Dohnal
2021-04-14 10:17:40 +02:00
committed by Veljko V
parent 38f8f1d23f
commit deb6b9315e
6 changed files with 43 additions and 2 deletions

View File

@ -135,6 +135,8 @@ class DynamicSegments extends APIEndpoint {
return WPFunctions::get()->__('Please select product.', 'mailpoet');
case InvalidFilterException::MISSING_CATEGORY_ID:
return WPFunctions::get()->__('Please select category.', 'mailpoet');
case InvalidFilterException::MISSING_VALUE:
return WPFunctions::get()->__('Please fill all required values.', 'mailpoet');
default:
return WPFunctions::get()->__('An error occurred while saving data.', 'mailpoet');
}

View File

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

View File

@ -5,6 +5,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\EmailOpensAbsoluteCountAction;
use MailPoet\Segments\DynamicSegments\Filters\WooCommerceCategory;
use MailPoet\Segments\DynamicSegments\Filters\WooCommerceProduct;
@ -41,8 +42,9 @@ class FilterDataMapper {
*/
private function createEmail(array $data): DynamicSegmentFilterData {
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 ($data['action'] === EmailOpensAbsoluteCountAction::TYPE) return $this->createEmailOpensAbsoluteCount($data);
if (empty($data['newsletter_id'])) throw new InvalidFilterException('Missing newsletter id', InvalidFilterException::MISSING_NEWSLETTER_ID);
$filterData = [
'segmentType' => DynamicSegmentFilterData::TYPE_EMAIL,
'action' => $data['action'],
@ -54,6 +56,22 @@ class FilterDataMapper {
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
*/

View File

@ -21,6 +21,7 @@ class EmailAction implements Filter {
self::ACTION_NOT_OPENED,
self::ACTION_CLICKED,
self::ACTION_NOT_CLICKED,
EmailOpensAbsoluteCountAction::TYPE,
];
/** @var EntityManager */

View File

@ -42,5 +42,4 @@ class EmailOpensAbsoluteCountAction implements Filter {
$queryBuilder->setParameter('opens' . $filter->getId(), $filterData->getParam('opens'));
return $queryBuilder;
}
}

View File

@ -5,6 +5,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\EmailOpensAbsoluteCountAction;
use MailPoet\Segments\DynamicSegments\Filters\WooCommerceCategory;
use MailPoet\Segments\DynamicSegments\Filters\WooCommerceProduct;
@ -166,4 +167,23 @@ class FilterDataMapperTest extends \MailPoetUnitTest {
'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',
]);
}
}