Refactor mailpoet_get_subscribers_in_segment_finders hook to direct calls

[MAILPOET-3077]
This commit is contained in:
Rostislav Wolny
2020-09-14 14:00:52 +02:00
committed by Veljko V
parent 331e40a137
commit dd7390ec73
4 changed files with 31 additions and 61 deletions

View File

@@ -132,8 +132,12 @@ class ContainerConfigurator implements IContainerConfigurator {
// Dynamic segments // Dynamic segments
$container->autowire(\MailPoet\DynamicSegments\DynamicSegmentHooks::class); $container->autowire(\MailPoet\DynamicSegments\DynamicSegmentHooks::class);
$container->autowire(\MailPoet\DynamicSegments\FreePluginConnectors\AddToNewslettersSegments::class); $container->autowire(\MailPoet\DynamicSegments\FreePluginConnectors\AddToNewslettersSegments::class);
$container->autowire(\MailPoet\DynamicSegments\FreePluginConnectors\SendingNewslettersSubscribersFinder::class)->setPublic(true);
$container->autowire(\MailPoet\DynamicSegments\Mappers\DBMapper::class);
$container->autowire(\MailPoet\DynamicSegments\Persistence\Loading\Loader::class); $container->autowire(\MailPoet\DynamicSegments\Persistence\Loading\Loader::class);
$container->autowire(\MailPoet\DynamicSegments\Persistence\Loading\SubscribersCount::class); $container->autowire(\MailPoet\DynamicSegments\Persistence\Loading\SubscribersCount::class);
$container->autowire(\MailPoet\DynamicSegments\Persistence\Loading\SubscribersIds::class);
$container->autowire(\MailPoet\DynamicSegments\Persistence\Loading\SingleSegmentLoader::class);
// Cron // Cron
$container->autowire(\MailPoet\Cron\CronHelper::class)->setPublic(true); $container->autowire(\MailPoet\Cron\CronHelper::class)->setPublic(true);
$container->autowire(\MailPoet\Cron\CronTrigger::class)->setPublic(true); $container->autowire(\MailPoet\Cron\CronTrigger::class)->setPublic(true);

View File

@@ -3,14 +3,12 @@
namespace MailPoet\DynamicSegments; namespace MailPoet\DynamicSegments;
use MailPoet\DynamicSegments\FreePluginConnectors\AddToSubscribersFilters; use MailPoet\DynamicSegments\FreePluginConnectors\AddToSubscribersFilters;
use MailPoet\DynamicSegments\FreePluginConnectors\SendingNewslettersSubscribersFinder;
use MailPoet\DynamicSegments\FreePluginConnectors\SubscribersBulkActionHandler; use MailPoet\DynamicSegments\FreePluginConnectors\SubscribersBulkActionHandler;
use MailPoet\DynamicSegments\FreePluginConnectors\SubscribersListingsHandlerFactory; use MailPoet\DynamicSegments\FreePluginConnectors\SubscribersListingsHandlerFactory;
use MailPoet\DynamicSegments\Mappers\DBMapper; use MailPoet\DynamicSegments\Mappers\DBMapper;
use MailPoet\DynamicSegments\Persistence\Loading\Loader; use MailPoet\DynamicSegments\Persistence\Loading\Loader;
use MailPoet\DynamicSegments\Persistence\Loading\SingleSegmentLoader; use MailPoet\DynamicSegments\Persistence\Loading\SingleSegmentLoader;
use MailPoet\DynamicSegments\Persistence\Loading\SubscribersCount; use MailPoet\DynamicSegments\Persistence\Loading\SubscribersCount;
use MailPoet\DynamicSegments\Persistence\Loading\SubscribersIds;
use MailPoet\WP\Functions as WPFunctions; use MailPoet\WP\Functions as WPFunctions;
class DynamicSegmentHooks { class DynamicSegmentHooks {
@@ -22,11 +20,6 @@ class DynamicSegmentHooks {
} }
public function init() { public function init() {
$this->wp->addAction(
'mailpoet_get_subscribers_in_segment_finders',
[$this, 'getSubscribersInSegmentsFinders']
);
$this->wp->addAction( $this->wp->addAction(
'mailpoet_get_subscribers_listings_in_segment_handlers', 'mailpoet_get_subscribers_listings_in_segment_handlers',
[$this, 'getSubscribersListingsInSegmentsHandlers'] [$this, 'getSubscribersListingsInSegmentsHandlers']
@@ -48,11 +41,6 @@ class DynamicSegmentHooks {
); );
} }
public function getSubscribersInSegmentsFinders(array $finders) {
$finders[] = new SendingNewslettersSubscribersFinder(new SingleSegmentLoader(new DBMapper()), new SubscribersIds());
return $finders;
}
public function getSubscribersListingsInSegmentsHandlers(array $handlers) { public function getSubscribersListingsInSegmentsHandlers(array $handlers) {
$handlers[] = new SubscribersListingsHandlerFactory(); $handlers[] = new SubscribersListingsHandlerFactory();
return $handlers; return $handlers;

View File

@@ -2,25 +2,28 @@
namespace MailPoet\Segments; namespace MailPoet\Segments;
use MailPoet\DI\ContainerWrapper;
use MailPoet\DynamicSegments\FreePluginConnectors\SendingNewslettersSubscribersFinder;
use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTask;
use MailPoet\Models\ScheduledTaskSubscriber; use MailPoet\Models\ScheduledTaskSubscriber;
use MailPoet\Models\Segment; use MailPoet\Models\Segment;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Idiorm\ORM; use MailPoetVendor\Idiorm\ORM;
use function MailPoetVendor\array_column; use function MailPoetVendor\array_column;
class SubscribersFinder { class SubscribersFinder {
/** @var WPFunctions */ /** @var SendingNewslettersSubscribersFinder */
private $wp; private $dynamicSegmentSubscriberFinder;
public function __construct(WPFunctions $wp = null) { public function __construct(
if (!$wp) { SendingNewslettersSubscribersFinder $dynamicSegmentSubscriberFinder = null
$wp = new WPFunctions; ) {
if ($dynamicSegmentSubscriberFinder === null) {
$dynamicSegmentSubscriberFinder = ContainerWrapper::getInstance()->get(SendingNewslettersSubscribersFinder::class);
} }
$this->wp = $wp; $this->dynamicSegmentSubscriberFinder = $dynamicSegmentSubscriberFinder;
} }
public function findSubscribersInSegments($subscribersToProcessIds, $newsletterSegmentsIds) { public function findSubscribersInSegments($subscribersToProcessIds, $newsletterSegmentsIds) {
@@ -40,13 +43,10 @@ class SubscribersFinder {
$subscribers = Subscriber::findSubscribersInSegments($subscribersToProcessIds, [$segment->id])->findMany(); $subscribers = Subscriber::findSubscribersInSegments($subscribersToProcessIds, [$segment->id])->findMany();
return Subscriber::extractSubscribersIds($subscribers); return Subscriber::extractSubscribersIds($subscribers);
} }
$finders = $this->wp->applyFilters('mailpoet_get_subscribers_in_segment_finders', []); $subscribers = $this->dynamicSegmentSubscriberFinder->findSubscribersInSegment($segment, $subscribersToProcessIds);
foreach ($finders as $finder) {
$subscribers = $finder->findSubscribersInSegment($segment, $subscribersToProcessIds);
if ($subscribers) { if ($subscribers) {
return Subscriber::extractSubscribersIds($subscribers); return Subscriber::extractSubscribersIds($subscribers);
} }
}
return []; return [];
} }
@@ -108,14 +108,11 @@ class SubscribersFinder {
} }
private function addSubscribersToTaskFromDynamicSegment(ScheduledTask $task, Segment $segment) { private function addSubscribersToTaskFromDynamicSegment(ScheduledTask $task, Segment $segment) {
$finders = $this->wp->applyFilters('mailpoet_get_subscribers_in_segment_finders', []);
$count = 0; $count = 0;
foreach ($finders as $finder) { $subscribers = $this->dynamicSegmentSubscriberFinder->getSubscriberIdsInSegment($segment);
$subscribers = $finder->getSubscriberIdsInSegment($segment);
if ($subscribers) { if ($subscribers) {
$count += $this->addSubscribersToTaskByIds($task, $subscribers); $count += $this->addSubscribersToTaskByIds($task, $subscribers);
} }
}
return $count; return $count;
} }

View File

@@ -5,13 +5,13 @@ namespace MailPoet\Segments;
require_once('FinderMock.php'); require_once('FinderMock.php');
use Codeception\Util\Stub; use Codeception\Util\Stub;
use MailPoet\DynamicSegments\FreePluginConnectors\SendingNewslettersSubscribersFinder;
use MailPoet\Models\ScheduledTask; use MailPoet\Models\ScheduledTask;
use MailPoet\Models\ScheduledTaskSubscriber; use MailPoet\Models\ScheduledTaskSubscriber;
use MailPoet\Models\Segment; use MailPoet\Models\Segment;
use MailPoet\Models\Subscriber; use MailPoet\Models\Subscriber;
use MailPoet\Models\SubscriberSegment; use MailPoet\Models\SubscriberSegment;
use MailPoet\Tasks\Sending as SendingTask; use MailPoet\Tasks\Sending as SendingTask;
use MailPoet\WP\Functions as WPFunctions;
use MailPoetVendor\Idiorm\ORM; use MailPoetVendor\Idiorm\ORM;
use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\MockObject\MockObject;
@@ -72,38 +72,28 @@ class SubscribersFinderTest extends \MailPoetTest {
} }
public function testFindSubscribersInSegmentUsingFinder() { public function testFindSubscribersInSegmentUsingFinder() {
/** @var MockObject $mock */ /** @var SendingNewslettersSubscribersFinder & MockObject $mock */
$mock = Stub::makeEmpty('MailPoet\Segments\FinderMock', ['findSubscribersInSegment']); $mock = Stub::makeEmpty(SendingNewslettersSubscribersFinder::class, ['findSubscribersInSegment']);
$mock $mock
->expects($this->once()) ->expects($this->once())
->method('findSubscribersInSegment') ->method('findSubscribersInSegment')
->will($this->returnValue([$this->subscriber3])); ->will($this->returnValue([$this->subscriber3]));
remove_all_filters('mailpoet_get_subscribers_in_segment_finders'); $finder = new SubscribersFinder($mock);
(new WPFunctions)->addFilter('mailpoet_get_subscribers_in_segment_finders', function () use ($mock) {
return [$mock];
});
$finder = new SubscribersFinder();
$subscribers = $finder->findSubscribersInSegments([$this->subscriber3->id], [$this->segment3->id]); $subscribers = $finder->findSubscribersInSegments([$this->subscriber3->id], [$this->segment3->id]);
expect($subscribers)->count(1); expect($subscribers)->count(1);
expect($subscribers)->contains($this->subscriber3->id); expect($subscribers)->contains($this->subscriber3->id);
} }
public function testFindSubscribersInSegmentUsingFinderMakesResultUnique() { public function testFindSubscribersInSegmentUsingFinderMakesResultUnique() {
/** @var MockObject $mock */ /** @var SendingNewslettersSubscribersFinder & MockObject $mock */
$mock = Stub::makeEmpty('MailPoet\Segments\FinderMock', ['findSubscribersInSegment']); $mock = Stub::makeEmpty(SendingNewslettersSubscribersFinder::class, ['findSubscribersInSegment']);
$mock $mock
->expects($this->exactly(2)) ->expects($this->exactly(2))
->method('findSubscribersInSegment') ->method('findSubscribersInSegment')
->will($this->returnValue([$this->subscriber3])); ->will($this->returnValue([$this->subscriber3]));
remove_all_filters('mailpoet_get_subscribers_in_segment_finders'); $finder = new SubscribersFinder($mock);
(new WPFunctions)->addFilter('mailpoet_get_subscribers_in_segment_finders', function () use ($mock) {
return [$mock];
});
$finder = new SubscribersFinder();
$subscribers = $finder->findSubscribersInSegments([$this->subscriber3->id], [$this->segment3->id, $this->segment3->id]); $subscribers = $finder->findSubscribersInSegments([$this->subscriber3->id], [$this->segment3->id, $this->segment3->id]);
expect($subscribers)->count(1); expect($subscribers)->count(1);
} }
@@ -133,19 +123,14 @@ class SubscribersFinderTest extends \MailPoetTest {
} }
public function testItAddsSubscribersToTaskFromDynamicSegments() { public function testItAddsSubscribersToTaskFromDynamicSegments() {
/** @var MockObject $mock */ /** @var SendingNewslettersSubscribersFinder & MockObject $mock */
$mock = Stub::makeEmpty('MailPoet\Segments\FinderMock', ['getSubscriberIdsInSegment']); $mock = Stub::makeEmpty(SendingNewslettersSubscribersFinder::class, ['getSubscriberIdsInSegment']);
$mock $mock
->expects($this->once()) ->expects($this->once())
->method('getSubscriberIdsInSegment') ->method('getSubscriberIdsInSegment')
->will($this->returnValue([['id' => $this->subscriber1->id]])); ->will($this->returnValue([['id' => $this->subscriber1->id]]));
remove_all_filters('mailpoet_get_subscribers_in_segment_finders'); $finder = new SubscribersFinder($mock);
(new WPFunctions)->addFilter('mailpoet_get_subscribers_in_segment_finders', function () use ($mock) {
return [$mock];
});
$finder = new SubscribersFinder();
$subscribersCount = $finder->addSubscribersToTaskFromSegments( $subscribersCount = $finder->addSubscribersToTaskFromSegments(
$this->sending->task(), $this->sending->task(),
[ [
@@ -160,15 +145,11 @@ class SubscribersFinderTest extends \MailPoetTest {
$finder = new SubscribersFinder(); $finder = new SubscribersFinder();
/** @var MockObject $mock */ /** @var MockObject $mock */
$mock = Stub::makeEmpty('MailPoet\Segments\FinderMock', ['getSubscriberIdsInSegment']); $mock = Stub::makeEmpty(SendingNewslettersSubscribersFinder::class, ['getSubscriberIdsInSegment']);
$mock $mock
->expects($this->once()) ->expects($this->once())
->method('getSubscriberIdsInSegment') ->method('getSubscriberIdsInSegment')
->will($this->returnValue([['id' => $this->subscriber2->id]])); ->will($this->returnValue([['id' => $this->subscriber2->id]]));
remove_all_filters('mailpoet_get_subscribers_in_segment_finders');
(new WPFunctions)->addFilter('mailpoet_get_subscribers_in_segment_finders', function () use ($mock) {
return [$mock];
});
$subscribersCount = $finder->addSubscribersToTaskFromSegments( $subscribersCount = $finder->addSubscribersToTaskFromSegments(
$this->sending->task(), $this->sending->task(),