Add "core" automation integration & implement wait action
The "core" integration will provide triggers, actions, and subjects that are not specific to any 3rd party integration. [MAILPOET-4136]
This commit is contained in:
@ -12,4 +12,8 @@ class ActionScheduler {
|
||||
public function schedule(int $timestamp, string $hook, array $args = []): int {
|
||||
return as_schedule_single_action($timestamp, $hook, $args, self::GROUP_ID);
|
||||
}
|
||||
|
||||
public function hasScheduledAction(string $hook, array $args = []): bool {
|
||||
return as_has_scheduled_action($hook, $args, self::GROUP_ID);
|
||||
}
|
||||
}
|
||||
|
@ -82,6 +82,12 @@ class StepRunner {
|
||||
throw Exceptions::workflowNotFound($workflowRun->getWorkflowId());
|
||||
}
|
||||
|
||||
// complete workflow run
|
||||
if (!$stepId) {
|
||||
$this->workflowRunStorage->updateStatus($workflowRunId, WorkflowRun::STATUS_COMPLETE);
|
||||
return;
|
||||
}
|
||||
|
||||
$step = $workflow->getStep($stepId);
|
||||
if (!$step) {
|
||||
throw Exceptions::workflowStepNotFound($stepId);
|
||||
@ -94,19 +100,21 @@ class StepRunner {
|
||||
throw new InvalidStateException();
|
||||
}
|
||||
|
||||
// enqueue next step / complete workflow
|
||||
$nextStepId = $step->getNextStepId();
|
||||
if ($nextStepId) {
|
||||
$this->actionScheduler->enqueue(Hooks::WORKFLOW_STEP, [
|
||||
$nextStepArgs = [
|
||||
[
|
||||
'workflow_run_id' => $workflowRunId,
|
||||
'step_id' => $nextStepId,
|
||||
'step_id' => $step->getNextStepId(),
|
||||
],
|
||||
]);
|
||||
} else {
|
||||
$this->workflowRunStorage->updateStatus($workflowRunId, WorkflowRun::STATUS_COMPLETE);
|
||||
];
|
||||
|
||||
// next step scheduled by action
|
||||
if ($this->actionScheduler->hasScheduledAction(Hooks::WORKFLOW_STEP, $nextStepArgs)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// enqueue next step
|
||||
$this->actionScheduler->enqueue(Hooks::WORKFLOW_STEP, $nextStepArgs);
|
||||
|
||||
// TODO: allow long-running steps (that are not done here yet)
|
||||
}
|
||||
}
|
||||
|
@ -6,11 +6,15 @@ use MailPoet\Automation\Engine\API\API;
|
||||
use MailPoet\Automation\Engine\Control\StepRunner;
|
||||
use MailPoet\Automation\Engine\Control\TriggerHandler;
|
||||
use MailPoet\Automation\Engine\Storage\WorkflowStorage;
|
||||
use MailPoet\Automation\Integrations\Core\CoreIntegration;
|
||||
|
||||
class Engine {
|
||||
/** @var API */
|
||||
private $api;
|
||||
|
||||
/** @var CoreIntegration */
|
||||
private $coreIntegration;
|
||||
|
||||
/** @var Registry */
|
||||
private $registry;
|
||||
|
||||
@ -28,6 +32,7 @@ class Engine {
|
||||
|
||||
public function __construct(
|
||||
API $api,
|
||||
CoreIntegration $coreIntegration,
|
||||
Registry $registry,
|
||||
StepRunner $stepRunner,
|
||||
TriggerHandler $triggerHandler,
|
||||
@ -35,6 +40,7 @@ class Engine {
|
||||
WorkflowStorage $workflowStorage
|
||||
) {
|
||||
$this->api = $api;
|
||||
$this->coreIntegration = $coreIntegration;
|
||||
$this->registry = $registry;
|
||||
$this->stepRunner = $stepRunner;
|
||||
$this->triggerHandler = $triggerHandler;
|
||||
@ -50,6 +56,7 @@ class Engine {
|
||||
$this->stepRunner->initialize();
|
||||
$this->triggerHandler->initialize();
|
||||
|
||||
$this->coreIntegration->register($this->registry);
|
||||
$this->wordPress->doAction(Hooks::INITIALIZE, [$this->registry]);
|
||||
$this->registerActiveTriggerHooks();
|
||||
}
|
||||
|
@ -0,0 +1,40 @@
|
||||
<?php declare(strict_types = 1);
|
||||
|
||||
namespace MailPoet\Automation\Integrations\Core\Actions;
|
||||
|
||||
use MailPoet\Automation\Engine\Control\ActionScheduler;
|
||||
use MailPoet\Automation\Engine\Hooks;
|
||||
use MailPoet\Automation\Engine\Workflows\Action;
|
||||
use MailPoet\Automation\Engine\Workflows\Step;
|
||||
use MailPoet\Automation\Engine\Workflows\Workflow;
|
||||
use MailPoet\Automation\Engine\Workflows\WorkflowRun;
|
||||
|
||||
class WaitAction implements Action {
|
||||
/** @var ActionScheduler */
|
||||
private $actionScheduler;
|
||||
|
||||
public function __construct(
|
||||
ActionScheduler $actionScheduler
|
||||
) {
|
||||
$this->actionScheduler = $actionScheduler;
|
||||
}
|
||||
|
||||
public function getKey(): string {
|
||||
return 'core:wait';
|
||||
}
|
||||
|
||||
public function getName(): string {
|
||||
return __('Wait', 'mailpoet');
|
||||
}
|
||||
|
||||
public function run(Workflow $workflow, WorkflowRun $workflowRun, Step $step): void {
|
||||
$this->actionScheduler->schedule(time() + $step->getArgs()['seconds'], Hooks::WORKFLOW_STEP, [
|
||||
[
|
||||
'workflow_run_id' => $workflowRun->getId(),
|
||||
'step_id' => $step->getNextStepId(),
|
||||
],
|
||||
]);
|
||||
|
||||
// TODO: call a step complete ($id) hook instead?
|
||||
}
|
||||
}
|
@ -0,0 +1,22 @@
|
||||
<?php declare(strict_types = 1);
|
||||
|
||||
namespace MailPoet\Automation\Integrations\Core;
|
||||
|
||||
use MailPoet\Automation\Engine\Integration;
|
||||
use MailPoet\Automation\Engine\Registry;
|
||||
use MailPoet\Automation\Integrations\Core\Actions\WaitAction;
|
||||
|
||||
class CoreIntegration implements Integration {
|
||||
/** @var WaitAction */
|
||||
private $waitAction;
|
||||
|
||||
public function __construct(
|
||||
WaitAction $waitAction
|
||||
) {
|
||||
$this->waitAction = $waitAction;
|
||||
}
|
||||
|
||||
public function register(Registry $registry): void {
|
||||
$registry->addAction($this->waitAction);
|
||||
}
|
||||
}
|
@ -118,6 +118,9 @@ class ContainerConfigurator implements IContainerConfigurator {
|
||||
$container->autowire(\MailPoet\Automation\Engine\Storage\WorkflowRunStorage::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\Automation\Engine\Storage\WorkflowStorage::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\Automation\Engine\WordPress::class)->setPublic(true);
|
||||
// Automation - core integration
|
||||
$container->autowire(\MailPoet\Automation\Integrations\Core\Actions\WaitAction::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\Automation\Integrations\Core\CoreIntegration::class)->setPublic(true);
|
||||
// Automation - MailPoet integration
|
||||
$container->autowire(\MailPoet\Automation\Integrations\MailPoet\MailPoetIntegration::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\Automation\Integrations\MailPoet\Subjects\SegmentSubject::class)->setPublic(true);
|
||||
|
Reference in New Issue
Block a user