From eed407812f163435ec8aa3d170a9fa89934830ef Mon Sep 17 00:00:00 2001 From: Alexander Skvortsov <38059171+askvortsov1@users.noreply.github.com> Date: Fri, 4 Dec 2020 15:45:08 -0500 Subject: [PATCH] User Preferences Extender and Tests (#2463) --- src/Event/ConfigureUserPreferences.php | 3 ++ src/Extend/User.php | 20 +++++++ .../Driver/AlertNotificationDriver.php | 2 +- .../Driver/EmailNotificationDriver.php | 2 +- src/User/User.php | 17 ++++++ src/User/UserServiceProvider.php | 15 ++---- tests/integration/extenders/UserTest.php | 54 +++++++++++++++++++ 7 files changed, 99 insertions(+), 14 deletions(-) diff --git a/src/Event/ConfigureUserPreferences.php b/src/Event/ConfigureUserPreferences.php index 895446ac3..27e986fe5 100644 --- a/src/Event/ConfigureUserPreferences.php +++ b/src/Event/ConfigureUserPreferences.php @@ -11,6 +11,9 @@ namespace Flarum\Event; use Flarum\User\User; +/** + * @deprecated beta 15, removed beta 16 + */ class ConfigureUserPreferences { public function add($key, callable $transformer = null, $default = null) diff --git a/src/Extend/User.php b/src/Extend/User.php index 58f5cc9ff..1664dc3e7 100644 --- a/src/Extend/User.php +++ b/src/Extend/User.php @@ -10,12 +10,14 @@ namespace Flarum\Extend; use Flarum\Extension\Extension; +use Flarum\User\User as FlarumUser; use Illuminate\Contracts\Container\Container; class User implements ExtenderInterface { private $displayNameDrivers = []; private $groupProcessors = []; + private $preferences = []; /** * Add a display name driver. @@ -51,6 +53,20 @@ class User implements ExtenderInterface return $this; } + /** + * Register a new user preference. + * + * @param string $key + * @param callable $transformer + * @param $default + */ + public function registerPreference(string $key, callable $transformer = null, $default = null) + { + $this->preferences[$key] = compact('transformer', 'default'); + + return $this; + } + public function extend(Container $container, Extension $extension = null) { $container->extend('flarum.user.display_name.supported_drivers', function ($existingDrivers) { @@ -60,5 +76,9 @@ class User implements ExtenderInterface $container->extend('flarum.user.group_processors', function ($existingRelations) { return array_merge($existingRelations, $this->groupProcessors); }); + + foreach ($this->preferences as $key => $preference) { + FlarumUser::registerPreference($key, $preference['transformer'], $preference['default']); + } } } diff --git a/src/Notification/Driver/AlertNotificationDriver.php b/src/Notification/Driver/AlertNotificationDriver.php index ccaba0169..69f03ac95 100644 --- a/src/Notification/Driver/AlertNotificationDriver.php +++ b/src/Notification/Driver/AlertNotificationDriver.php @@ -41,7 +41,7 @@ class AlertNotificationDriver implements NotificationDriverInterface */ public function registerType(string $blueprintClass, array $driversEnabledByDefault): void { - User::addPreference( + User::registerPreference( User::getNotificationPreferenceKey($blueprintClass::getType(), 'alert'), 'boolval', in_array('alert', $driversEnabledByDefault) diff --git a/src/Notification/Driver/EmailNotificationDriver.php b/src/Notification/Driver/EmailNotificationDriver.php index 36cdb8b9d..1a4870380 100644 --- a/src/Notification/Driver/EmailNotificationDriver.php +++ b/src/Notification/Driver/EmailNotificationDriver.php @@ -59,7 +59,7 @@ class EmailNotificationDriver implements NotificationDriverInterface public function registerType(string $blueprintClass, array $driversEnabledByDefault): void { if ((new ReflectionClass($blueprintClass))->implementsInterface(MailableInterface::class)) { - User::addPreference( + User::registerPreference( User::getNotificationPreferenceKey($blueprintClass::getType(), 'email'), 'boolval', in_array('email', $driversEnabledByDefault) diff --git a/src/User/User.php b/src/User/User.php index 6f8714539..24029fe43 100644 --- a/src/User/User.php +++ b/src/User/User.php @@ -143,6 +143,9 @@ class User extends AbstractModel Notification::whereSubject($user)->delete(); }); + /** + * @deprecated beta 15, remove beta 16 + */ static::$dispatcher->dispatch( new ConfigureUserPreferences ); @@ -801,6 +804,8 @@ class User extends AbstractModel } /** + * @deprecated beta 15, remove beta 16. Use `registerPreference` instead. + * * Register a preference with a transformer and a default value. * * @param string $key @@ -808,6 +813,18 @@ class User extends AbstractModel * @param mixed $default */ public static function addPreference($key, callable $transformer = null, $default = null) + { + return static::registerPreference($key, $transformer, $default); + } + + /** + * Register a preference with a transformer and a default value. + * + * @param string $key + * @param callable $transformer + * @param mixed $default + */ + public static function registerPreference($key, callable $transformer = null, $default = null) { static::$preferences[$key] = compact('transformer', 'default'); } diff --git a/src/User/UserServiceProvider.php b/src/User/UserServiceProvider.php index ae5658dab..fa7968723 100644 --- a/src/User/UserServiceProvider.php +++ b/src/User/UserServiceProvider.php @@ -9,7 +9,6 @@ namespace Flarum\User; -use Flarum\Event\ConfigureUserPreferences; use Flarum\Foundation\AbstractServiceProvider; use Flarum\Foundation\ContainerUtil; use Flarum\Settings\SettingsRepositoryInterface; @@ -94,16 +93,8 @@ class UserServiceProvider extends AbstractServiceProvider $events->subscribe(UserMetadataUpdater::class); $events->subscribe(UserPolicy::class); - $events->listen(ConfigureUserPreferences::class, [$this, 'configureUserPreferences']); - } - - /** - * @param ConfigureUserPreferences $event - */ - public function configureUserPreferences(ConfigureUserPreferences $event) - { - $event->add('discloseOnline', 'boolval', true); - $event->add('indexProfile', 'boolval', true); - $event->add('locale'); + User::registerPreference('discloseOnline', 'boolval', true); + User::registerPreference('indexProfile', 'boolval', true); + User::registerPreference('locale'); } } diff --git a/tests/integration/extenders/UserTest.php b/tests/integration/extenders/UserTest.php index bb11412b4..28eb86fa3 100644 --- a/tests/integration/extenders/UserTest.php +++ b/tests/integration/extenders/UserTest.php @@ -14,6 +14,7 @@ use Flarum\Tests\integration\RetrievesAuthorizedUsers; use Flarum\Tests\integration\TestCase; use Flarum\User\DisplayName\DriverInterface; use Flarum\User\User; +use Illuminate\Support\Arr; class UserTest extends TestCase { @@ -35,6 +36,14 @@ class UserTest extends TestCase ]); } + protected function registerTestPreference() + { + $this->extend( + (new Extend\User()) + ->registerPreference('test', 'boolval', true) + ); + } + /** * @test */ @@ -104,6 +113,51 @@ class UserTest extends TestCase $this->assertNotContains('viewUserList', $user->getPermissions()); } + + /** + * @test + */ + public function can_add_user_preference() + { + $this->registerTestPreference(); + $this->prepDb(); + + /** @var User $user */ + $user = User::find(2); + $this->assertEquals(true, Arr::get($user->preferences, 'test')); + } + + /** + * @test + */ + public function can_store_user_preference() + { + $this->registerTestPreference(); + $this->prepDb(); + + /** @var User $user */ + $user = User::find(2); + + $user->setPreference('test', false); + + $this->assertEquals(false, $user->getPreference('test')); + } + + /** + * @test + */ + public function storing_user_preference_modified_by_transformer() + { + $this->registerTestPreference(); + $this->prepDb(); + + /** @var User $user */ + $user = User::find(2); + + $user->setPreference('test', []); + + $this->assertEquals(false, $user->getPreference('test')); + } } class CustomDisplayNameDriver implements DriverInterface