1 <?php namespace BookStack\Actions;
3 use BookStack\Auth\Permissions\PermissionService;
4 use BookStack\Entities\Entity;
5 use BookStack\Entities\EntityProvider;
6 use Illuminate\Support\Collection;
11 protected $permissionService;
12 protected $entityProvider;
15 * ViewService constructor.
16 * @param \BookStack\Actions\View $view
17 * @param \BookStack\Auth\Permissions\PermissionService $permissionService
18 * @param EntityProvider $entityProvider
20 public function __construct(View $view, PermissionService $permissionService, EntityProvider $entityProvider)
23 $this->permissionService = $permissionService;
24 $this->entityProvider = $entityProvider;
28 * Add a view to the given entity.
29 * @param Entity $entity
32 public function add(Entity $entity)
35 if ($user === null || $user->isDefault()) {
38 $view = $entity->views()->where('user_id', '=', $user->id)->first();
39 // Add view if model exists
41 $view->increment('views');
45 // Otherwise create new view count
46 $entity->views()->save($this->view->create([
47 'user_id' => $user->id,
55 * Get the entities with the most views.
58 * @param string|array $filterModels
59 * @param string $action - used for permission checking
62 public function getPopular(int $count = 10, int $page = 0, $filterModels = null, string $action = 'view')
64 $skipCount = $count * $page;
65 $query = $this->permissionService
66 ->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type', $action)
67 ->select('*', 'viewable_id', 'viewable_type', \DB::raw('SUM(views) as view_count'))
68 ->groupBy('viewable_id', 'viewable_type')
69 ->orderBy('view_count', 'desc');
72 $query->whereIn('viewable_type', $this->entityProvider->getMorphClasses($filterModels));
75 return $query->with('viewable')->skip($skipCount)->take($count)->get()->pluck('viewable');
79 * Get all recently viewed entities for the current user.
82 * @param Entity|bool $filterModel
85 public function getUserRecentlyViewed($count = 10, $page = 0, $filterModel = false)
88 if ($user === null || $user->isDefault()) {
92 $query = $this->permissionService
93 ->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type');
96 $query = $query->where('viewable_type', '=', $filterModel->getMorphClass());
98 $query = $query->where('user_id', '=', $user->id);
100 $viewables = $query->with('viewable')->orderBy('updated_at', 'desc')
101 ->skip($count * $page)->take($count)->get()->pluck('viewable');
106 * Reset all view counts by deleting all views.
108 public function resetAll()
110 $this->view->truncate();