diff --git a/mailpoet/lib/Automation/Engine/Control/SubjectTransformerHandler.php b/mailpoet/lib/Automation/Engine/Control/SubjectTransformerHandler.php index c9474f6075..984c370a35 100644 --- a/mailpoet/lib/Automation/Engine/Control/SubjectTransformerHandler.php +++ b/mailpoet/lib/Automation/Engine/Control/SubjectTransformerHandler.php @@ -5,7 +5,7 @@ namespace MailPoet\Automation\Engine\Control; use MailPoet\Automation\Engine\Data\Automation; use MailPoet\Automation\Engine\Data\AutomationRun; use MailPoet\Automation\Engine\Data\Step as StepData; -use MailPoet\Automation\Engine\Data\Subject as SubjectData; +use MailPoet\Automation\Engine\Data\Subject; use MailPoet\Automation\Engine\Integration\Step; use MailPoet\Automation\Engine\Integration\SubjectTransformer; use MailPoet\Automation\Engine\Integration\Trigger; @@ -97,7 +97,42 @@ class SubjectTransformerHandler { } /** - * @return SubjectData[]|null + * @param Trigger $trigger + * @param Subject ...$subjects + * @return Subject[] + */ + public function provideAllSubjects(Trigger $trigger, Subject ...$subjects): array { + $allSubjectsKeys = $this->subjectKeysForTrigger($trigger); + $allSubjectKeyTargets = array_diff($allSubjectsKeys, array_map( + function(Subject $subject): string { + return $subject->getKey(); + }, + $subjects + )); + + $allSubjects = []; + foreach ($subjects as $existingSubject) { + $allSubjects[$existingSubject->getKey()] = $existingSubject; + } + foreach ($allSubjectKeyTargets as $target) { + if (isset($allSubjects[$target])) { + continue; + } + foreach ($subjects as $subject) { + $transformedSubject = $this->transformSubjectTo($subject, $target); + if ($transformedSubject) { + $allSubjects[$transformedSubject->getKey()] = $transformedSubject; + } + } + } + while (count($allSubjects) < count($allSubjectsKeys)) { + $allSubjects = $this->provideAllSubjects($trigger, ...array_values($allSubjects)); + } + return array_values($allSubjects); + } + + /** + * @return Subject[]|null */ public function transformSubjectData(string $target, AutomationRun $automationRun): ?array { $automation = $this->automationStorage->getAutomation($automationRun->getAutomationId(), $automationRun->getVersionId()); @@ -108,18 +143,26 @@ class SubjectTransformerHandler { $transformedSubjects = []; $subjects = $automationRun->getSubjects(); foreach ($subjects as $subject) { - $transformerChain = $this->getTransformerChain($subject->getKey(), $target); - if (!$transformerChain) { + $transformedSubject = $this->transformSubjectTo($subject, $target); + if (!$transformedSubject) { continue; } - foreach ($transformerChain as $transformer) { - $subject = $transformer->transform($subject); - } $transformedSubjects[] = $subject; } return count($transformedSubjects) > 0 ? $transformedSubjects : null; } + private function transformSubjectTo(Subject $subject, string $target): ?Subject { + $transformerChain = $this->getTransformerChain($subject->getKey(), $target); + if (!$transformerChain) { + return null; + } + foreach ($transformerChain as $transformer) { + $subject = $transformer->transform($subject); + } + return $subject; + } + /** * @return SubjectTransformer[] */ diff --git a/mailpoet/lib/Automation/Engine/Control/TriggerHandler.php b/mailpoet/lib/Automation/Engine/Control/TriggerHandler.php index b1921adcf8..11b14b0e4a 100644 --- a/mailpoet/lib/Automation/Engine/Control/TriggerHandler.php +++ b/mailpoet/lib/Automation/Engine/Control/TriggerHandler.php @@ -29,15 +29,20 @@ class TriggerHandler { /** @var AutomationRunStorage */ private $automationRunStorage; + /** @var Functions */ private $wp; + /** @var SubjectTransformerHandler */ + private $subjectTransformerHandler; + public function __construct( ActionScheduler $actionScheduler, SubjectLoader $subjectLoader, WordPress $wordPress, AutomationStorage $automationStorage, AutomationRunStorage $automationRunStorage, - Functions $wp + Functions $wp, + SubjectTransformerHandler $subjectTransformerHandler ) { $this->actionScheduler = $actionScheduler; $this->wordPress = $wordPress; @@ -45,6 +50,7 @@ class TriggerHandler { $this->automationRunStorage = $automationRunStorage; $this->subjectLoader = $subjectLoader; $this->wp = $wp; + $this->subjectTransformerHandler = $subjectTransformerHandler; } public function initialize(): void { @@ -53,6 +59,7 @@ class TriggerHandler { /** @param Subject[] $subjects */ public function processTrigger(Trigger $trigger, array $subjects): void { + $subjects = $this->subjectTransformerHandler->provideAllSubjects($trigger, ...$subjects); $automations = $this->automationStorage->getActiveAutomationsByTrigger($trigger); foreach ($automations as $automation) { $step = $automation->getTrigger($trigger->getKey());