Change isTriggeredBy signature for clarity

[MAILPOET-4587]
This commit is contained in:
David Remer
2022-09-21 09:21:26 +03:00
committed by Jan Jakeš
parent f88c72a7c6
commit e1e5749eca
6 changed files with 53 additions and 130 deletions

View File

@@ -61,7 +61,7 @@ class TriggerHandler {
$workflowRun = new WorkflowRun($workflow->getId(), $workflow->getVersionId(), $trigger->getKey(), $loadedSubjects); $workflowRun = new WorkflowRun($workflow->getId(), $workflow->getVersionId(), $trigger->getKey(), $loadedSubjects);
if (!$trigger->isTriggeredBy($workflowRun)) { if (!$trigger->isTriggeredBy($step->getArgs(), ...$loadedSubjects)) {
return; return;
} }

View File

@@ -2,17 +2,12 @@
namespace MailPoet\Automation\Engine\Workflows; namespace MailPoet\Automation\Engine\Workflows;
use MailPoet\Automation\Engine\Data\WorkflowRun;
interface Trigger extends Step { interface Trigger extends Step {
public function registerHooks(): void; public function registerHooks(): void;
/** /**
* Validate if the specific context of a run meets the * Validate if the specific context of a run meets the
* settings of a given trigger. * settings of a given trigger.
*
* @param WorkflowRun $workflowRun
* @return bool
*/ */
public function isTriggeredBy(WorkflowRun $workflowRun): bool; public function isTriggeredBy(array $args, Subject ...$subjects): bool;
} }

View File

@@ -2,9 +2,8 @@
namespace MailPoet\Automation\Integrations\MailPoet\Triggers; namespace MailPoet\Automation\Integrations\MailPoet\Triggers;
use MailPoet\Automation\Engine\Data\WorkflowRun;
use MailPoet\Automation\Engine\Hooks; use MailPoet\Automation\Engine\Hooks;
use MailPoet\Automation\Engine\Storage\WorkflowStorage; use MailPoet\Automation\Engine\Workflows\Subject;
use MailPoet\Automation\Engine\Workflows\Trigger; use MailPoet\Automation\Engine\Workflows\Trigger;
use MailPoet\Automation\Integrations\MailPoet\Subjects\SegmentSubject; use MailPoet\Automation\Integrations\MailPoet\Subjects\SegmentSubject;
use MailPoet\Automation\Integrations\MailPoet\Subjects\SubscriberSubject; use MailPoet\Automation\Integrations\MailPoet\Subjects\SubscriberSubject;
@@ -16,17 +15,12 @@ use MailPoet\WP\Functions as WPFunctions;
class SomeoneSubscribesTrigger implements Trigger { class SomeoneSubscribesTrigger implements Trigger {
/** @var WorkflowStorage */
private $workflowStorage;
/** @var WPFunctions */ /** @var WPFunctions */
private $wp; private $wp;
public function __construct( public function __construct(
WorkflowStorage $workflowStorage,
WPFunctions $wp WPFunctions $wp
) { ) {
$this->workflowStorage = $workflowStorage;
$this->wp = $wp; $this->wp = $wp;
} }
@@ -72,30 +66,26 @@ class SomeoneSubscribesTrigger implements Trigger {
]); ]);
} }
public function isTriggeredBy(WorkflowRun $workflowRun): bool { public function isTriggeredBy(array $args, Subject ...$subjects): bool {
if ($workflowRun->getTriggerKey() !== $this->getKey()) {
return false;
}
$workflow = $this->workflowStorage->getWorkflow($workflowRun->getWorkflowId(), $workflowRun->getVersionId());
if (!$workflow) {
return false;
}
$triggerData = $workflow->getTrigger($workflowRun->getTriggerKey()); $segment = null;
if (!$triggerData) { foreach ($subjects as $subject) {
return false; if (!$subject instanceof SegmentSubject) {
continue;
}
/**
* @var SegmentSubject $subject
*/
$segment = $subject->getSegment();
} }
$segmentSubject = $workflowRun->requireSingleSubject(SegmentSubject::class);
$segment = $segmentSubject->getSegment();
$stepArgs = $triggerData->getArgs();
// Return true, when no segment list is defined (=any list) or the segment matches the definition. // Return true, when no segment list is defined (=any list) or the segment matches the definition.
return ( return (
!isset($stepArgs['segment_ids']) !$segment
|| !is_array($stepArgs['segment_ids']) || !isset($args['segment_ids'])
|| !count($stepArgs['segment_ids']) || !is_array($args['segment_ids'])
|| in_array($segment->getId(), $stepArgs['segment_ids'], true) || !count($args['segment_ids'])
|| in_array($segment->getId(), $args['segment_ids'], true)
); );
} }
} }

View File

@@ -2,9 +2,8 @@
namespace MailPoet\Automation\Integrations\MailPoet\Triggers; namespace MailPoet\Automation\Integrations\MailPoet\Triggers;
use MailPoet\Automation\Engine\Data\WorkflowRun;
use MailPoet\Automation\Engine\Hooks; use MailPoet\Automation\Engine\Hooks;
use MailPoet\Automation\Engine\Storage\WorkflowStorage; use MailPoet\Automation\Engine\Workflows\Subject;
use MailPoet\Automation\Engine\Workflows\Trigger; use MailPoet\Automation\Engine\Workflows\Trigger;
use MailPoet\Automation\Integrations\MailPoet\Subjects\SegmentSubject; use MailPoet\Automation\Integrations\MailPoet\Subjects\SegmentSubject;
use MailPoet\Automation\Integrations\MailPoet\Subjects\SubscriberSubject; use MailPoet\Automation\Integrations\MailPoet\Subjects\SubscriberSubject;
@@ -17,17 +16,13 @@ use MailPoet\WP\Functions as WPFunctions;
class UserRegistrationTrigger implements Trigger { class UserRegistrationTrigger implements Trigger {
/** @var WorkflowStorage */
private $workflowStorage;
/** @var WPFunctions */ /** @var WPFunctions */
private $wp; private $wp;
public function __construct( public function __construct(
WorkflowStorage $workflowStorage,
WPFunctions $wp WPFunctions $wp
) { ) {
$this->workflowStorage = $workflowStorage;
$this->wp = $wp; $this->wp = $wp;
} }
@@ -67,48 +62,39 @@ class UserRegistrationTrigger implements Trigger {
]); ]);
} }
public function isTriggeredBy(WorkflowRun $workflowRun): bool { public function isTriggeredBy(array $args, Subject ...$subjects): bool {
if ($workflowRun->getTriggerKey() !== $this->getKey()) { $segment = null;
return false; $subscriber = null;
foreach ($subjects as $subject) {
if ($subject instanceof SegmentSubject) {
$segment = $subject->getSegment();
}
if ($subject instanceof SubscriberSubject) {
$subscriber = $subject->getSubscriber();
}
} }
$workflow = $this->workflowStorage->getWorkflow($workflowRun->getWorkflowId(), $workflowRun->getVersionId());
if (!$workflow) { if (!$segment || !$subscriber) {
return false; return false;
} }
$triggerData = $workflow->getTrigger($workflowRun->getTriggerKey());
if (!$triggerData) {
return false;
}
$segmentSubject = $workflowRun->requireSingleSubject(SegmentSubject::class);
$segment = $segmentSubject->getSegment();
if ($segment->getType() !== SegmentEntity::TYPE_WP_USERS) { if ($segment->getType() !== SegmentEntity::TYPE_WP_USERS) {
return false; return false;
} }
$stepArgs = $triggerData->getArgs(); if (!isset($args['roles']) || !is_array($args['roles']) || !count($args['roles'])) {
if (!isset($stepArgs['roles']) || !is_array($stepArgs['roles'])) { return true;
return false;
} }
$subscriber = $workflowRun->requireSingleSubject(SubscriberSubject::class); if (!$subscriber->isWPUser()) {
if (!$subscriber->getSubscriber()->isWPUser()) {
return false; return false;
} }
$user = $this->wp->getUserBy('id', $subscriber->getSubscriber()->getWpUserId()); $user = $this->wp->getUserBy('id', $subscriber->getWpUserId());
if (!$user) { if (!$user) {
return false; return false;
} }
if (
!isset($stepArgs['roles'])
|| !is_array($stepArgs['roles'])
|| !count($stepArgs['roles'])
) {
return true;
}
$roles = $stepArgs['roles'];
foreach ($user->roles as $userRole) { foreach ($user->roles as $userRole) {
if (in_array($userRole, $roles, true)) { if (in_array($userRole, $args['roles'], true)) {
return true; return true;
} }
} }

View File

@@ -2,10 +2,6 @@
namespace MailPoet\Test\Automation\Integrations\MailPoet\Triggers; namespace MailPoet\Test\Automation\Integrations\MailPoet\Triggers;
use MailPoet\Automation\Engine\Data\Workflow;
use MailPoet\Automation\Engine\Data\Step;
use MailPoet\Automation\Engine\Data\WorkflowRun;
use MailPoet\Automation\Engine\Storage\WorkflowStorage;
use MailPoet\Automation\Integrations\MailPoet\Subjects\SegmentSubject; use MailPoet\Automation\Integrations\MailPoet\Subjects\SegmentSubject;
use MailPoet\Automation\Integrations\MailPoet\Triggers\SomeoneSubscribesTrigger; use MailPoet\Automation\Integrations\MailPoet\Triggers\SomeoneSubscribesTrigger;
use MailPoet\Entities\SegmentEntity; use MailPoet\Entities\SegmentEntity;
@@ -20,15 +16,12 @@ class SomeoneSubscribesTriggerTest extends \MailPoetTest
/** @var SegmentEntity[] */ /** @var SegmentEntity[] */
private $segments; private $segments;
/** @var WorkflowStorage */
private $workflowRepository;
public function _before() { public function _before() {
$this->segmentRepository = $this->diContainer->get(SegmentsRepository::class); $this->segmentRepository = $this->diContainer->get(SegmentsRepository::class);
$this->segments = [ $this->segments = [
'segment_1' => $this->segmentRepository->createOrUpdate('Segment 1'), 'segment_1' => $this->segmentRepository->createOrUpdate('Segment 1'),
'segment_2' => $this->segmentRepository->createOrUpdate('Segment 2'), 'segment_2' => $this->segmentRepository->createOrUpdate('Segment 2'),
]; ];
$this->workflowRepository = $this->diContainer->get(WorkflowStorage::class);
} }
/** /**
@@ -37,36 +30,18 @@ class SomeoneSubscribesTriggerTest extends \MailPoetTest
public function testTriggeredByWorkflowRun(array $segmentSetting, string $currentSegmentId, bool $expectation) { public function testTriggeredByWorkflowRun(array $segmentSetting, string $currentSegmentId, bool $expectation) {
/** @var SomeoneSubscribesTrigger $testee */ /** @var SomeoneSubscribesTrigger $testee */
$testee = $this->diContainer->get(SomeoneSubscribesTrigger::class); $testee = $this->diContainer->get(SomeoneSubscribesTrigger::class);
$workflow = new Workflow( $args = [
'test', 'segment_ids' => array_map(
[ function($key) {
Step::fromArray([ return isset($this->segments[$key]) ? $this->segments[$key]->getId() : $key;
'id' => '1', },
'name' => 'TestData', $segmentSetting
'key' => $testee->getKey(), )
'type' => Step::TYPE_TRIGGER, ];
'next_steps' => [],
'args' => [
'segment_ids' => array_map(
function($key) {
return isset($this->segments[$key]) ? $this->segments[$key]->getId() : $key;
},
$segmentSetting
)
],
])
],
new \WP_User()
);
$workflowId = $this->workflowRepository->createWorkflow($workflow);
$workflow = $this->workflowRepository->getWorkflow($workflowId);
self::assertInstanceOf(Workflow::class, $workflow);
/** @var SegmentSubject $segmentSubject */ /** @var SegmentSubject $segmentSubject */
$segmentSubject = $this->diContainer->get(SegmentSubject::class); $segmentSubject = $this->diContainer->get(SegmentSubject::class);
$segmentSubject->load(['segment_id' => $this->segments[$currentSegmentId]->getId()]); $segmentSubject->load(['segment_id' => $this->segments[$currentSegmentId]->getId()]);
$run = new WorkflowRun($workflow->getId(), $workflow->getVersionId(),$testee->getKey(),[$segmentSubject]); $this->assertSame($expectation, $testee->isTriggeredBy($args, $segmentSubject));
$this->assertSame($expectation, $testee->isTriggeredBy($run));
} }
public function dataForTestTriggeredByWorkflowRun() : array { public function dataForTestTriggeredByWorkflowRun() : array {

View File

@@ -2,10 +2,6 @@
namespace MailPoet\Test\Automation\Integrations\MailPoet\Triggers; namespace MailPoet\Test\Automation\Integrations\MailPoet\Triggers;
use MailPoet\Automation\Engine\Data\Step;
use MailPoet\Automation\Engine\Data\Workflow;
use MailPoet\Automation\Engine\Data\WorkflowRun;
use MailPoet\Automation\Engine\Storage\WorkflowStorage;
use MailPoet\Automation\Integrations\MailPoet\Subjects\SegmentSubject; use MailPoet\Automation\Integrations\MailPoet\Subjects\SegmentSubject;
use MailPoet\Automation\Integrations\MailPoet\Subjects\SubscriberSubject; use MailPoet\Automation\Integrations\MailPoet\Subjects\SubscriberSubject;
use MailPoet\Automation\Integrations\MailPoet\Triggers\UserRegistrationTrigger; use MailPoet\Automation\Integrations\MailPoet\Triggers\UserRegistrationTrigger;
@@ -18,8 +14,8 @@ use MailPoet\Subscribers\SubscribersRepository;
class UserRegistrationTriggerTest extends \MailPoetTest class UserRegistrationTriggerTest extends \MailPoetTest
{ {
const USER_NAME = 'user-name'; const USER_NAME = 'user-name--x';
const USER_EMAIL = 'user-name@mailpoet.com'; const USER_EMAIL = 'user-name--x@mailpoet.com';
const USER_ROLE = 'subscriber'; const USER_ROLE = 'subscriber';
/** @var SegmentsRepository */ /** @var SegmentsRepository */
@@ -34,14 +30,11 @@ class UserRegistrationTriggerTest extends \MailPoetTest
/** @var WP */ /** @var WP */
private $wpSegment; private $wpSegment;
/** @var WorkflowStorage */
private $workflowRepository;
public function _before() { public function _before() {
$this->wpSegment = $this->diContainer->get(WP::class); $this->wpSegment = $this->diContainer->get(WP::class);
$this->segmentRepository = $this->diContainer->get(SegmentsRepository::class); $this->segmentRepository = $this->diContainer->get(SegmentsRepository::class);
$this->subscribersRepository = $this->diContainer->get(SubscribersRepository::class); $this->subscribersRepository = $this->diContainer->get(SubscribersRepository::class);
$this->workflowRepository = $this->diContainer->get(WorkflowStorage::class);
if (! is_numeric($this->userId)) { if (! is_numeric($this->userId)) {
$userId = wp_insert_user([ $userId = wp_insert_user([
'user_login' => self::USER_NAME, 'user_login' => self::USER_NAME,
@@ -63,25 +56,10 @@ class UserRegistrationTriggerTest extends \MailPoetTest
public function testTriggeredByWorkflowRun(array $roleSetting, bool $expectation) { public function testTriggeredByWorkflowRun(array $roleSetting, bool $expectation) {
/** @var UserRegistrationTrigger $testee */ /** @var UserRegistrationTrigger $testee */
$testee = $this->diContainer->get(UserRegistrationTrigger::class); $testee = $this->diContainer->get(UserRegistrationTrigger::class);
$workflow = new Workflow(
'test', $args = [
[ 'roles' => $roleSetting,
Step::fromArray([ ];
'id' => '1',
'name' => 'TestData',
'key' => $testee->getKey(),
'type' => Step::TYPE_TRIGGER,
'next_steps' => [],
'args' => [
'roles' => $roleSetting
],
])
],
new \WP_User()
);
$workflowId = $this->workflowRepository->createWorkflow($workflow);
$workflow = $this->workflowRepository->getWorkflow($workflowId);
self::assertInstanceOf(Workflow::class, $workflow);
$subscriber = $this->subscribersRepository->findOneBy(['email' => self::USER_EMAIL]); $subscriber = $this->subscribersRepository->findOneBy(['email' => self::USER_EMAIL]);
assert($subscriber instanceof SubscriberEntity); assert($subscriber instanceof SubscriberEntity);
@@ -94,8 +72,7 @@ class UserRegistrationTriggerTest extends \MailPoetTest
/** @var SegmentSubject $subscriberSubject */ /** @var SegmentSubject $subscriberSubject */
$segmentSubject = $this->diContainer->get(SegmentSubject::class); $segmentSubject = $this->diContainer->get(SegmentSubject::class);
$segmentSubject->load(['segment_id' => $segment->getId()]); $segmentSubject->load(['segment_id' => $segment->getId()]);
$run = new WorkflowRun($workflow->getId(), $workflow->getVersionId(),$testee->getKey(),[$subscriberSubject, $segmentSubject]); $this->assertSame($expectation, $testee->isTriggeredBy($args, $subscriberSubject, $segmentSubject));
$this->assertSame($expectation, $testee->isTriggeredBy($run));
} }
public function dataForTestTriggeredByWorkflowRun() : array { public function dataForTestTriggeredByWorkflowRun() : array {