Skip to content

Commit

Permalink
perf: Cache online users for 40seconds
Browse files Browse the repository at this point in the history
  • Loading branch information
SychO9 committed Mar 3, 2022
1 parent 3ecb76f commit ca458d3
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 13 deletions.
2 changes: 1 addition & 1 deletion src/LoadForumOnlineUsersRelationship.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,6 @@ public function __invoke(ShowForumController $controller, &$data, ServerRequestI

$actor = RequestUtil::getActor($request);

$data['onlineUsers'] = $this->repository->getOnlineUsers($actor);
$data['onlineUsers'] = $this->repository->getOnlineUsers($actor) ?: null;
}
}
33 changes: 21 additions & 12 deletions src/UserRepository.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@

namespace Afrux\OnlineUsers;

use Afrux\ForumWidgets\SafeCacheRepositoryAdapter;
use Carbon\Carbon;
use Flarum\User\User;
use Flarum\Settings\SettingsRepositoryInterface;
Expand All @@ -22,27 +23,35 @@ class UserRepository
*/
protected $settings;

public function __construct(SettingsRepositoryInterface $settings)
/**
* @var SafeCacheRepositoryAdapter
*/
protected $cache;

public function __construct(SettingsRepositoryInterface $settings, SafeCacheRepositoryAdapter $cache)
{
$this->settings = $settings;
$this->cache = $cache;
}

public function getLastSeenUsers(User $actor): array
{
$time = Carbon::now()->subMinutes(5);
$limit = $this->settings->get('afrux-online-users-widget.max_users', 15);

return User::query()
->select('id', 'preferences')
->whereVisibleTo($actor)
->where('last_seen_at', '>', $time)
->limit($limit + 1)
->get()
->filter(function ($user) {
return (bool) $user->getPreference('discloseOnline');
})
->pluck('id')
->toArray();
return $this->cache->remember('afrux-online-users-widget.users', 40, function () use ($actor, $time, $limit) {
return User::query()
->select('id', 'preferences')
->whereVisibleTo($actor)
->where('last_seen_at', '>', $time)
->limit($limit + 1)
->get()
->filter(function ($user) {
return (bool)$user->getPreference('discloseOnline');
})
->pluck('id')
->toArray();
}) ?: [];
}

public function getOnlineUsers(User $actor)
Expand Down

0 comments on commit ca458d3

Please sign in to comment.