File "UnknownStepRule.php"
Full Path: /home/warrior1/public_html/wp-content/plugins/mailpoet/lib/Automation/Engine/Validation/WorkflowRules/UnknownStepRule.php
File size: 2.13 KB
MIME-type: text/x-php
Charset: utf-8
<?php declare(strict_types = 1);
namespace MailPoet\Automation\Engine\Validation\WorkflowRules;
if (!defined('ABSPATH')) exit;
use MailPoet\Automation\Engine\Data\Workflow;
use MailPoet\Automation\Engine\Exceptions;
use MailPoet\Automation\Engine\Exceptions\InvalidStateException;
use MailPoet\Automation\Engine\Registry;
use MailPoet\Automation\Engine\Storage\WorkflowStorage;
use MailPoet\Automation\Engine\Validation\WorkflowGraph\WorkflowNode;
use MailPoet\Automation\Engine\Validation\WorkflowGraph\WorkflowNodeVisitor;
class UnknownStepRule implements WorkflowNodeVisitor {
/** @var Registry */
private $registry;
/** @var WorkflowStorage */
private $workflowStorage;
/** @var Workflow|null|false */
private $cachedExistingWorkflow = false;
public function __construct(
Registry $registry,
WorkflowStorage $workflowStorage
) {
$this->registry = $registry;
$this->workflowStorage = $workflowStorage;
}
public function initialize(Workflow $workflow): void {
$this->cachedExistingWorkflow = false;
}
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) {
$currentWorkflow = $this->getCurrentWorkflow($workflow);
$currentStep = $currentWorkflow ? ($currentWorkflow->getSteps()[$step->getId()] ?? null) : null;
if (!$currentStep || $step->toArray() !== $currentStep->toArray()) {
throw Exceptions::workflowStepModifiedWhenUnknown($step);
}
}
}
public function complete(Workflow $workflow): void {
}
private function getCurrentWorkflow(Workflow $workflow): ?Workflow {
try {
$id = $workflow->getId();
if ($this->cachedExistingWorkflow === false) {
$this->cachedExistingWorkflow = $this->workflowStorage->getWorkflow($id);
}
} catch (InvalidStateException $e) {
// for new workflows, no workflow ID is set
$this->cachedExistingWorkflow = null;
}
return $this->cachedExistingWorkflow;
}
}