Introduce step run args to simplify step run arguments

[MAILPOET-4629]
This commit is contained in:
Jan Jakes
2022-09-19 13:52:12 +02:00
committed by David Remer
parent 460cbd9e12
commit 68b5bab9cc
6 changed files with 80 additions and 23 deletions

View File

@ -5,6 +5,7 @@ namespace MailPoet\Automation\Engine\Control;
use Exception; use Exception;
use MailPoet\Automation\Engine\Control\Steps\ActionStepRunner; use MailPoet\Automation\Engine\Control\Steps\ActionStepRunner;
use MailPoet\Automation\Engine\Data\Step; use MailPoet\Automation\Engine\Data\Step;
use MailPoet\Automation\Engine\Data\StepRunArgs;
use MailPoet\Automation\Engine\Data\SubjectEntry; use MailPoet\Automation\Engine\Data\SubjectEntry;
use MailPoet\Automation\Engine\Data\WorkflowRun; use MailPoet\Automation\Engine\Data\WorkflowRun;
use MailPoet\Automation\Engine\Data\WorkflowRunLog; use MailPoet\Automation\Engine\Data\WorkflowRunLog;
@ -133,7 +134,8 @@ class StepHandler {
try { try {
$requiredSubjects = $step instanceof Action ? $step->getSubjectKeys() : []; $requiredSubjects = $step instanceof Action ? $step->getSubjectKeys() : [];
$subjectEntries = $this->getSubjectEntries($workflowRun, $requiredSubjects); $subjectEntries = $this->getSubjectEntries($workflowRun, $requiredSubjects);
$this->stepRunners[$stepType]->run($workflow, $workflowRun, $step, $subjectEntries); $args = new StepRunArgs($workflow, $workflowRun, $step, $subjectEntries);
$this->stepRunners[$stepType]->run($args);
$log->markCompletedSuccessfully(); $log->markCompletedSuccessfully();
} catch (Throwable $e) { } catch (Throwable $e) {
$log->markFailed(); $log->markFailed();

View File

@ -2,12 +2,8 @@
namespace MailPoet\Automation\Engine\Control; namespace MailPoet\Automation\Engine\Control;
use MailPoet\Automation\Engine\Data\Step; use MailPoet\Automation\Engine\Data\StepRunArgs;
use MailPoet\Automation\Engine\Data\SubjectEntry;
use MailPoet\Automation\Engine\Data\Workflow;
use MailPoet\Automation\Engine\Data\WorkflowRun;
interface StepRunner { interface StepRunner {
/** @var SubjectEntry[] $subjectEntries */ public function run(StepRunArgs $args): void;
public function run(Step $step, Workflow $workflow, WorkflowRun $workflowRun, array $subjectEntries): void;
} }

View File

@ -3,10 +3,7 @@
namespace MailPoet\Automation\Engine\Control\Steps; namespace MailPoet\Automation\Engine\Control\Steps;
use MailPoet\Automation\Engine\Control\StepRunner; use MailPoet\Automation\Engine\Control\StepRunner;
use MailPoet\Automation\Engine\Data\Step; use MailPoet\Automation\Engine\Data\StepRunArgs;
use MailPoet\Automation\Engine\Data\SubjectEntry;
use MailPoet\Automation\Engine\Data\Workflow;
use MailPoet\Automation\Engine\Data\WorkflowRun;
use MailPoet\Automation\Engine\Exceptions\InvalidStateException; use MailPoet\Automation\Engine\Exceptions\InvalidStateException;
use MailPoet\Automation\Engine\Registry; use MailPoet\Automation\Engine\Registry;
@ -20,15 +17,14 @@ class ActionStepRunner implements StepRunner {
$this->registry = $registry; $this->registry = $registry;
} }
/** @param SubjectEntry[] $subjectEntries */ public function run(StepRunArgs $args): void {
public function run(Step $step, Workflow $workflow, WorkflowRun $workflowRun, array $subjectEntries): void { $action = $this->registry->getAction($args->getStep()->getKey());
$action = $this->registry->getAction($step->getKey());
if (!$action) { if (!$action) {
throw new InvalidStateException(); throw new InvalidStateException();
} }
if (!$action->isValid($workflowRun->getSubjects(), $step, $workflow)) { if (!$action->isValid($args->getWorkflowRun()->getSubjects(), $args->getStep(), $args->getWorkflow())) {
throw new InvalidStateException(); throw new InvalidStateException();
} }
$action->run($workflow, $workflowRun, $step); $action->run($args);
} }
} }

View File

@ -0,0 +1,63 @@
<?php declare(strict_types = 1);
namespace MailPoet\Automation\Engine\Data;
use MailPoet\Automation\Engine\Exceptions;
use MailPoet\Automation\Engine\Workflows\Payload;
use MailPoet\Automation\Engine\Workflows\Subject;
class StepRunArgs {
/** @var Workflow */
private $workflow;
/** @var WorkflowRun */
private $workflowRun;
/** @var Step */
private $step;
/** @var array<string, SubjectEntry<Subject<Payload>>[]> */
private $subjectEntries = [];
/** @param SubjectEntry<Subject<Payload>>[] $subjectsEntries */
public function __construct(
Workflow $workflow,
WorkflowRun $workflowRun,
Step $step,
array $subjectsEntries
) {
$this->workflow = $workflow;
$this->step = $step;
$this->workflowRun = $workflowRun;
foreach ($subjectsEntries as $entry) {
$subject = $entry->getSubject();
$key = $subject->getKey();
$this->subjectEntries[$key] = array_merge($this->subjectEntries[$key] ?? [], [$entry]);
}
}
public function getWorkflow(): Workflow {
return $this->workflow;
}
public function getWorkflowRun(): WorkflowRun {
return $this->workflowRun;
}
public function getStep(): Step {
return $this->step;
}
/** @return SubjectEntry<Subject<Payload>> */
public function getSingleSubjectEntry(string $key): SubjectEntry {
$subjects = $this->subjectEntries[$key] ?? [];
if (count($subjects) === 0) {
throw Exceptions::subjectDataNotFound($key, $this->workflowRun->getId());
}
if (count($subjects) > 1) {
throw Exceptions::multipleSubjectsFound($key, $this->workflowRun->getId());
}
return $subjects[0];
}
}

View File

@ -140,11 +140,13 @@ class Exceptions {
); );
} }
public static function multipleSubjectsFound(string $key): InvalidStateException { public static function multipleSubjectsFound(string $key, int $workflowRunId): InvalidStateException {
return InvalidStateException::create() return InvalidStateException::create()
->withErrorCode(self::MULTIPLE_SUBJECTS_FOUND) ->withErrorCode(self::MULTIPLE_SUBJECTS_FOUND)
// translators: %s is the name of the key. // translators: %1$s is the key of the subject, %2$d is workflow run ID.
->withMessage(sprintf(__("Multiple subjects with key '%s' found, only one expected.", 'mailpoet'), $key)); ->withMessage(
sprintf(__("Multiple subjects with key '%1\$s' found for workflow run with ID '%2\$d', only one expected.", 'mailpoet'), $key, $workflowRunId)
);
} }
public static function workflowStructureModificationNotSupported(): UnexpectedValueException { public static function workflowStructureModificationNotSupported(): UnexpectedValueException {

View File

@ -3,13 +3,11 @@
namespace MailPoet\Automation\Engine\Workflows; namespace MailPoet\Automation\Engine\Workflows;
use MailPoet\Automation\Engine\Data\Step as StepData; use MailPoet\Automation\Engine\Data\Step as StepData;
use MailPoet\Automation\Engine\Data\SubjectEntry; use MailPoet\Automation\Engine\Data\StepRunArgs;
use MailPoet\Automation\Engine\Data\Workflow; use MailPoet\Automation\Engine\Data\Workflow;
use MailPoet\Automation\Engine\Data\WorkflowRun;
interface Action extends Step { interface Action extends Step {
public function isValid(array $subjects, StepData $step, Workflow $workflow): bool; public function isValid(array $subjects, StepData $step, Workflow $workflow): bool;
/** @var SubjectEntry[] $subjectEntries */ public function run(StepRunArgs $args): void;
public function run(Workflow $workflow, WorkflowRun $workflowRun, StepData $step, array $subjectEntries): void;
} }