Pass filter-provided parameters to field value factories

[PREMIUM-253]
This commit is contained in:
Jan Jakes
2024-02-02 16:31:39 +01:00
committed by Aschepikov
parent 467f1f8c8c
commit 7f63445f5a
4 changed files with 51 additions and 11 deletions

View File

@@ -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;
}
}

View File

@@ -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 {

View File

@@ -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());
}

View File

@@ -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 {