77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
		
		
			
		
	
	
			77 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
|  | <?php namespace BookStack\Services; | ||
|  | 
 | ||
|  | 
 | ||
|  | use BookStack\Entity; | ||
|  | use BookStack\View; | ||
|  | 
 | ||
|  | class ViewService | ||
|  | { | ||
|  | 
 | ||
|  |     protected $view; | ||
|  |     protected $user; | ||
|  | 
 | ||
|  |     /** | ||
|  |      * ViewService constructor. | ||
|  |      * @param $view | ||
|  |      */ | ||
|  |     public function __construct(View $view) | ||
|  |     { | ||
|  |         $this->view = $view; | ||
|  |         $this->user = auth()->user(); | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Add a view to the given entity. | ||
|  |      * @param Entity $entity | ||
|  |      * @return int | ||
|  |      */ | ||
|  |     public function add(Entity $entity) | ||
|  |     { | ||
|  |         $view = $entity->views()->where('user_id', '=', $this->user->id)->first(); | ||
|  |         // Add view if model exists
 | ||
|  |         if ($view) { | ||
|  |             $view->increment('views'); | ||
|  |             return $view->views; | ||
|  |         } | ||
|  | 
 | ||
|  |         // Otherwise create new view count
 | ||
|  |         $entity->views()->save($this->view->create([ | ||
|  |             'user_id' => $this->user->id, | ||
|  |             'views' => 1 | ||
|  |         ])); | ||
|  | 
 | ||
|  |         return 1; | ||
|  |     } | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Get all recently viewed entities for the current user. | ||
|  |      * @param int         $count | ||
|  |      * @param int         $page | ||
|  |      * @param Entity|bool $filterModel | ||
|  |      * @return mixed | ||
|  |      */ | ||
|  |     public function getUserRecentlyViewed($count = 10, $page = 0, $filterModel = false) | ||
|  |     { | ||
|  |         $skipCount = $count * $page; | ||
|  |         $query = $this->view->where('user_id', '=', auth()->user()->id); | ||
|  | 
 | ||
|  |         if ($filterModel) $query->where('viewable_type', '=', get_class($filterModel)); | ||
|  | 
 | ||
|  |         $views = $query->with('viewable')->orderBy('updated_at', 'desc')->skip($skipCount)->take($count)->get(); | ||
|  |         $viewedEntities = $views->map(function ($item) { | ||
|  |             return $item->viewable()->getResults(); | ||
|  |         }); | ||
|  |         return $viewedEntities; | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  |     /** | ||
|  |      * Reset all view counts by deleting all views. | ||
|  |      */ | ||
|  |     public function resetAll() | ||
|  |     { | ||
|  |         $this->view->truncate(); | ||
|  |     } | ||
|  | 
 | ||
|  | 
 | ||
|  | } |