diff --git a/mailpoet/lib/Automation/Engine/Control/TriggerHandler.php b/mailpoet/lib/Automation/Engine/Control/TriggerHandler.php index 8dfe386541..a6fe5411de 100644 --- a/mailpoet/lib/Automation/Engine/Control/TriggerHandler.php +++ b/mailpoet/lib/Automation/Engine/Control/TriggerHandler.php @@ -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; } diff --git a/mailpoet/lib/Automation/Engine/Workflows/Trigger.php b/mailpoet/lib/Automation/Engine/Workflows/Trigger.php index c9884ebb4e..eb018cbd13 100644 --- a/mailpoet/lib/Automation/Engine/Workflows/Trigger.php +++ b/mailpoet/lib/Automation/Engine/Workflows/Trigger.php @@ -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; } diff --git a/mailpoet/lib/Automation/Integrations/MailPoet/Triggers/SomeoneSubscribesTrigger.php b/mailpoet/lib/Automation/Integrations/MailPoet/Triggers/SomeoneSubscribesTrigger.php index b5b291da01..d750ac1429 100644 --- a/mailpoet/lib/Automation/Integrations/MailPoet/Triggers/SomeoneSubscribesTrigger.php +++ b/mailpoet/lib/Automation/Integrations/MailPoet/Triggers/SomeoneSubscribesTrigger.php @@ -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) ); } } diff --git a/mailpoet/lib/Automation/Integrations/MailPoet/Triggers/UserRegistrationTrigger.php b/mailpoet/lib/Automation/Integrations/MailPoet/Triggers/UserRegistrationTrigger.php index 59cd8bd129..3e76bb62c2 100644 --- a/mailpoet/lib/Automation/Integrations/MailPoet/Triggers/UserRegistrationTrigger.php +++ b/mailpoet/lib/Automation/Integrations/MailPoet/Triggers/UserRegistrationTrigger.php @@ -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; } } diff --git a/mailpoet/tests/integration/Automation/Integrations/MailPoet/Triggers/SomeoneSubscribesTriggerTest.php b/mailpoet/tests/integration/Automation/Integrations/MailPoet/Triggers/SomeoneSubscribesTriggerTest.php index bf26fe79ea..24c9817369 100644 --- a/mailpoet/tests/integration/Automation/Integrations/MailPoet/Triggers/SomeoneSubscribesTriggerTest.php +++ b/mailpoet/tests/integration/Automation/Integrations/MailPoet/Triggers/SomeoneSubscribesTriggerTest.php @@ -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 { diff --git a/mailpoet/tests/integration/Automation/Integrations/MailPoet/Triggers/UserRegistrationTriggerTest.php b/mailpoet/tests/integration/Automation/Integrations/MailPoet/Triggers/UserRegistrationTriggerTest.php index 2c17b2a9f4..12dac122e1 100644 --- a/mailpoet/tests/integration/Automation/Integrations/MailPoet/Triggers/UserRegistrationTriggerTest.php +++ b/mailpoet/tests/integration/Automation/Integrations/MailPoet/Triggers/UserRegistrationTriggerTest.php @@ -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 {