]> BookStack Code Mirror - bookstack/blob - app/Entities/Queries/QueryTopFavourites.php
Opensearch: Fixed XML declaration when php short tags enabled
[bookstack] / app / Entities / Queries / QueryTopFavourites.php
1 <?php
2
3 namespace BookStack\Entities\Queries;
4
5 use BookStack\Activity\Models\Favourite;
6 use BookStack\Entities\Tools\MixedEntityListLoader;
7 use BookStack\Permissions\PermissionApplicator;
8 use Illuminate\Database\Query\JoinClause;
9
10 class QueryTopFavourites
11 {
12     public function __construct(
13         protected PermissionApplicator $permissions,
14         protected MixedEntityListLoader $listLoader,
15     ) {
16     }
17
18     public function run(int $count, int $skip = 0)
19     {
20         $user = user();
21         if ($user->isGuest()) {
22             return collect();
23         }
24
25         $query = $this->permissions
26             ->restrictEntityRelationQuery(Favourite::query(), 'favourites', 'favouritable_id', 'favouritable_type')
27             ->select('favourites.*')
28             ->leftJoin('views', function (JoinClause $join) {
29                 $join->on('favourites.favouritable_id', '=', 'views.viewable_id');
30                 $join->on('favourites.favouritable_type', '=', 'views.viewable_type');
31                 $join->where('views.user_id', '=', user()->id);
32             })
33             ->orderBy('views.views', 'desc')
34             ->where('favourites.user_id', '=', user()->id);
35
36         $favourites = $query
37             ->skip($skip)
38             ->take($count)
39             ->get();
40
41         $this->listLoader->loadIntoRelations($favourites->all(), 'favouritable', false);
42
43         return $favourites->pluck('favouritable')->filter();
44     }
45 }