Pass filter-provided parameters to field value factories
[PREMIUM-253]
This commit is contained in:
@@ -7,6 +7,7 @@ use MailPoet\Automation\Engine\Data\FilterGroup;
|
||||
use MailPoet\Automation\Engine\Data\Filters;
|
||||
use MailPoet\Automation\Engine\Data\StepRunArgs;
|
||||
use MailPoet\Automation\Engine\Exceptions;
|
||||
use MailPoet\Automation\Engine\Integration\Filter;
|
||||
use MailPoet\Automation\Engine\Registry;
|
||||
|
||||
class FilterHandler {
|
||||
@@ -40,9 +41,10 @@ class FilterHandler {
|
||||
|
||||
public function matchesGroup(FilterGroup $group, StepRunArgs $args): bool {
|
||||
$operator = $group->getOperator();
|
||||
foreach ($group->getFilters() as $filter) {
|
||||
$value = $args->getFieldValue($filter->getFieldKey());
|
||||
$matches = $this->matchesFilter($filter, $value);
|
||||
foreach ($group->getFilters() as $filterData) {
|
||||
$filter = $this->getFilter($filterData);
|
||||
$value = $args->getFieldValue($filterData->getFieldKey(), $filter->getFieldParams($filterData));
|
||||
$matches = $filter->matches($filterData, $value);
|
||||
if ($operator === FilterGroup::OPERATOR_AND && !$matches) {
|
||||
return false;
|
||||
}
|
||||
@@ -53,12 +55,11 @@ class FilterHandler {
|
||||
return $operator === FilterGroup::OPERATOR_AND;
|
||||
}
|
||||
|
||||
/** @param mixed $value */
|
||||
private function matchesFilter(FilterData $data, $value): bool {
|
||||
private function getFilter(FilterData $data): Filter {
|
||||
$filter = $this->registry->getFilter($data->getFieldType());
|
||||
if (!$filter) {
|
||||
throw Exceptions::filterNotFound($data->getFieldType());
|
||||
}
|
||||
return $filter->matches($data, $value);
|
||||
return $filter;
|
||||
}
|
||||
}
|
||||
|
@@ -60,8 +60,8 @@ class Field {
|
||||
}
|
||||
|
||||
/** @return mixed */
|
||||
public function getValue(Payload $payload) {
|
||||
return $this->getFactory()($payload);
|
||||
public function getValue(Payload $payload, array $params = []) {
|
||||
return $this->getFactory()($payload, $params);
|
||||
}
|
||||
|
||||
public function getArgs(): array {
|
||||
|
@@ -137,7 +137,7 @@ class StepRunArgs {
|
||||
}
|
||||
|
||||
/** @return mixed */
|
||||
public function getFieldValue(string $key) {
|
||||
public function getFieldValue(string $key, array $params = []) {
|
||||
$field = $this->fields[$key] ?? null;
|
||||
$subjectKey = $this->fieldToSubjectMap[$key] ?? null;
|
||||
if (!$field || !$subjectKey) {
|
||||
@@ -146,7 +146,7 @@ class StepRunArgs {
|
||||
|
||||
$entry = $this->getSingleSubjectEntry($subjectKey);
|
||||
try {
|
||||
$value = $field->getValue($entry->getPayload());
|
||||
$value = $field->getValue($entry->getPayload(), $params);
|
||||
} catch (Throwable $e) {
|
||||
throw Exceptions::fieldLoadFailed($field->getKey(), $field->getArgs());
|
||||
}
|
||||
|
@@ -114,6 +114,42 @@ class FilterHandlerTest extends MailPoetUnitTest {
|
||||
$this->assertSame($expectation, $result);
|
||||
}
|
||||
|
||||
public function testItPassesFieldParams(): void {
|
||||
$filter = new FilterData('f', Field::TYPE_STRING, 'test:field-string', '', ['value' => 'abc']);
|
||||
$filters = new Filters('and', [new FilterGroup('g1', 'and', [$filter])]);
|
||||
$step = new Step('step', Step::TYPE_TRIGGER, 'test:step', [], [], $filters);
|
||||
|
||||
$fieldParams = null;
|
||||
$subject = $this->createSubject('subject', [
|
||||
new Field('test:field-string', Field::TYPE_STRING, 'Test field string', function ($payload, $params) use (&$fieldParams) {
|
||||
$fieldParams = $params;
|
||||
return 'abc';
|
||||
}),
|
||||
]);
|
||||
|
||||
$stepRunArgs = new StepRunArgs(
|
||||
$this->createMock(Automation::class),
|
||||
$this->createMock(AutomationRun::class),
|
||||
$step,
|
||||
[new SubjectEntry($subject, new SubjectData($subject->getKey(), []))],
|
||||
1
|
||||
);
|
||||
|
||||
$registry = Stub::make(Registry::class, [
|
||||
'filters' => [
|
||||
Field::TYPE_STRING => $this->createFilter(Field::TYPE_STRING),
|
||||
],
|
||||
]);
|
||||
|
||||
$handler = new FilterHandler($registry);
|
||||
$result = $handler->matchesFilters($stepRunArgs);
|
||||
$this->assertSame(true, $result);
|
||||
$this->assertSame([
|
||||
'test-param' => 'test-param-value',
|
||||
'test-param-data' => $filter,
|
||||
], $fieldParams);
|
||||
}
|
||||
|
||||
public function dataForTestItFilters(): array {
|
||||
return [
|
||||
// no filters
|
||||
@@ -287,7 +323,10 @@ class FilterHandlerTest extends MailPoetUnitTest {
|
||||
}
|
||||
|
||||
public function getFieldParams(FilterData $data): array {
|
||||
return [];
|
||||
return [
|
||||
'test-param' => 'test-param-value',
|
||||
'test-param-data' => $data,
|
||||
];
|
||||
}
|
||||
|
||||
public function matches(FilterData $data, $value): bool {
|
||||
|
Reference in New Issue
Block a user