]> BookStack Code Mirror - bookstack/blob - app/Entities/Queries/Popular.php
add tests for priority
[bookstack] / app / Entities / Queries / Popular.php
1 <?php
2
3 namespace BookStack\Entities\Queries;
4
5 use BookStack\Activity\Models\View;
6 use BookStack\Entities\Models\BookChild;
7 use BookStack\Entities\Models\Entity;
8 use Illuminate\Database\Eloquent\Relations\BelongsTo;
9 use Illuminate\Support\Collection;
10 use Illuminate\Support\Facades\DB;
11
12 class Popular extends EntityQuery
13 {
14     public function run(int $count, int $page, array $filterModels = null)
15     {
16         $query = $this->permissionService()
17             ->restrictEntityRelationQuery(View::query(), 'views', 'viewable_id', 'viewable_type')
18             ->select('*', 'viewable_id', 'viewable_type', DB::raw('SUM(views) as view_count'))
19             ->groupBy('viewable_id', 'viewable_type')
20             ->orderBy('view_count', 'desc');
21
22         if ($filterModels) {
23             $query->whereIn('viewable_type', $this->entityProvider()->getMorphClasses($filterModels));
24         }
25
26         $entities = $query->with('viewable')
27             ->skip($count * ($page - 1))
28             ->take($count)
29             ->get()
30             ->pluck('viewable')
31             ->filter();
32
33         $this->loadBooksForChildren($entities);
34
35         return $entities;
36     }
37
38     protected function loadBooksForChildren(Collection $entities)
39     {
40         $bookChildren = $entities->filter(fn(Entity $entity) => $entity instanceof BookChild);
41         $eloquent = (new \Illuminate\Database\Eloquent\Collection($bookChildren));
42         $eloquent->load(['book' => function (BelongsTo $query) {
43             $query->scopes('visible');
44         }]);
45     }
46 }