Persist all possible subject on run creation

[MAILPOET-4935]
This commit is contained in:
David Remer
2023-03-20 08:58:07 +02:00
committed by Aschepikov
parent c968b03ca7
commit d365be2334
2 changed files with 58 additions and 8 deletions

View File

@@ -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[]
*/