X-Git-Url: http://source.bookstackapp.com/bookstack/blobdiff_plain/ea55b7f141a70e2d6edb209f6c48610a9c005e4e..refs/pull/73/head:/app/Services/ViewService.php diff --git a/app/Services/ViewService.php b/app/Services/ViewService.php index 55e32fe1c..5b800d939 100644 --- a/app/Services/ViewService.php +++ b/app/Services/ViewService.php @@ -27,6 +27,7 @@ class ViewService */ public function add(Entity $entity) { + if($this->user === null) return 0; $view = $entity->views()->where('user_id', '=', $this->user->id)->first(); // Add view if model exists if ($view) { @@ -43,6 +44,29 @@ class ViewService return 1; } + + /** + * Get the entities with the most views. + * @param int $count + * @param int $page + * @param bool|false $filterModel + */ + public function getPopular($count = 10, $page = 0, $filterModel = false) + { + $skipCount = $count * $page; + $query = $this->view->select('id', 'viewable_id', 'viewable_type', \DB::raw('SUM(views) as view_count')) + ->groupBy('viewable_id', 'viewable_type') + ->orderBy('view_count', 'desc'); + + if($filterModel) $query->where('viewable_type', '=', get_class($filterModel)); + + $views = $query->with('viewable')->skip($skipCount)->take($count)->get(); + $viewedEntities = $views->map(function ($item) { + return $item->viewable()->getResults(); + }); + return $viewedEntities; + } + /** * Get all recently viewed entities for the current user. * @param int $count @@ -52,6 +76,7 @@ class ViewService */ public function getUserRecentlyViewed($count = 10, $page = 0, $filterModel = false) { + if($this->user === null) return collect(); $skipCount = $count * $page; $query = $this->view->where('user_id', '=', auth()->user()->id);