diff --git a/lib/Config/Populator.php b/lib/Config/Populator.php index cc387c0edc..650fe2b8aa 100644 --- a/lib/Config/Populator.php +++ b/lib/Config/Populator.php @@ -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(); diff --git a/lib/DI/ContainerConfigurator.php b/lib/DI/ContainerConfigurator.php index 477684a6ac..75e3b6a939 100644 --- a/lib/DI/ContainerConfigurator.php +++ b/lib/DI/ContainerConfigurator.php @@ -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); diff --git a/lib/Doctrine/Entities/UserFlag.php b/lib/Doctrine/Entities/UserFlag.php new file mode 100644 index 0000000000..2c4b151dfe --- /dev/null +++ b/lib/Doctrine/Entities/UserFlag.php @@ -0,0 +1,65 @@ +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; + } +} diff --git a/lib/Models/UserFlag.php b/lib/Models/UserFlag.php deleted file mode 100644 index 816d987e82..0000000000 --- a/lib/Models/UserFlag.php +++ /dev/null @@ -1,24 +0,0 @@ - $data['user_id'], - 'name' => $data['name'], - ]; - } - return parent::_createOrUpdate($data, $keys); - } -} diff --git a/lib/Settings/UserFlagsController.php b/lib/Settings/UserFlagsController.php index 3c1093461a..e10f7abe54 100644 --- a/lib/Settings/UserFlagsController.php +++ b/lib/Settings/UserFlagsController.php @@ -1,26 +1,26 @@ 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(); } } -} \ No newline at end of file +} diff --git a/lib/Settings/UserFlagsRepository.php b/lib/Settings/UserFlagsRepository.php new file mode 100644 index 0000000000..52bf374b66 --- /dev/null +++ b/lib/Settings/UserFlagsRepository.php @@ -0,0 +1,19 @@ +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"); + } } diff --git a/tests/integration/Models/UserFlagTest.php b/tests/integration/Models/UserFlagTest.php deleted file mode 100644 index e89d3889af..0000000000 --- a/tests/integration/Models/UserFlagTest.php +++ /dev/null @@ -1,45 +0,0 @@ - 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); - } - -} diff --git a/tests/integration/Settings/UserFlagsControllerTest.php b/tests/integration/Settings/UserFlagsControllerTest.php index 32a078f69a..370169eeb3 100644 --- a/tests/integration/Settings/UserFlagsControllerTest.php +++ b/tests/integration/Settings/UserFlagsControllerTest.php @@ -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"); + } }