]> BookStack Code Mirror - bookstack/blob - app/Actions/ViewService.php
Updated 'Spanish Argentina' translation.
[bookstack] / app / Actions / ViewService.php
1 <?php namespace BookStack\Actions;
2
3 use BookStack\Auth\Permissions\PermissionService;
4 use BookStack\Entities\Entity;
5 use BookStack\Entities\EntityProvider;
6 use Illuminate\Support\Collection;
7
8 class ViewService
9 {
10     protected $view;
11     protected $permissionService;
12     protected $entityProvider;
13
14     /**
15      * ViewService constructor.
16      * @param \BookStack\Actions\View $view
17      * @param \BookStack\Auth\Permissions\PermissionService $permissionService
18      * @param EntityProvider $entityProvider
19      */
20     public function __construct(View $view, PermissionService $permissionService, EntityProvider $entityProvider)
21     {
22         $this->view = $view;
23         $this->permissionService = $permissionService;
24         $this->entityProvider = $entityProvider;
25     }
26
27     /**
28      * Add a view to the given entity.
29      * @param Entity $entity
30      * @return int
31      */
32     public function add(Entity $entity)
33     {
34         $user = user();
35         if ($user === null || $user->isDefault()) {
36             return 0;
37         }
38         $view = $entity->views()->where('user_id', '=', $user->id)->first();
39         // Add view if model exists
40         if ($view) {
41             $view->increment('views');
42             return $view->views;
43         }
44
45         // Otherwise create new view count
46         $entity->views()->save($this->view->create([
47             'user_id' => $user->id,
48             'views' => 1
49         ]));
50
51         return 1;
52     }
53
54     /**
55      * Get the entities with the most views.
56      * @param int $count
57      * @param int $page
58      * @param string|array $filterModels
59      * @param string $action - used for permission checking
60      * @return Collection
61      */
62     public function getPopular(int $count = 10, int $page = 0, $filterModels = null, string $action = 'view')
63     {
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');
70
71         if ($filterModels) {
72             $query->whereIn('viewable_type', $this->entityProvider->getMorphClasses($filterModels));
73         }
74
75         return $query->with('viewable')->skip($skipCount)->take($count)->get()->pluck('viewable');
76     }
77
78     /**
79      * Get all recently viewed entities for the current user.
80      * @param int $count
81      * @param int $page
82      * @param Entity|bool $filterModel
83      * @return mixed
84      */
85     public function getUserRecentlyViewed($count = 10, $page = 0, $filterModel = false)
86     {
87         $user = user();
88         if ($user === null || $user->isDefault()) {
89             return collect();
90         }
91
92         $query = $this->permissionService
93             ->filterRestrictedEntityRelations($this->view, 'views', 'viewable_id', 'viewable_type');
94
95         if ($filterModel) {
96             $query = $query->where('viewable_type', '=', $filterModel->getMorphClass());
97         }
98         $query = $query->where('user_id', '=', $user->id);
99
100         $viewables = $query->with('viewable')->orderBy('updated_at', 'desc')
101             ->skip($count * $page)->take($count)->get()->pluck('viewable');
102         return $viewables;
103     }
104
105     /**
106      * Reset all view counts by deleting all views.
107      */
108     public function resetAll()
109     {
110         $this->view->truncate();
111     }
112 }