Remove dynamic segments services that are no longer needed

[MAILPOET-3164]
This commit is contained in:
Rostislav Wolny
2021-01-20 16:14:58 +01:00
committed by Veljko V
parent b7914a3ff6
commit 9868f5cc21
9 changed files with 0 additions and 482 deletions

View File

@@ -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);

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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;
}
}

View File

@@ -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();
}
}

View File

@@ -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,
]);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}
}

View File

@@ -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);
}
}
}
}