rewrite workflow and handle finalize differently

This commit is contained in:
2022-01-28 23:42:21 +01:00
parent fdafe7c82b
commit 86e7b0f007
11 changed files with 180 additions and 60 deletions

View File

@@ -25,6 +25,7 @@ use Iterator;
use RuntimeException;
use Symfony\Component\Serializer\Annotation as Serializer;
use function count;
use function is_array;
/**
* @ORM\Entity
@@ -72,6 +73,11 @@ class EntityWorkflow implements TrackCreationInterface, TrackUpdateInterface
*/
private Collection $steps;
/**
* @var null|array|EntityWorkflowStep[]
*/
private ?array $stepsChainedCache = null;
/**
* @ORM\ManyToMany(targetEntity=User::class)
* @ORM\JoinTable(name="chill_main_workflow_entity_subscriber_to_final")
@@ -129,10 +135,6 @@ class EntityWorkflow implements TrackCreationInterface, TrackUpdateInterface
if (!$this->steps->contains($step)) {
$this->steps[] = $step;
$step->setEntityWorkflow($this);
if ($this->isFinalize()) {
$step->setFinalizeAfter(true);
}
}
return $this;
@@ -253,27 +255,33 @@ class EntityWorkflow implements TrackCreationInterface, TrackUpdateInterface
public function getStepsChained(): array
{
if (is_array($this->stepsChainedCache)) {
return $this->stepsChainedCache;
}
$iterator = $this->steps->getIterator();
$previous = $next = $current = null;
$current = null;
$steps = [];
$iterator->rewind();
while ($iterator->valid()) {
do {
$previous = $current;
$steps[] = $current = $iterator->current();
$current = $iterator->current();
$steps[] = $current;
$current->setPrevious($previous);
$iterator->next();
if ($iterator->valid()) {
$next = $iterator->current();
$current->setNext($iterator->current());
} else {
$next = null;
$current->setNext(null);
}
} while ($iterator->valid());
$current->setNext($next);
}
$this->stepsChainedCache = $steps;
return $steps;
}
@@ -308,7 +316,7 @@ class EntityWorkflow implements TrackCreationInterface, TrackUpdateInterface
return $this->workflowName;
}
public function isFinalize(): bool
public function isFinal(): bool
{
$steps = $this->getStepsChained();
@@ -320,7 +328,7 @@ class EntityWorkflow implements TrackCreationInterface, TrackUpdateInterface
/** @var EntityWorkflowStep $last */
$last = end($steps);
return $last->getPrevious()->isFinalizeAfter();
return $last->isFinal();
}
public function isFreeze(): bool