Change isTriggeredBy signature for clarity
[MAILPOET-4587]
This commit is contained in:
@@ -61,7 +61,7 @@ class TriggerHandler {
|
||||
|
||||
$workflowRun = new WorkflowRun($workflow->getId(), $workflow->getVersionId(), $trigger->getKey(), $loadedSubjects);
|
||||
|
||||
if (!$trigger->isTriggeredBy($workflowRun)) {
|
||||
if (!$trigger->isTriggeredBy($step->getArgs(), ...$loadedSubjects)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@@ -2,17 +2,12 @@
|
||||
|
||||
namespace MailPoet\Automation\Engine\Workflows;
|
||||
|
||||
use MailPoet\Automation\Engine\Data\WorkflowRun;
|
||||
|
||||
interface Trigger extends Step {
|
||||
public function registerHooks(): void;
|
||||
|
||||
/**
|
||||
* Validate if the specific context of a run meets the
|
||||
* settings of a given trigger.
|
||||
*
|
||||
* @param WorkflowRun $workflowRun
|
||||
* @return bool
|
||||
*/
|
||||
public function isTriggeredBy(WorkflowRun $workflowRun): bool;
|
||||
public function isTriggeredBy(array $args, Subject ...$subjects): bool;
|
||||
}
|
||||
|
@@ -2,9 +2,8 @@
|
||||
|
||||
namespace MailPoet\Automation\Integrations\MailPoet\Triggers;
|
||||
|
||||
use MailPoet\Automation\Engine\Data\WorkflowRun;
|
||||
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\Integrations\MailPoet\Subjects\SegmentSubject;
|
||||
use MailPoet\Automation\Integrations\MailPoet\Subjects\SubscriberSubject;
|
||||
@@ -16,17 +15,12 @@ use MailPoet\WP\Functions as WPFunctions;
|
||||
|
||||
class SomeoneSubscribesTrigger implements Trigger {
|
||||
|
||||
/** @var WorkflowStorage */
|
||||
private $workflowStorage;
|
||||
|
||||
/** @var WPFunctions */
|
||||
private $wp;
|
||||
|
||||
public function __construct(
|
||||
WorkflowStorage $workflowStorage,
|
||||
WPFunctions $wp
|
||||
) {
|
||||
$this->workflowStorage = $workflowStorage;
|
||||
$this->wp = $wp;
|
||||
}
|
||||
|
||||
@@ -72,30 +66,26 @@ class SomeoneSubscribesTrigger implements Trigger {
|
||||
]);
|
||||
}
|
||||
|
||||
public function isTriggeredBy(WorkflowRun $workflowRun): bool {
|
||||
if ($workflowRun->getTriggerKey() !== $this->getKey()) {
|
||||
return false;
|
||||
}
|
||||
$workflow = $this->workflowStorage->getWorkflow($workflowRun->getWorkflowId(), $workflowRun->getVersionId());
|
||||
if (!$workflow) {
|
||||
return false;
|
||||
}
|
||||
public function isTriggeredBy(array $args, Subject ...$subjects): bool {
|
||||
|
||||
$triggerData = $workflow->getTrigger($workflowRun->getTriggerKey());
|
||||
if (!$triggerData) {
|
||||
return false;
|
||||
$segment = null;
|
||||
foreach ($subjects as $subject) {
|
||||
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 (
|
||||
!isset($stepArgs['segment_ids'])
|
||||
|| !is_array($stepArgs['segment_ids'])
|
||||
|| !count($stepArgs['segment_ids'])
|
||||
|| in_array($segment->getId(), $stepArgs['segment_ids'], true)
|
||||
!$segment
|
||||
|| !isset($args['segment_ids'])
|
||||
|| !is_array($args['segment_ids'])
|
||||
|| !count($args['segment_ids'])
|
||||
|| in_array($segment->getId(), $args['segment_ids'], true)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@@ -2,9 +2,8 @@
|
||||
|
||||
namespace MailPoet\Automation\Integrations\MailPoet\Triggers;
|
||||
|
||||
use MailPoet\Automation\Engine\Data\WorkflowRun;
|
||||
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\Integrations\MailPoet\Subjects\SegmentSubject;
|
||||
use MailPoet\Automation\Integrations\MailPoet\Subjects\SubscriberSubject;
|
||||
@@ -17,17 +16,13 @@ use MailPoet\WP\Functions as WPFunctions;
|
||||
|
||||
class UserRegistrationTrigger implements Trigger {
|
||||
|
||||
/** @var WorkflowStorage */
|
||||
private $workflowStorage;
|
||||
|
||||
/** @var WPFunctions */
|
||||
private $wp;
|
||||
|
||||
public function __construct(
|
||||
WorkflowStorage $workflowStorage,
|
||||
WPFunctions $wp
|
||||
) {
|
||||
$this->workflowStorage = $workflowStorage;
|
||||
$this->wp = $wp;
|
||||
}
|
||||
|
||||
@@ -67,48 +62,39 @@ class UserRegistrationTrigger implements Trigger {
|
||||
]);
|
||||
}
|
||||
|
||||
public function isTriggeredBy(WorkflowRun $workflowRun): bool {
|
||||
if ($workflowRun->getTriggerKey() !== $this->getKey()) {
|
||||
return false;
|
||||
public function isTriggeredBy(array $args, Subject ...$subjects): bool {
|
||||
$segment = null;
|
||||
$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;
|
||||
}
|
||||
|
||||
$triggerData = $workflow->getTrigger($workflowRun->getTriggerKey());
|
||||
if (!$triggerData) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$segmentSubject = $workflowRun->requireSingleSubject(SegmentSubject::class);
|
||||
$segment = $segmentSubject->getSegment();
|
||||
if ($segment->getType() !== SegmentEntity::TYPE_WP_USERS) {
|
||||
return false;
|
||||
}
|
||||
$stepArgs = $triggerData->getArgs();
|
||||
if (!isset($stepArgs['roles']) || !is_array($stepArgs['roles'])) {
|
||||
return false;
|
||||
if (!isset($args['roles']) || !is_array($args['roles']) || !count($args['roles'])) {
|
||||
return true;
|
||||
}
|
||||
|
||||
$subscriber = $workflowRun->requireSingleSubject(SubscriberSubject::class);
|
||||
if (!$subscriber->getSubscriber()->isWPUser()) {
|
||||
if (!$subscriber->isWPUser()) {
|
||||
return false;
|
||||
}
|
||||
$user = $this->wp->getUserBy('id', $subscriber->getSubscriber()->getWpUserId());
|
||||
$user = $this->wp->getUserBy('id', $subscriber->getWpUserId());
|
||||
if (!$user) {
|
||||
return false;
|
||||
}
|
||||
if (
|
||||
!isset($stepArgs['roles'])
|
||||
|| !is_array($stepArgs['roles'])
|
||||
|| !count($stepArgs['roles'])
|
||||
) {
|
||||
return true;
|
||||
}
|
||||
$roles = $stepArgs['roles'];
|
||||
|
||||
foreach ($user->roles as $userRole) {
|
||||
if (in_array($userRole, $roles, true)) {
|
||||
if (in_array($userRole, $args['roles'], true)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -2,10 +2,6 @@
|
||||
|
||||
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\Triggers\SomeoneSubscribesTrigger;
|
||||
use MailPoet\Entities\SegmentEntity;
|
||||
@@ -20,15 +16,12 @@ class SomeoneSubscribesTriggerTest extends \MailPoetTest
|
||||
/** @var SegmentEntity[] */
|
||||
private $segments;
|
||||
|
||||
/** @var WorkflowStorage */
|
||||
private $workflowRepository;
|
||||
public function _before() {
|
||||
$this->segmentRepository = $this->diContainer->get(SegmentsRepository::class);
|
||||
$this->segments = [
|
||||
'segment_1' => $this->segmentRepository->createOrUpdate('Segment 1'),
|
||||
'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) {
|
||||
/** @var SomeoneSubscribesTrigger $testee */
|
||||
$testee = $this->diContainer->get(SomeoneSubscribesTrigger::class);
|
||||
$workflow = new Workflow(
|
||||
'test',
|
||||
[
|
||||
Step::fromArray([
|
||||
'id' => '1',
|
||||
'name' => 'TestData',
|
||||
'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);
|
||||
|
||||
$args = [
|
||||
'segment_ids' => array_map(
|
||||
function($key) {
|
||||
return isset($this->segments[$key]) ? $this->segments[$key]->getId() : $key;
|
||||
},
|
||||
$segmentSetting
|
||||
)
|
||||
];
|
||||
/** @var SegmentSubject $segmentSubject */
|
||||
$segmentSubject = $this->diContainer->get(SegmentSubject::class);
|
||||
$segmentSubject->load(['segment_id' => $this->segments[$currentSegmentId]->getId()]);
|
||||
$run = new WorkflowRun($workflow->getId(), $workflow->getVersionId(),$testee->getKey(),[$segmentSubject]);
|
||||
$this->assertSame($expectation, $testee->isTriggeredBy($run));
|
||||
$this->assertSame($expectation, $testee->isTriggeredBy($args, $segmentSubject));
|
||||
}
|
||||
|
||||
public function dataForTestTriggeredByWorkflowRun() : array {
|
||||
|
@@ -2,10 +2,6 @@
|
||||
|
||||
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\SubscriberSubject;
|
||||
use MailPoet\Automation\Integrations\MailPoet\Triggers\UserRegistrationTrigger;
|
||||
@@ -18,8 +14,8 @@ use MailPoet\Subscribers\SubscribersRepository;
|
||||
class UserRegistrationTriggerTest extends \MailPoetTest
|
||||
{
|
||||
|
||||
const USER_NAME = 'user-name';
|
||||
const USER_EMAIL = 'user-name@mailpoet.com';
|
||||
const USER_NAME = 'user-name--x';
|
||||
const USER_EMAIL = 'user-name--x@mailpoet.com';
|
||||
const USER_ROLE = 'subscriber';
|
||||
|
||||
/** @var SegmentsRepository */
|
||||
@@ -34,14 +30,11 @@ class UserRegistrationTriggerTest extends \MailPoetTest
|
||||
/** @var WP */
|
||||
private $wpSegment;
|
||||
|
||||
/** @var WorkflowStorage */
|
||||
private $workflowRepository;
|
||||
public function _before() {
|
||||
|
||||
$this->wpSegment = $this->diContainer->get(WP::class);
|
||||
$this->segmentRepository = $this->diContainer->get(SegmentsRepository::class);
|
||||
$this->subscribersRepository = $this->diContainer->get(SubscribersRepository::class);
|
||||
$this->workflowRepository = $this->diContainer->get(WorkflowStorage::class);
|
||||
if (! is_numeric($this->userId)) {
|
||||
$userId = wp_insert_user([
|
||||
'user_login' => self::USER_NAME,
|
||||
@@ -63,25 +56,10 @@ class UserRegistrationTriggerTest extends \MailPoetTest
|
||||
public function testTriggeredByWorkflowRun(array $roleSetting, bool $expectation) {
|
||||
/** @var UserRegistrationTrigger $testee */
|
||||
$testee = $this->diContainer->get(UserRegistrationTrigger::class);
|
||||
$workflow = new Workflow(
|
||||
'test',
|
||||
[
|
||||
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);
|
||||
|
||||
$args = [
|
||||
'roles' => $roleSetting,
|
||||
];
|
||||
|
||||
$subscriber = $this->subscribersRepository->findOneBy(['email' => self::USER_EMAIL]);
|
||||
assert($subscriber instanceof SubscriberEntity);
|
||||
@@ -94,8 +72,7 @@ class UserRegistrationTriggerTest extends \MailPoetTest
|
||||
/** @var SegmentSubject $subscriberSubject */
|
||||
$segmentSubject = $this->diContainer->get(SegmentSubject::class);
|
||||
$segmentSubject->load(['segment_id' => $segment->getId()]);
|
||||
$run = new WorkflowRun($workflow->getId(), $workflow->getVersionId(),$testee->getKey(),[$subscriberSubject, $segmentSubject]);
|
||||
$this->assertSame($expectation, $testee->isTriggeredBy($run));
|
||||
$this->assertSame($expectation, $testee->isTriggeredBy($args, $subscriberSubject, $segmentSubject));
|
||||
}
|
||||
|
||||
public function dataForTestTriggeredByWorkflowRun() : array {
|
||||
|
Reference in New Issue
Block a user