diff --git a/mailpoet/lib/Automation/Engine/Validation/WorkflowStepsValidator.php b/mailpoet/lib/Automation/Engine/Validation/WorkflowRules/UnknownStepRule.php similarity index 66% rename from mailpoet/lib/Automation/Engine/Validation/WorkflowStepsValidator.php rename to mailpoet/lib/Automation/Engine/Validation/WorkflowRules/UnknownStepRule.php index ed837f91b3..509e386489 100644 --- a/mailpoet/lib/Automation/Engine/Validation/WorkflowStepsValidator.php +++ b/mailpoet/lib/Automation/Engine/Validation/WorkflowRules/UnknownStepRule.php @@ -1,22 +1,19 @@ validator = $validator; $this->registry = $registry; $this->workflowStorage = $workflowStorage; } - public function validateSteps(Workflow $workflow): void { - foreach ($workflow->getSteps() as $step) { - $this->validateStep($workflow, $step); - } + public function initialize(Workflow $workflow): void { + $this->cachedExistingWorkflow = false; } - private function validateStep(Workflow $workflow, Step $step): void { + public function visitNode(Workflow $workflow, WorkflowNode $node): void { + $step = $node->getStep(); $registryStep = $this->registry->getStep($step->getKey()); + + // step not registered (e.g. plugin was deactivated) - allow saving it only if it hasn't changed if (!$registryStep) { - // step not registered (e.g. plugin was deactivated) - allow saving it only if it hasn't changed $currentWorkflow = $this->getCurrentWorkflow($workflow); $currentStep = $currentWorkflow ? ($currentWorkflow->getSteps()[$step->getId()] ?? null) : null; if (!$currentStep || $step->toArray() !== $currentStep->toArray()) { throw Exceptions::workflowStepModifiedWhenUnknown($step); } - return; } + } - // full validation for active workflows - if ($workflow->getStatus() === Workflow::STATUS_ACTIVE) { - $this->validator->validate($registryStep->getArgsSchema(), $step->getArgs()); - } + public function complete(Workflow $workflow): void { } private function getCurrentWorkflow(Workflow $workflow): ?Workflow { diff --git a/mailpoet/lib/Automation/Engine/Validation/WorkflowRules/ValidStepArgsRule.php b/mailpoet/lib/Automation/Engine/Validation/WorkflowRules/ValidStepArgsRule.php new file mode 100644 index 0000000000..ae45745a39 --- /dev/null +++ b/mailpoet/lib/Automation/Engine/Validation/WorkflowRules/ValidStepArgsRule.php @@ -0,0 +1,44 @@ +registry = $registry; + $this->validator = $validator; + } + + public function initialize(Workflow $workflow): void { + } + + public function visitNode(Workflow $workflow, WorkflowNode $node): void { + $step = $node->getStep(); + $registryStep = $this->registry->getStep($step->getKey()); + if (!$registryStep) { + return; + } + + // validate args schema only for active workflows + if ($workflow->getStatus() !== Workflow::STATUS_ACTIVE) { + $this->validator->validate($registryStep->getArgsSchema(), $step->getArgs()); + } + } + + public function complete(Workflow $workflow): void { + } +} diff --git a/mailpoet/lib/Automation/Engine/Validation/WorkflowValidator.php b/mailpoet/lib/Automation/Engine/Validation/WorkflowValidator.php index d957dc049b..e9e1d0db8d 100644 --- a/mailpoet/lib/Automation/Engine/Validation/WorkflowValidator.php +++ b/mailpoet/lib/Automation/Engine/Validation/WorkflowValidator.php @@ -11,24 +11,30 @@ use MailPoet\Automation\Engine\Validation\WorkflowRules\NoJoinRule; use MailPoet\Automation\Engine\Validation\WorkflowRules\NoSplitRule; use MailPoet\Automation\Engine\Validation\WorkflowRules\NoUnreachableStepsRule; use MailPoet\Automation\Engine\Validation\WorkflowRules\TriggersUnderRootRule; +use MailPoet\Automation\Engine\Validation\WorkflowRules\UnknownStepRule; +use MailPoet\Automation\Engine\Validation\WorkflowRules\ValidStepArgsRule; class WorkflowValidator { - /** @var WorkflowStepsValidator */ - private $stepsValidator; - /** @var WorkflowWalker */ private $workflowWalker; + /** @var ValidStepArgsRule */ + private $validStepArgsRule; + + /** @var UnknownStepRule */ + private $unknownStepRule; + public function __construct( - WorkflowStepsValidator $stepsValidator, + UnknownStepRule $unknownStepRule, + ValidStepArgsRule $validStepArgsRule, WorkflowWalker $workflowWalker ) { + $this->unknownStepRule = $unknownStepRule; + $this->validStepArgsRule = $validStepArgsRule; $this->workflowWalker = $workflowWalker; - $this->stepsValidator = $stepsValidator; } public function validate(Workflow $workflow): void { - // validate graph $this->workflowWalker->walk($workflow, [ new NoUnreachableStepsRule(), new ConsistentStepMapRule(), @@ -37,9 +43,8 @@ class WorkflowValidator { new NoCycleRule(), new NoJoinRule(), new NoSplitRule(), + $this->unknownStepRule, + $this->validStepArgsRule, ]); - - // validate steps - $this->stepsValidator->validateSteps($workflow); } } diff --git a/mailpoet/lib/DI/ContainerConfigurator.php b/mailpoet/lib/DI/ContainerConfigurator.php index 31c092d3fe..400fa29098 100644 --- a/mailpoet/lib/DI/ContainerConfigurator.php +++ b/mailpoet/lib/DI/ContainerConfigurator.php @@ -130,7 +130,8 @@ class ContainerConfigurator implements IContainerConfigurator { $container->autowire(\MailPoet\Automation\Engine\Storage\WorkflowStorage::class)->setPublic(true); $container->autowire(\MailPoet\Automation\Engine\Storage\WorkflowStatisticsStorage::class)->setPublic(true); $container->autowire(\MailPoet\Automation\Engine\Validation\WorkflowGraph\WorkflowWalker::class)->setPublic(true); - $container->autowire(\MailPoet\Automation\Engine\Validation\WorkflowStepsValidator::class)->setPublic(true); + $container->autowire(\MailPoet\Automation\Engine\Validation\WorkflowRules\UnknownStepRule::class)->setPublic(true); + $container->autowire(\MailPoet\Automation\Engine\Validation\WorkflowRules\ValidStepArgsRule::class)->setPublic(true); $container->autowire(\MailPoet\Automation\Engine\Validation\WorkflowValidator::class)->setPublic(true); $container->autowire(\MailPoet\Automation\Engine\WordPress::class)->setPublic(true); // Automation - API endpoints