From c8fdf6e7f04b123fdeee0ccc73edaaa2bc26623c Mon Sep 17 00:00:00 2001 From: Jan Jakes Date: Wed, 14 Jun 2023 17:18:37 +0200 Subject: [PATCH] Add filters to to automation template builder [MAILPOET-5372] --- .../MailPoet/Templates/AutomationBuilder.php | 60 ++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/mailpoet/lib/Automation/Integrations/MailPoet/Templates/AutomationBuilder.php b/mailpoet/lib/Automation/Integrations/MailPoet/Templates/AutomationBuilder.php index 0b3ec8ca4a..b75aed8c82 100644 --- a/mailpoet/lib/Automation/Integrations/MailPoet/Templates/AutomationBuilder.php +++ b/mailpoet/lib/Automation/Integrations/MailPoet/Templates/AutomationBuilder.php @@ -3,8 +3,12 @@ namespace MailPoet\Automation\Integrations\MailPoet\Templates; use MailPoet\Automation\Engine\Data\Automation; +use MailPoet\Automation\Engine\Data\Filter; +use MailPoet\Automation\Engine\Data\FilterGroup; +use MailPoet\Automation\Engine\Data\Filters; use MailPoet\Automation\Engine\Data\NextStep; use MailPoet\Automation\Engine\Data\Step; +use MailPoet\Automation\Engine\Exceptions\InvalidStateException; use MailPoet\Automation\Engine\Integration\Trigger; use MailPoet\Automation\Engine\Registry; use MailPoet\Util\Security; @@ -27,6 +31,17 @@ class AutomationBuilder { * array{ * key: string, * args?: array, + * filters?: array{ + * operator: 'and' | 'or', + * groups: array{ + * operator: 'and' | 'or', + * filters: array{ + * field: string, + * condition: string, + * value: mixed, + * }[], + * }[], + * }, * } * > $sequence * @param array $meta @@ -42,12 +57,14 @@ class AutomationBuilder { continue; } $args = array_merge($this->getDefaultArgs($automationStep->getArgsSchema()), $data['args'] ?? []); + $filters = isset($data['filters']) ? $this->getFilters($data['filters']) : null; $step = new Step( $this->uniqueId(), in_array(Trigger::class, (array)class_implements($automationStep)) ? Step::TYPE_TRIGGER : Step::TYPE_ACTION, $stepKey, $args, - $nextSteps + $nextSteps, + $filters ); $nextSteps = [new NextStep($step->getId())]; $steps[$step->getId()] = $step; @@ -78,4 +95,45 @@ class AutomationBuilder { } return $args; } + + /** + * @param array{ + * operator: 'and' | 'or', + * groups: array{ + * operator: 'and' | 'or', + * filters: array{ + * field: string, + * condition: string, + * value: mixed, + * }[], + * }[], + * } $filters + * @return Filters + */ + private function getFilters(array $filters): Filters { + $groups = []; + foreach ($filters['groups'] as $group) { + $groups[] = new FilterGroup( + $this->uniqueId(), + $group['operator'], + array_map( + function (array $filter): Filter { + $field = $this->registry->getField($filter['field']); + if (!$field) { + throw new InvalidStateException(sprintf("Field with key '%s' not found", $filter['field'])); + } + return new Filter( + $this->uniqueId(), + $field->getType(), + $filter['field'], + $filter['condition'], + ['value' => $filter['value']] + ); + }, + $group['filters'] + ) + ); + } + return new Filters($filters['operator'], $groups); + } }