Remove dynamic segments services that are no longer needed
[MAILPOET-3164]
This commit is contained in:
committed by
Veljko V
parent
b7914a3ff6
commit
9868f5cc21
@@ -131,11 +131,7 @@ class ContainerConfigurator implements IContainerConfigurator {
|
||||
$container->autowire(\MailPoet\PostEditorBlocks\PostEditorBlock::class);
|
||||
$container->autowire(\MailPoet\PostEditorBlocks\SubscriptionFormBlock::class);
|
||||
// Dynamic segments
|
||||
$container->autowire(\MailPoet\DynamicSegments\FreePluginConnectors\AddToNewslettersSegments::class)->setPublic(true);
|
||||
$container->autowire(\MailPoet\DynamicSegments\Mappers\DBMapper::class);
|
||||
$container->autowire(\MailPoet\DynamicSegments\Persistence\Loading\Loader::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)->setPublic(true);
|
||||
// Cron
|
||||
$container->autowire(\MailPoet\Cron\CronHelper::class)->setPublic(true);
|
||||
|
@@ -1,48 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace MailPoet\DynamicSegments\FreePluginConnectors;
|
||||
|
||||
use MailPoet\DynamicSegments\Persistence\Loading\Loader;
|
||||
use MailPoet\DynamicSegments\Persistence\Loading\SubscribersCount;
|
||||
|
||||
class AddToNewslettersSegments {
|
||||
|
||||
/** @var Loader */
|
||||
private $loader;
|
||||
|
||||
/** @var SubscribersCount */
|
||||
private $subscribersCountLoader;
|
||||
|
||||
public function __construct(Loader $loader, SubscribersCount $subscribersCountLoader) {
|
||||
$this->loader = $loader;
|
||||
$this->subscribersCountLoader = $subscribersCountLoader;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $initialSegments
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function add(array $initialSegments) {
|
||||
$dynamicSegments = $this->getListings();
|
||||
return array_merge($initialSegments, $dynamicSegments);
|
||||
}
|
||||
|
||||
private function getListings() {
|
||||
$dynamicSegments = $this->loader->load();
|
||||
return $this->buildResult($dynamicSegments);
|
||||
}
|
||||
|
||||
private function buildResult($dynamicSegments) {
|
||||
$result = [];
|
||||
foreach ($dynamicSegments as $dynamicSegment) {
|
||||
$result[] = [
|
||||
'id' => $dynamicSegment->id,
|
||||
'name' => $dynamicSegment->name,
|
||||
'subscribers' => $this->subscribersCountLoader->getSubscribersCount($dynamicSegment),
|
||||
'deleted_at' => $dynamicSegment->deletedAt,
|
||||
];
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
}
|
@@ -1,34 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace MailPoet\DynamicSegments\Persistence\Loading;
|
||||
|
||||
use MailPoet\DynamicSegments\Mappers\DBMapper;
|
||||
use MailPoet\Models\DynamicSegment;
|
||||
use MailPoet\Models\DynamicSegmentFilter;
|
||||
|
||||
class Loader {
|
||||
|
||||
/** @var DBMapper */
|
||||
private $mapper;
|
||||
|
||||
public function __construct(DBMapper $mapper) {
|
||||
$this->mapper = $mapper;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return DynamicSegment[]
|
||||
*/
|
||||
public function load() {
|
||||
$segments = DynamicSegment::findAll();
|
||||
return $this->loadFilters($segments);
|
||||
}
|
||||
|
||||
private function loadFilters(array $segments) {
|
||||
$ids = array_map(function($segment) {
|
||||
return $segment->id;
|
||||
}, $segments);
|
||||
$filters = DynamicSegmentFilter::getAllBySegmentIds($ids);
|
||||
|
||||
return $this->mapper->mapSegments($segments, $filters);
|
||||
}
|
||||
}
|
@@ -1,38 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace MailPoet\DynamicSegments\Persistence\Loading;
|
||||
|
||||
use MailPoet\DynamicSegments\RequirementsChecker;
|
||||
use MailPoet\Models\DynamicSegment;
|
||||
use MailPoet\Models\Subscriber;
|
||||
use MailPoet\WooCommerce\Helper as WooCommerceHelper;
|
||||
|
||||
class SubscribersCount {
|
||||
|
||||
/** @var RequirementsChecker */
|
||||
private $requirementsChecker;
|
||||
|
||||
public function __construct(RequirementsChecker $requirementsChecker = null) {
|
||||
if (!$requirementsChecker) {
|
||||
$requirementsChecker = new RequirementsChecker(new WooCommerceHelper());
|
||||
}
|
||||
$this->requirementsChecker = $requirementsChecker;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param DynamicSegment $dynamicSegment
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function getSubscribersCount(DynamicSegment $dynamicSegment) {
|
||||
$orm = Subscriber::selectExpr('count(distinct ' . Subscriber::$_table . '.id) as cnt');
|
||||
if ($this->requirementsChecker->shouldSkipSegment($dynamicSegment)) {
|
||||
return 0;
|
||||
}
|
||||
foreach ($dynamicSegment->getFilters() as $filter) {
|
||||
$orm = $filter->toSql($orm);
|
||||
}
|
||||
$orm->where(MP_SUBSCRIBERS_TABLE . '.status', Subscriber::STATUS_SUBSCRIBED);
|
||||
return $orm->findOne()->cnt;
|
||||
}
|
||||
}
|
@@ -1,43 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace MailPoet\DynamicSegments\Persistence\Loading;
|
||||
|
||||
use MailPoet\DynamicSegments\RequirementsChecker;
|
||||
use MailPoet\Models\DynamicSegment;
|
||||
use MailPoet\Models\Subscriber;
|
||||
use MailPoet\WooCommerce\Helper as WooCommerceHelper;
|
||||
|
||||
class SubscribersIds {
|
||||
|
||||
/** @var RequirementsChecker */
|
||||
private $requirementsChecker;
|
||||
|
||||
public function __construct(RequirementsChecker $requirementsChecker = null) {
|
||||
if (!$requirementsChecker) {
|
||||
$requirementsChecker = new RequirementsChecker(new WooCommerceHelper());
|
||||
}
|
||||
$this->requirementsChecker = $requirementsChecker;
|
||||
}
|
||||
|
||||
/**
|
||||
* Finds subscribers in a dynamic segment and returns their ids.
|
||||
*
|
||||
* @param DynamicSegment $dynamicSegment
|
||||
* @param array $limitToSubscribersIds If passed the result will be limited only to ids within this array
|
||||
*
|
||||
* @return Subscriber[]
|
||||
*/
|
||||
public function load(DynamicSegment $dynamicSegment, $limitToSubscribersIds = null) {
|
||||
$orm = Subscriber::selectExpr(Subscriber::$_table . '.id');
|
||||
if ($this->requirementsChecker->shouldSkipSegment($dynamicSegment)) {
|
||||
return [];
|
||||
}
|
||||
foreach ($dynamicSegment->getFilters() as $filter) {
|
||||
$orm = $filter->toSql($orm);
|
||||
}
|
||||
if ($limitToSubscribersIds) {
|
||||
$orm->whereIn(Subscriber::$_table . '.id', $limitToSubscribersIds);
|
||||
}
|
||||
return $orm->findMany();
|
||||
}
|
||||
}
|
@@ -1,60 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace MailPoet\DynamicSegments\FreePluginConnectors;
|
||||
|
||||
use Codeception\Stub;
|
||||
use Codeception\Stub\Expected;
|
||||
use MailPoet\Models\DynamicSegment;
|
||||
use PHPUnit\Framework\MockObject\MockObject;
|
||||
|
||||
class AddToNewslettersSegmentsTest extends \MailPoetTest {
|
||||
public function testItReturnsOriginalArray() {
|
||||
$dynamicSegment = DynamicSegment::create();
|
||||
$dynamicSegment->hydrate([
|
||||
'name' => 'segment1',
|
||||
'description' => '',
|
||||
]);
|
||||
|
||||
$segmentLoader = Stub::makeEmpty('\MailPoet\DynamicSegments\Persistence\Loading\Loader', ['load' => Expected::once(function () {
|
||||
return [];
|
||||
})]);
|
||||
|
||||
$subscribersCountLoader = Stub::makeEmpty('\MailPoet\DynamicSegments\Persistence\Loading\SubscribersCount', ['getSubscribersCount' => Expected::never()]);
|
||||
|
||||
$filter = new AddToNewslettersSegments($segmentLoader, $subscribersCountLoader);
|
||||
$result = $filter->add([$dynamicSegment]);
|
||||
expect($result)->equals([$dynamicSegment]);
|
||||
}
|
||||
|
||||
public function testItAddsDynamicSegments() {
|
||||
$dynamicSegment = DynamicSegment::create();
|
||||
$dynamicSegment->hydrate([
|
||||
'name' => 'segment2',
|
||||
'description' => '',
|
||||
'id' => 1,
|
||||
]);
|
||||
|
||||
$segmentLoader = Stub::makeEmpty('\MailPoet\DynamicSegments\Persistence\Loading\Loader', ['load' => Expected::once(function () use ($dynamicSegment) {
|
||||
return [$dynamicSegment];
|
||||
})]);
|
||||
|
||||
/** @var \MailPoet\DynamicSegments\Persistence\Loading\SubscribersCount|MockObject $subscribersCountLoader */
|
||||
$subscribersCountLoader = Stub::makeEmpty('\MailPoet\DynamicSegments\Persistence\Loading\SubscribersCount', ['getSubscribersCount']);
|
||||
$subscribersCountLoader
|
||||
->expects($this->once())
|
||||
->method('getSubscribersCount')
|
||||
->with($this->equalTo($dynamicSegment))
|
||||
->will($this->returnValue(4));
|
||||
|
||||
$filter = new AddToNewslettersSegments($segmentLoader, $subscribersCountLoader);
|
||||
$result = $filter->add([]);
|
||||
|
||||
expect($result)->count(1);
|
||||
expect($result[0])->equals([
|
||||
'id' => 1,
|
||||
'name' => 'segment2',
|
||||
'subscribers' => 4,
|
||||
'deleted_at' => null,
|
||||
]);
|
||||
}
|
||||
}
|
@@ -1,89 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace MailPoet\DynamicSegments\Persistence\Loading;
|
||||
|
||||
use MailPoet\DynamicSegments\Filters\UserRole;
|
||||
use MailPoet\DynamicSegments\Mappers\DBMapper;
|
||||
use MailPoet\Models\DynamicSegment;
|
||||
use MailPoet\Models\DynamicSegmentFilter;
|
||||
use MailPoetVendor\Idiorm\ORM;
|
||||
|
||||
class LoaderTest extends \MailPoetTest {
|
||||
|
||||
private $segments;
|
||||
|
||||
/** @var Loader */
|
||||
private $loader;
|
||||
|
||||
public function _before() {
|
||||
$this->loader = new Loader(new DBMapper());
|
||||
ORM::raw_execute('TRUNCATE ' . DynamicSegment::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . DynamicSegmentFilter::$_table);
|
||||
$this->segments[] = DynamicSegment::createOrUpdate([
|
||||
'name' => 'segment 1',
|
||||
'description' => 'description',
|
||||
]);
|
||||
$this->segments[] = DynamicSegment::createOrUpdate([
|
||||
'name' => 'segment 2',
|
||||
'description' => 'description',
|
||||
]);
|
||||
$filter = new UserRole('Administrator', 'and');
|
||||
$filterData = DynamicSegmentFilter::create();
|
||||
$filterData->hydrate([
|
||||
'segment_id' => $this->segments[1]->id,
|
||||
'filter_data' => $filter->toArray(),
|
||||
]);
|
||||
$filterData->save();
|
||||
$filter = new UserRole('Editor', 'or');
|
||||
$filterData = DynamicSegmentFilter::create();
|
||||
$filterData->hydrate([
|
||||
'segment_id' => $this->segments[0]->id,
|
||||
'filter_data' => $filter->toArray(),
|
||||
]);
|
||||
$filterData->save();
|
||||
}
|
||||
|
||||
public function testItLoadsSegments() {
|
||||
$data = $this->loader->load();
|
||||
expect($data)->count(2);
|
||||
expect($data[0])->isInstanceOf('\MailPoet\Models\DynamicSegment');
|
||||
expect($data[1])->isInstanceOf('\MailPoet\Models\DynamicSegment');
|
||||
}
|
||||
|
||||
public function testItDoesNotLoadTrashedSegments() {
|
||||
$this->segments[0]->trash();
|
||||
$data = $this->loader->load();
|
||||
expect($data)->count(1);
|
||||
expect($data[0])->isInstanceOf('\MailPoet\Models\DynamicSegment');
|
||||
expect($data[0]->name)->equals('segment 2');
|
||||
}
|
||||
|
||||
public function testItPopulatesCommonData() {
|
||||
$data = $this->loader->load();
|
||||
expect($data[0]->name)->equals('segment 1');
|
||||
expect($data[1]->name)->equals('segment 2');
|
||||
expect($data[0]->description)->equals('description');
|
||||
expect($data[1]->description)->equals('description');
|
||||
}
|
||||
|
||||
public function testItPopulatesFilters() {
|
||||
$data = $this->loader->load();
|
||||
$filters0 = $data[0]->getFilters();
|
||||
$filters1 = $data[1]->getFilters();
|
||||
expect($filters0)->count(1);
|
||||
expect($filters1)->count(1);
|
||||
/** @var UserRole $filter0 */
|
||||
$filter0 = $filters0[0];
|
||||
/** @var UserRole $filter1 */
|
||||
$filter1 = $filters1[0];
|
||||
expect($filter0)->isInstanceOf('\MailPoet\DynamicSegments\Filters\UserRole');
|
||||
expect($filter1)->isInstanceOf('\MailPoet\DynamicSegments\Filters\UserRole');
|
||||
expect($filter0->getRole())->equals('Editor');
|
||||
expect($filter1->getRole())->equals('Administrator');
|
||||
}
|
||||
|
||||
public function _after() {
|
||||
ORM::raw_execute('TRUNCATE ' . DynamicSegment::$_table);
|
||||
ORM::raw_execute('TRUNCATE ' . DynamicSegmentFilter::$_table);
|
||||
}
|
||||
}
|
@@ -1,71 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace MailPoet\DynamicSegments\Persistence\Loading;
|
||||
|
||||
use MailPoet\DynamicSegments\Filters\UserRole;
|
||||
use MailPoet\DynamicSegments\RequirementsChecker;
|
||||
use MailPoet\Models\DynamicSegment;
|
||||
use MailPoet\Models\Subscriber;
|
||||
use PHPUnit\Framework\MockObject\MockObject;
|
||||
|
||||
class SubscribersCountTest extends \MailPoetTest {
|
||||
|
||||
/** @var RequirementsChecker|MockObject */
|
||||
private $requirementChecker;
|
||||
|
||||
public function _before() {
|
||||
$this->cleanData();
|
||||
$this->tester->createWordPressUser('user-role-test1@example.com', 'editor');
|
||||
$this->tester->createWordPressUser('user-role-test2@example.com', 'administrator');
|
||||
$this->tester->createWordPressUser('user-role-test3@example.com', 'editor');
|
||||
$this->requirementChecker = $this
|
||||
->getMockBuilder(RequirementsChecker::class)
|
||||
->setMethods(['shouldSkipSegment'])
|
||||
->getMock();
|
||||
}
|
||||
|
||||
public function testItConstructsQuery() {
|
||||
$this->requirementChecker->method('shouldSkipSegment')->willReturn(false);
|
||||
$userRole = DynamicSegment::create();
|
||||
$subscriber1 = Subscriber::findOne('user-role-test1@example.com');
|
||||
$subscriber1->status = Subscriber::STATUS_SUBSCRIBED;
|
||||
$subscriber1->save();
|
||||
$subscriber3 = Subscriber::findOne('user-role-test3@example.com');
|
||||
$subscriber3->status = Subscriber::STATUS_SUBSCRIBED;
|
||||
$subscriber3->save();
|
||||
$userRole->hydrate([
|
||||
'name' => 'segment',
|
||||
'description' => 'description',
|
||||
]);
|
||||
$userRole->setFilters([new UserRole('editor', 'and')]);
|
||||
|
||||
$loader = new SubscribersCount($this->requirementChecker);
|
||||
$count = $loader->getSubscribersCount($userRole);
|
||||
expect($count)->equals(2);
|
||||
}
|
||||
|
||||
public function testItSkipsIfRequirementNotMet() {
|
||||
$this->requirementChecker->method('shouldSkipSegment')->willReturn(true);
|
||||
$userRole = DynamicSegment::create();
|
||||
$userRole->hydrate([
|
||||
'name' => 'segment',
|
||||
'description' => 'description',
|
||||
]);
|
||||
$userRole->setFilters([new UserRole('editor', 'and')]);
|
||||
|
||||
$loader = new SubscribersCount($this->requirementChecker);
|
||||
$count = $loader->getSubscribersCount($userRole);
|
||||
expect($count)->equals(0);
|
||||
}
|
||||
|
||||
public function _after() {
|
||||
$this->cleanData();
|
||||
}
|
||||
|
||||
private function cleanData() {
|
||||
$emails = ['user-role-test1@example.com', 'user-role-test2@example.com', 'user-role-test3@example.com'];
|
||||
foreach ($emails as $email) {
|
||||
$this->tester->deleteWordPressUser($email);
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,95 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace MailPoet\DynamicSegments\Persistence\Loading;
|
||||
|
||||
require_once(ABSPATH . 'wp-admin/includes/user.php');
|
||||
|
||||
use MailPoet\DynamicSegments\Filters\UserRole;
|
||||
use MailPoet\DynamicSegments\RequirementsChecker;
|
||||
use MailPoet\Models\DynamicSegment;
|
||||
use MailPoet\Models\Subscriber;
|
||||
use PHPUnit\Framework\MockObject\MockObject;
|
||||
|
||||
class SubscribersIdsTest extends \MailPoetTest {
|
||||
|
||||
private $editorsWpIds = [];
|
||||
|
||||
/** @var RequirementsChecker|MockObject */
|
||||
private $requirementChecker;
|
||||
|
||||
public function _before() {
|
||||
$this->cleanData();
|
||||
$this->editorsWpIds[] = wp_insert_user([
|
||||
'user_login' => 'user-role-test1',
|
||||
'user_email' => 'user-role-test1@example.com',
|
||||
'role' => 'editor',
|
||||
'user_pass' => '12123154',
|
||||
]);
|
||||
wp_insert_user([
|
||||
'user_login' => 'user-role-test2',
|
||||
'user_email' => 'user-role-test2@example.com',
|
||||
'role' => 'administrator',
|
||||
'user_pass' => '12123154',
|
||||
]);
|
||||
$this->editorsWpIds[] = wp_insert_user([
|
||||
'user_login' => 'user-role-test3',
|
||||
'user_email' => 'user-role-test3@example.com',
|
||||
'role' => 'editor',
|
||||
'user_pass' => '12123154',
|
||||
]);
|
||||
$this->requirementChecker = $this
|
||||
->getMockBuilder(RequirementsChecker::class)
|
||||
->setMethods(['shouldSkipSegment'])
|
||||
->getMock();
|
||||
}
|
||||
|
||||
public function testItConstructsSubscribersIdQueryForAnyDynamicSegment() {
|
||||
$this->requirementChecker->method('shouldSkipSegment')->willReturn(false);
|
||||
$userRole = DynamicSegment::create();
|
||||
$userRole->hydrate([
|
||||
'name' => 'segment',
|
||||
'description' => 'description',
|
||||
]);
|
||||
$userRole->setFilters([new UserRole('editor', 'and')]);
|
||||
$loader = new SubscribersIds($this->requirementChecker);
|
||||
$result = $loader->load($userRole);
|
||||
$wpIds = [
|
||||
Subscriber::findOne($result[0]->id)->wp_user_id,
|
||||
Subscriber::findOne($result[1]->id)->wp_user_id,
|
||||
];
|
||||
$this->assertEquals($wpIds, $this->editorsWpIds, $message = '', $delta = 0.0, $maxDepth = 10, $canonicalize = true);
|
||||
}
|
||||
|
||||
public function testItSkipsConstructingSubscribersIdQueryForAnyDynamicSegmentIfRequirementsNotMet() {
|
||||
$this->requirementChecker->method('shouldSkipSegment')->willReturn(true);
|
||||
$userRole = DynamicSegment::create();
|
||||
$userRole->hydrate([
|
||||
'name' => 'segment',
|
||||
'description' => 'description',
|
||||
]);
|
||||
$userRole->setFilters([new UserRole('editor', 'and')]);
|
||||
$loader = new SubscribersIds($this->requirementChecker);
|
||||
$result = $loader->load($userRole);
|
||||
expect($result)->isEmpty();
|
||||
}
|
||||
|
||||
public function _after() {
|
||||
$this->cleanData();
|
||||
}
|
||||
|
||||
private function cleanData() {
|
||||
$emails = ['user-role-test1@example.com', 'user-role-test2@example.com', 'user-role-test3@example.com'];
|
||||
foreach ($emails as $email) {
|
||||
$user = get_user_by('email', $email);
|
||||
if (!$user) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (is_multisite()) {
|
||||
wpmu_delete_user($user->ID);
|
||||
} else {
|
||||
wp_delete_user($user->ID);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user