1 <?php namespace BookStack\Actions;
3 use BookStack\Auth\Permissions\PermissionService;
4 use BookStack\Entities\Entity;
5 use BookStack\Entities\EntityProvider;
7 use Illuminate\Support\Collection;
12 protected $permissionService;
13 protected $entityProvider;
16 * ViewService constructor.
18 * @param PermissionService $permissionService
19 * @param EntityProvider $entityProvider
21 public function __construct(View $view, PermissionService $permissionService, EntityProvider $entityProvider)
24 $this->permissionService = $permissionService;
25 $this->entityProvider = $entityProvider;
29 * Add a view to the given entity.
30 * @param \BookStack\Entities\Entity $entity
33 public function add(Entity $entity)
36 if ($user === null || $user->isDefault()) {
39 $view = $entity->views()->where('user_id', '=', $user->id)->first();
40 // Add view if model exists
42 $view->increment('views');
46 // Otherwise create new view count
47 $entity->views()->save($this->view->create([
48 'user_id' => $user->id,
56 * Get the entities with the most views.
59 * @param string|array $filterModels
60 * @param string $action - used for permission checking
63 public function getPopular(int $count = 10, int $page = 0, $filterModels = null, string $action = 'view')
65 $skipCount = $count * $page;
66 $query = $this->permissionService
67 ->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type', $action)
68 ->select('*', 'viewable_id', 'viewable_type', DB::raw('SUM(views) as view_count'))
69 ->groupBy('viewable_id', 'viewable_type')
70 ->orderBy('view_count', 'desc');
73 $query->whereIn('viewable_type', $this->entityProvider->getMorphClasses($filterModels));
76 return $query->with('viewable')->skip($skipCount)->take($count)->get()->pluck('viewable');
80 * Get all recently viewed entities for the current user.
83 * @param Entity|bool $filterModel
86 public function getUserRecentlyViewed($count = 10, $page = 0, $filterModel = false)
89 if ($user === null || $user->isDefault()) {
93 $query = $this->permissionService
94 ->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type');
97 $query = $query->where('viewable_type', '=', $filterModel->getMorphClass());
99 $query = $query->where('user_id', '=', $user->id);
101 $viewables = $query->with('viewable')->orderBy('updated_at', 'desc')
102 ->skip($count * $page)->take($count)->get()->pluck('viewable');
107 * Reset all view counts by deleting all views.
109 public function resetAll()
111 $this->view->truncate();