From bb1491e19ef7cb986f87568f86c74e0cb02a462b Mon Sep 17 00:00:00 2001 From: Toby Zerner Date: Mon, 1 Jun 2015 12:25:40 +0930 Subject: [PATCH] Extract current user attributes into a separate serializer This prevents the unread notifications count query being run for every post by the currently authenticated user --- src/Api/Actions/Users/ShowAction.php | 2 +- src/Api/Serializers/CurrentUserSerializer.php | 21 +++++++++++++++++++ src/Api/Serializers/UserSerializer.php | 14 +++---------- 3 files changed, 25 insertions(+), 12 deletions(-) create mode 100644 src/Api/Serializers/CurrentUserSerializer.php diff --git a/src/Api/Actions/Users/ShowAction.php b/src/Api/Actions/Users/ShowAction.php index 4350c5f6d..768016cd3 100644 --- a/src/Api/Actions/Users/ShowAction.php +++ b/src/Api/Actions/Users/ShowAction.php @@ -17,7 +17,7 @@ class ShowAction extends SerializeResourceAction * * @var string */ - public static $serializer = 'Flarum\Api\Serializers\UserSerializer'; + public static $serializer = 'Flarum\Api\Serializers\CurrentUserSerializer'; /** * The relationships that are available to be included, and which ones are diff --git a/src/Api/Serializers/CurrentUserSerializer.php b/src/Api/Serializers/CurrentUserSerializer.php new file mode 100644 index 000000000..a34d24be4 --- /dev/null +++ b/src/Api/Serializers/CurrentUserSerializer.php @@ -0,0 +1,21 @@ +actor->getUser(); + + if ($user->id === $actingUser->id) { + $attributes += [ + 'readTime' => $user->read_time ? $user->read_time->toRFC3339String() : null, + 'unreadNotificationsCount' => $user->getUnreadNotificationsCount(), + 'preferences' => $user->preferences + ]; + } + + return $this->extendAttributes($user, $attributes); + } +} diff --git a/src/Api/Serializers/UserSerializer.php b/src/Api/Serializers/UserSerializer.php index 2b6b912e5..b4c1bfa3a 100644 --- a/src/Api/Serializers/UserSerializer.php +++ b/src/Api/Serializers/UserSerializer.php @@ -12,8 +12,8 @@ class UserSerializer extends UserBasicSerializer { $attributes = parent::attributes($user); - $actorUser = $this->actor->getUser(); - $canEdit = $user->can($actorUser, 'edit'); + $actingUser = $this->actor->getUser(); + $canEdit = $user->can($actingUser, 'edit'); $attributes += [ 'bioHtml' => $user->bio_html, @@ -21,7 +21,7 @@ class UserSerializer extends UserBasicSerializer 'discussionsCount' => (int) $user->discussions_count, 'commentsCount' => (int) $user->comments_count, 'canEdit' => $canEdit, - 'canDelete' => $user->can($actorUser, 'delete'), + 'canDelete' => $user->can($actingUser, 'delete'), ]; if ($user->preference('discloseOnline')) { @@ -39,14 +39,6 @@ class UserSerializer extends UserBasicSerializer ]; } - if ($user->id === $actorUser->id) { - $attributes += [ - 'readTime' => $user->read_time ? $user->read_time->toRFC3339String() : null, - 'unreadNotificationsCount' => $user->getUnreadNotificationsCount(), - 'preferences' => $user->preferences - ]; - } - return $this->extendAttributes($user, $attributes); } }