Rewrite UserFlag entity to Doctrine

[MAILPOET-2014]
This commit is contained in:
Jan Jakeš
2019-07-04 11:24:06 +02:00
committed by M. Shull
parent 7105c8ad5b
commit c71bf4833c
9 changed files with 212 additions and 141 deletions

View File

@ -7,6 +7,8 @@ use MailPoet\Cron\CronTrigger;
use MailPoet\Cron\Workers\AuthorizedSendingEmailsCheck;
use MailPoet\Cron\Workers\Beamer;
use MailPoet\Cron\Workers\InactiveSubscribers;
use MailPoet\Doctrine\Entities\UserFlag;
use MailPoet\Settings\UserFlagsRepository;
use MailPoet\Mailer\MailerLog;
use MailPoet\Models\NewsletterTemplate;
use MailPoet\Models\Form;
@ -15,7 +17,6 @@ use MailPoet\Models\Segment;
use MailPoet\Models\SendingQueue;
use MailPoet\Models\StatisticsForms;
use MailPoet\Models\Subscriber;
use MailPoet\Models\UserFlag;
use MailPoet\Models\Setting;
use MailPoet\Segments\WP;
use MailPoet\Services\Bridge;
@ -281,11 +282,7 @@ class Populator {
$last_announcement_seen = $this->settings->fetch('last_announcement_seen');
if (!empty($last_announcement_seen)) {
foreach ($last_announcement_seen as $user_id => $value) {
UserFlag::createOrUpdate([
'user_id' => $user_id,
'name' => 'last_announcement_seen',
'value' => $value,
]);
$this->createOrUpdateUserFlag($user_id, 'last_announcement_seen', $value);
}
$this->settings->delete('last_announcement_seen');
}
@ -296,16 +293,29 @@ class Populator {
if (!empty($users_seen_editor_tutorial)) {
foreach ($users_seen_editor_tutorial as $setting) {
$user_id = substr($setting->name, $prefix_length);
UserFlag::createOrUpdate([
'user_id' => $user_id,
'name' => 'editor_tutorial_seen',
'value' => $setting->value,
]);
$this->createOrUpdateUserFlag($user_id, 'editor_tutorial_seen', $setting->value);
}
Setting::whereLike('name', $prefix . '%')->deleteMany();
}
}
private function createOrUpdateUserFlag($user_id, $name, $value) {
$user_flags_repository = \MailPoet\DI\ContainerWrapper::getInstance(WP_DEBUG)->get(UserFlagsRepository::class);
$flag = $user_flags_repository->findOneBy([
'user_id' => $user_id,
'name' => $name,
]);
if (!$flag) {
$flag = new UserFlag();
$flag->setUserId($user_id);
$flag->setName($name);
$user_flags_repository->persist($flag);
}
$flag->setValue($value);
$user_flags_repository->flush();
}
private function createDefaultSegments() {
// WP Users segment
Segment::getWPSegment();

View File

@ -156,6 +156,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\Settings\SettingsController::class)->setPublic(true);
// User Flags
$container->autowire(\MailPoet\Settings\UserFlagsController::class);
$container->autowire(\MailPoet\Settings\UserFlagsRepository::class);
// Subscription
$container->autowire(\MailPoet\Subscription\Captcha::class)->setPublic(true);
$container->autowire(\MailPoet\Subscription\CaptchaRenderer::class)->setPublic(true);

View File

@ -0,0 +1,65 @@
<?php
namespace MailPoet\Doctrine\Entities;
use MailPoet\Doctrine\EntityTraits\AutoincrementedIdTrait;
use MailPoet\Doctrine\EntityTraits\CreatedAtTrait;
use MailPoet\Doctrine\EntityTraits\UpdatedAtTrait;
/**
* @Entity()
* @Table(name="user_flags")
*/
class UserFlag {
use AutoincrementedIdTrait;
use CreatedAtTrait;
use UpdatedAtTrait;
/**
* @Column(type="integer")
* @var int
*/
private $user_id;
/**
* @Column(type="string")
* @var string
*/
private $name;
/**
* @Column(type="string")
* @var string|null
*/
private $value;
/** @return int */
public function getUserId() {
return $this->user_id;
}
/** @param int $user_id */
public function setUserId($user_id) {
$this->user_id = $user_id;
}
/** @return string */
public function getName() {
return $this->name;
}
/** @param string $name */
public function setName($name) {
$this->name = $name;
}
/** @return string|null */
public function getValue() {
return $this->value;
}
/** @param string|null $value */
public function setValue($value) {
$this->value = $value;
}
}

View File

@ -1,24 +0,0 @@
<?php
namespace MailPoet\Models;
if (!defined('ABSPATH')) exit;
/**
* @property int $user_id
* @property string $name
* @property string $value
*/
class UserFlag extends Model {
public static $_table = MP_USER_FLAGS_TABLE;
public static function createOrUpdate($data = []) {
$keys = false;
if (!empty($data['user_id']) && !empty($data['name'])) {
$keys = [
'user_id' => $data['user_id'],
'name' => $data['name'],
];
}
return parent::_createOrUpdate($data, $keys);
}
}

View File

@ -1,26 +1,26 @@
<?php
namespace MailPoet\Settings;
use MailPoet\Models\UserFlag;
use MailPoet\Doctrine\Entities\UserFlag;
use MailPoet\WP\Functions as WPFunctions;
class UserFlagsController {
/**
* @var array|null
*/
/** @var array|null */
private $data = null;
/**
* @var array
*/
/** @var array */
private $defaults;
function __construct() {
/** @var UserFlagsRepository */
private $user_flags_repository;
function __construct(UserFlagsRepository $user_flags_repository) {
$this->defaults = [
'last_announcement_seen' => false,
'editor_tutorial_seen' => false,
];
$this->user_flags_repository = $user_flags_repository;
}
function get($name) {
@ -38,11 +38,20 @@ class UserFlagsController {
function set($name, $value) {
$current_user_id = WPFunctions::get()->getCurrentUserId();
UserFlag::createOrUpdate([
$flag = $this->user_flags_repository->findOneBy([
'user_id' => $current_user_id,
'name' => $name,
'value' => $value,
]);
if (!$flag) {
$flag = new UserFlag();
$flag->setUserId($current_user_id);
$flag->setName($name);
$this->user_flags_repository->persist($flag);
}
$flag->setValue($value);
$this->user_flags_repository->flush();
if ($this->isLoaded()) {
$this->data[$name] = $value;
}
@ -50,9 +59,18 @@ class UserFlagsController {
function delete($name) {
$current_user_id = WPFunctions::get()->getCurrentUserId();
UserFlag::where('user_id', $current_user_id)
->where('name', $name)
->deleteMany();
$flag = $this->user_flags_repository->findOneBy([
'user_id' => $current_user_id,
'name' => $name,
]);
if (!$flag) {
return;
}
$this->user_flags_repository->remove($flag);
$this->user_flags_repository->flush();
if ($this->isLoaded()) {
unset($this->data[$name]);
}
@ -60,10 +78,10 @@ class UserFlagsController {
private function load() {
$current_user_id = WPFunctions::get()->getCurrentUserId();
$flags = UserFlag::where('user_id', $current_user_id)->findMany();
$flags = $this->user_flags_repository->findBy(['user_id' => $current_user_id]);
$this->data = [];
foreach ($flags as $flag) {
$this->data[$flag->name] = $flag->value;
$this->data[$flag->getName()] = $flag->getValue();
}
}
@ -76,4 +94,4 @@ class UserFlagsController {
$this->load();
}
}
}
}

View File

@ -0,0 +1,19 @@
<?php
namespace MailPoet\Settings;
use MailPoet\Doctrine\Entities\UserFlag;
use MailPoet\Doctrine\Repository;
/**
* @method UserFlag[] findBy(array $criteria, array $order_by = null, int $limit = null, int $offset = null)
* @method UserFlag|null findOneBy(array $criteria, array $order_by = null)
* @method UserFlag|null findOneById(mixed $id)
* @method void persist(UserFlag $entity)
* @method void remove(UserFlag $entity)
*/
class UserFlagsRepository extends Repository {
protected function getEntityClassName() {
return UserFlag::class;
}
}

View File

@ -1,11 +1,13 @@
<?php
namespace MailPoet\Test\API\JSON\v1;
use Codeception\Stub;
use MailPoet\API\JSON\Response as APIResponse;
use MailPoet\API\JSON\Error as APIError;
use MailPoet\API\JSON\v1\UserFlags;
use MailPoet\Models\UserFlag;
use MailPoet\Doctrine\Entities\UserFlag;
use MailPoet\Settings\UserFlagsRepository;
use MailPoet\Settings\UserFlagsController;
class UserFlagsTest extends \MailPoetTest {
@ -17,9 +19,9 @@ class UserFlagsTest extends \MailPoetTest {
private $user_flags;
function _before() {
parent::_before();
UserFlag::deleteMany();
$this->user_flags = Stub::make(new UserFlagsController, [
$this->cleanup();
$this->user_flags = Stub::make(UserFlagsController::class, [
'user_flags_repository' => $this->di_container->get(UserFlagsRepository::class),
'defaults' => [
'flag_1' => 'default_value_1',
'flag_2' => 'default_value_2',
@ -53,4 +55,13 @@ class UserFlagsTest extends \MailPoetTest {
'flag_3' => 'new_value_3',
]);
}
function _after() {
$this->cleanup();
}
private function cleanup() {
$table_name = $this->entity_manager->getClassMetadata(UserFlag::class)->getTableName();
$this->entity_manager->getConnection()->executeUpdate("TRUNCATE $table_name");
}
}

View File

@ -1,45 +0,0 @@
<?php
namespace MailPoet\Test\Models;
use MailPoet\Models\UserFlag;
class UserFlagTest extends \MailPoetTest {
function _before() {
UserFlag::deleteMany();
}
function testCreateOrUpdateCreatesNewFlags() {
$created_flag = UserFlag::createOrUpdate([
'user_id' => 3,
'name' => 'first_flag',
'value' => 'foo',
]);
$other_flag = UserFlag::createOrUpdate([
'user_id' => 3,
'name' => 'second_flag',
'value' => 'bar',
]);
expect($created_flag->id > 0)->true();
expect($created_flag->getErrors())->false();
expect($other_flag->id != $created_flag->id)->true();
expect(UserFlag::count())->equals(2);
}
function testCreateOrUpdateUpdatesExistingFlags() {
$created_flag = UserFlag::createOrUpdate([
'user_id' => 3,
'name' => 'first_flag',
'value' => 'foo',
]);
$updated_flag = UserFlag::createOrUpdate([
'user_id' => 3,
'name' => 'first_flag',
'value' => 'bar',
]);
expect($updated_flag->id)->equals($created_flag->id);
expect($updated_flag->value)->equals('bar');
expect(UserFlag::count())->equals(1);
}
}

View File

@ -2,7 +2,8 @@
namespace MailPoet\Test\Settings;
use Codeception\Stub;
use MailPoet\Models\UserFlag;
use MailPoet\Doctrine\Entities\UserFlag;
use MailPoet\Settings\UserFlagsRepository;
use MailPoet\Settings\UserFlagsController;
use MailPoet\WP\Functions as WPFunctions;
@ -11,46 +12,37 @@ class UserFlagsControllerTest extends \MailPoetTest {
/** @var UserFlagsController */
private $user_flags;
/** @var UserFlagsRepository */
private $user_flags_repository;
/** @var int */
private $current_user_id;
function _before() {
parent::_before();
UserFlag::deleteMany();
$this->cleanup();
$current_user_id = 1;
$other_user_id = 2;
WPFunctions::set(Stub::make(new WPFunctions, [
'getCurrentUserId' => $current_user_id,
]));
$this->current_user_id = $current_user_id;
$this->user_flags = Stub::make(new UserFlagsController(), [
$this->user_flags_repository = $this->di_container->get(UserFlagsRepository::class);
$this->user_flags = Stub::make(UserFlagsController::class, [
'user_flags_repository' => $this->user_flags_repository,
'defaults' => [
'flag_1' => 'default_value_1',
'flag_2' => 'default_value_2',
'flag_3' => 'default_value_3',
],
]);
UserFlag::createOrUpdate([
'user_id' => $this->current_user_id,
'name' => 'flag_1',
'value' => 'value_1',
]);
UserFlag::createOrUpdate([
'user_id' => $this->current_user_id,
'name' => 'flag_3',
'value' => 'value_3',
]);
UserFlag::createOrUpdate([
'user_id' => $other_user_id,
'name' => 'flag_1',
'value' => 'other_value_1',
]);
UserFlag::createOrUpdate([
'user_id' => $other_user_id,
'name' => 'flag_2',
'value' => 'other_value_2',
]);
$this->createUserFlag($this->current_user_id, 'flag_1', 'value_1');
$this->createUserFlag($this->current_user_id, 'flag_3', 'value_3');
$this->createUserFlag($other_user_id, 'flag_1', 'other_value_1');
$this->createUserFlag($other_user_id, 'flag_2', 'other_value_2');
}
function testItGetsFlagsOfCurrentUser() {
@ -64,17 +56,9 @@ class UserFlagsControllerTest extends \MailPoetTest {
}
function testItLoadsDataOnlyOnceWhenNeeded() {
UserFlag::createOrUpdate([
'user_id' => $this->current_user_id,
'name' => 'flag_1',
'value' => 'new_value_1',
]);
$this->updateUserFlag($this->current_user_id, 'flag_1', 'new_value_1');
expect($this->user_flags->get('flag_1'))->equals('new_value_1');
UserFlag::createOrUpdate([
'user_id' => $this->current_user_id,
'name' => 'flag_1',
'value' => 'newer_value_1',
]);
$this->updateUserFlag($this->current_user_id, 'flag_1', 'newer_value_1');
expect($this->user_flags->get('flag_1'))->equals('new_value_1');
}
@ -82,23 +66,55 @@ class UserFlagsControllerTest extends \MailPoetTest {
expect($this->user_flags->get('flag_1'))->equals('value_1');
$this->user_flags->set('flag_1', 'updated_value');
expect($this->user_flags->get('flag_1'))->equals('updated_value');
$flag = UserFlag::where('user_id', $this->current_user_id)
->where('name', 'flag_1')
->findOne();
expect($flag->value)->equals('updated_value');
$flag = $this->user_flags_repository->findOneBy([
'user_id' => $this->current_user_id,
'name' => 'flag_1',
]);
expect($flag->getValue())->equals('updated_value');
}
function testItDeletesAFlag() {
expect($this->user_flags->get('flag_1'))->equals('value_1');
$this->user_flags->delete('flag_1');
expect($this->user_flags->get('flag_1'))->equals('default_value_1');
$flag = UserFlag::where('user_id', $this->current_user_id)
->where('name', 'flag_1')
->findOne();
expect($flag)->equals(false);
$flag = $this->user_flags_repository->findOneBy([
'user_id' => $this->current_user_id,
'name' => 'flag_1',
]);
expect($flag)->null();
}
function _after() {
$this->cleanup();
WPFunctions::set(new WPFunctions);
}
private function createUserFlag($user_id, $name, $value) {
$flag = new UserFlag();
$flag->setUserId($user_id);
$flag->setName($name);
$flag->setValue($value);
$this->user_flags_repository->persist($flag);
$this->user_flags_repository->flush();
return $flag;
}
private function updateUserFlag($user_id, $name, $value) {
$flag = $this->user_flags_repository->findOneBy([
'user_id' => $user_id,
'name' => $name,
]);
if (!$flag) {
throw new \Exception();
}
$flag->setValue($value);
$this->user_flags_repository->flush();
return $flag;
}
private function cleanup() {
$table_name = $this->entity_manager->getClassMetadata(UserFlag::class)->getTableName();
$this->connection->executeUpdate("TRUNCATE $table_name");
}
}