| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  | <?php namespace BookStack\Actions; | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  | use BookStack\Auth\Permissions\PermissionService; | 
					
						
							|  |  |  | use BookStack\Entities\Entity; | 
					
						
							| 
									
										
										
										
											2019-03-31 00:54:15 +08:00
										 |  |  | use BookStack\Entities\EntityProvider; | 
					
						
							|  |  |  | use Illuminate\Support\Collection; | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | class ViewService | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     protected $view; | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |     protected $permissionService; | 
					
						
							| 
									
										
										
										
											2019-03-31 00:54:15 +08:00
										 |  |  |     protected $entityProvider; | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * ViewService constructor. | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  |      * @param \BookStack\Actions\View $view | 
					
						
							|  |  |  |      * @param \BookStack\Auth\Permissions\PermissionService $permissionService | 
					
						
							| 
									
										
										
										
											2019-03-31 00:54:15 +08:00
										 |  |  |      * @param EntityProvider $entityProvider | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-03-31 00:54:15 +08:00
										 |  |  |     public function __construct(View $view, PermissionService $permissionService, EntityProvider $entityProvider) | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $this->view = $view; | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         $this->permissionService = $permissionService; | 
					
						
							| 
									
										
										
										
											2019-03-31 00:54:15 +08:00
										 |  |  |         $this->entityProvider = $entityProvider; | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Add a view to the given entity. | 
					
						
							|  |  |  |      * @param Entity $entity | 
					
						
							|  |  |  |      * @return int | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function add(Entity $entity) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-01-02 01:33:06 +08:00
										 |  |  |         $user = user(); | 
					
						
							| 
									
										
										
										
											2018-01-29 00:58:52 +08:00
										 |  |  |         if ($user === null || $user->isDefault()) { | 
					
						
							|  |  |  |             return 0; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-01-02 01:33:06 +08:00
										 |  |  |         $view = $entity->views()->where('user_id', '=', $user->id)->first(); | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |         // Add view if model exists
 | 
					
						
							|  |  |  |         if ($view) { | 
					
						
							|  |  |  |             $view->increment('views'); | 
					
						
							|  |  |  |             return $view->views; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Otherwise create new view count
 | 
					
						
							|  |  |  |         $entity->views()->save($this->view->create([ | 
					
						
							| 
									
										
										
										
											2017-01-02 05:21:11 +08:00
										 |  |  |             'user_id' => $user->id, | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |             'views' => 1 | 
					
						
							|  |  |  |         ])); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return 1; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-03 04:22:41 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get the entities with the most views. | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |      * @param int $count | 
					
						
							|  |  |  |      * @param int $page | 
					
						
							| 
									
										
										
										
											2019-03-31 00:54:15 +08:00
										 |  |  |      * @param string|array $filterModels | 
					
						
							| 
									
										
										
										
											2018-04-15 01:00:16 +08:00
										 |  |  |      * @param string $action - used for permission checking | 
					
						
							| 
									
										
										
										
											2019-03-31 00:54:15 +08:00
										 |  |  |      * @return Collection | 
					
						
							| 
									
										
										
										
											2015-12-03 04:22:41 +08:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2019-04-07 16:57:48 +08:00
										 |  |  |     public function getPopular(int $count = 10, int $page = 0, $filterModels = null, string $action = 'view') | 
					
						
							| 
									
										
										
										
											2015-12-03 04:22:41 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         $skipCount = $count * $page; | 
					
						
							| 
									
										
										
										
											2019-04-07 16:57:48 +08:00
										 |  |  |         $query = $this->permissionService | 
					
						
							|  |  |  |             ->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type', $action) | 
					
						
							| 
									
										
										
										
											2016-04-09 21:26:42 +08:00
										 |  |  |             ->select('*', 'viewable_id', 'viewable_type', \DB::raw('SUM(views) as view_count')) | 
					
						
							| 
									
										
										
										
											2015-12-03 04:22:41 +08:00
										 |  |  |             ->groupBy('viewable_id', 'viewable_type') | 
					
						
							|  |  |  |             ->orderBy('view_count', 'desc'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-31 00:54:15 +08:00
										 |  |  |         if ($filterModels) { | 
					
						
							|  |  |  |             $query->whereIn('viewable_type', $this->entityProvider->getMorphClasses($filterModels)); | 
					
						
							| 
									
										
										
										
											2017-08-28 20:38:32 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2015-12-03 04:22:41 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-09 21:26:42 +08:00
										 |  |  |         return $query->with('viewable')->skip($skipCount)->take($count)->get()->pluck('viewable'); | 
					
						
							| 
									
										
										
										
											2015-12-03 04:22:41 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Get all recently viewed entities for the current user. | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |      * @param int $count | 
					
						
							|  |  |  |      * @param int $page | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |      * @param Entity|bool $filterModel | 
					
						
							|  |  |  |      * @return mixed | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getUserRecentlyViewed($count = 10, $page = 0, $filterModel = false) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2017-01-02 01:33:06 +08:00
										 |  |  |         $user = user(); | 
					
						
							| 
									
										
										
										
											2018-01-29 00:58:52 +08:00
										 |  |  |         if ($user === null || $user->isDefault()) { | 
					
						
							|  |  |  |             return collect(); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-04-09 21:26:42 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-02 04:20:50 +08:00
										 |  |  |         $query = $this->permissionService | 
					
						
							| 
									
										
										
										
											2016-02-29 03:03:04 +08:00
										 |  |  |             ->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type'); | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-01-29 00:58:52 +08:00
										 |  |  |         if ($filterModel) { | 
					
						
							| 
									
										
										
										
											2018-09-25 19:30:50 +08:00
										 |  |  |             $query = $query->where('viewable_type', '=', $filterModel->getMorphClass()); | 
					
						
							| 
									
										
										
										
											2018-01-29 00:58:52 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-01-02 01:33:06 +08:00
										 |  |  |         $query = $query->where('user_id', '=', $user->id); | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-09 21:26:42 +08:00
										 |  |  |         $viewables = $query->with('viewable')->orderBy('updated_at', 'desc') | 
					
						
							|  |  |  |             ->skip($count * $page)->take($count)->get()->pluck('viewable'); | 
					
						
							|  |  |  |         return $viewables; | 
					
						
							| 
									
										
										
										
											2015-11-22 01:22:14 +08:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Reset all view counts by deleting all views. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function resetAll() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->view->truncate(); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-01-29 00:58:52 +08:00
										 |  |  | } |