Skip to content

Commit fbfca19

Browse files
authored
refactor: remove Auth facade dependencies from AlbumQueryPolicy (#3904)
1 parent 3ef6912 commit fbfca19

21 files changed

+252
-94
lines changed

app/Actions/Album/ListAlbums.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,10 @@
1111
use App\DTO\AlbumSortingCriterion;
1212
use App\Models\Album;
1313
use App\Models\Extensions\SortingDecorator;
14+
use App\Policies\AlbumPolicy;
1415
use App\Policies\AlbumQueryPolicy;
1516
use Illuminate\Support\Collection;
17+
use Illuminate\Support\Facades\Auth;
1618
use Illuminate\Support\Facades\URL;
1719
use Illuminate\Support\Str;
1820
use Kalnoy\Nestedset\Contracts\NestedSetCollection;
@@ -34,6 +36,9 @@ public function __construct(
3436
*/
3537
public function do(Collection $albums_filtering, ?string $parent_id, ?int $owner_id = null): array
3638
{
39+
$user = Auth::user();
40+
$unlocked_album_ids = AlbumPolicy::getUnlockedAlbumIDs();
41+
3742
$unfiltered = $this->album_query_policy->applyReachabilityFilter(
3843
// We remove all sub albums
3944
// Otherwise it would create cyclic dependency
@@ -47,7 +52,9 @@ function ($q) use ($albums_filtering) {
4752
);
4853

4954
return $q;
50-
})
55+
}),
56+
$user,
57+
$unlocked_album_ids
5158
);
5259
$sorting = AlbumSortingCriterion::createDefault();
5360
$query = (new SortingDecorator($unfiltered))

app/Actions/Albums/Flow.php

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616
use App\Factories\AlbumFactory;
1717
use App\Models\Album;
1818
use App\Models\Builders\AlbumBuilder;
19+
use App\Policies\AlbumPolicy;
1920
use App\Policies\AlbumQueryPolicy;
2021
use App\Repositories\ConfigManager;
22+
use Illuminate\Support\Facades\Auth;
2123
use Illuminate\Support\Facades\DB;
2224

2325
final class Flow
@@ -36,6 +38,9 @@ public function __construct(
3638
*/
3739
public function do(): AlbumBuilder
3840
{
41+
$user = Auth::user();
42+
$unlocked_album_ids = AlbumPolicy::getUnlockedAlbumIDs();
43+
3944
$flow_base = $this->config_manager->getValueAsString('flow_base');
4045
$flow_base = $flow_base === '' ? null : $flow_base;
4146

@@ -62,10 +67,10 @@ public function do(): AlbumBuilder
6267
$include_sub_albums = $this->config_manager->getValueAsBool('flow_include_sub_albums');
6368
if ($include_sub_albums) {
6469
// Now we restrict the query to only the browsable albums.
65-
$query = $this->album_query_policy->applyBrowsabilityFilter($base_query, $base?->_lft, $base?->_rgt);
70+
$query = $this->album_query_policy->applyBrowsabilityFilter($base_query, $user, $unlocked_album_ids, $base?->_lft, $base?->_rgt);
6671
} else {
6772
// We could also use browsable filter here, but reachability filter is faster.
68-
$query = $this->album_query_policy->applyReachabilityFilter($base_query);
73+
$query = $this->album_query_policy->applyReachabilityFilter($base_query, $user, $unlocked_album_ids);
6974
}
7075

7176
$flow_strategy = $this->config_manager->getValueAsEnum('flow_strategy', FlowStrategy::class);

app/Actions/Albums/PositionData.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@
1212
use App\Enum\SizeVariantType;
1313
use App\Http\Resources\Collections\PositionDataResource;
1414
use App\Models\Photo;
15+
use App\Policies\AlbumPolicy;
1516
use App\Policies\PhotoQueryPolicy;
1617
use App\Repositories\ConfigManager;
18+
use Illuminate\Support\Facades\Auth;
1719

1820
class PositionData
1921
{
@@ -32,6 +34,9 @@ public function __construct(
3234
*/
3335
public function do(): PositionDataResource
3436
{
37+
$user = Auth::user();
38+
$unlocked_album_ids = AlbumPolicy::getUnlockedAlbumIDs();
39+
3540
$photo_query = $this->photo_query_policy->applySearchabilityFilter(
3641
query: Photo::query()
3742
->with([
@@ -51,6 +56,8 @@ public function do(): PositionDataResource
5156
])
5257
->whereNotNull('latitude')
5358
->whereNotNull('longitude'),
59+
user: $user,
60+
unlocked_album_ids: $unlocked_album_ids,
5461
origin: null,
5562
include_nsfw: !$this->config_manager->getValueAsBool('hide_nsfw_in_map')
5663
);

app/Actions/Albums/Top.php

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ public function __construct(
6666
*/
6767
public function get(): TopAlbumDTO
6868
{
69+
$user = Auth::user();
70+
$user_id = $user?->id;
71+
6972
// Do not eagerly load the relation `photos` for each smart album.
7073
// On the albums overview, we only need a thumbnail for each album.
7174
/** @var BaseCollection<int,BaseSmartAlbum> $smart_albums */
@@ -74,7 +77,7 @@ public function get(): TopAlbumDTO
7477
->filter(fn ($smart_album) => Gate::check(AlbumPolicy::CAN_SEE, $smart_album));
7578

7679
$tag_album_query = $this->album_query_policy
77-
->applyVisibilityFilter(TagAlbum::query()->with(['access_permissions', 'owner']));
80+
->applyVisibilityFilter(TagAlbum::query()->with(['access_permissions', 'owner']), $user);
7881

7982
/** @var BaseCollection<int,TagAlbum> $tag_albums */
8083
$tag_albums = (new SortingDecorator($tag_album_query))
@@ -83,7 +86,7 @@ public function get(): TopAlbumDTO
8386

8487
$pinned_album_query = $this->album_query_policy
8588
->applyVisibilityFilter(Album::query()->with(['access_permissions', 'owner'])
86-
->joinSub(DB::table('base_albums')->select(['id', 'is_pinned'])->where('is_pinned', '=', true), 'pinned', 'pinned.id', '=', 'albums.id'));
89+
->joinSub(DB::table('base_albums')->select(['id', 'is_pinned'])->where('is_pinned', '=', true), 'pinned', 'pinned.id', '=', 'albums.id'), $user);
8790

8891
/** @var BaseCollection<int,Album> $pinned_albums */
8992
$pinned_albums = (new SortingDecorator($pinned_album_query))
@@ -100,9 +103,7 @@ public function get(): TopAlbumDTO
100103
$this->config_manager->getValueAsBool('deduplicate_pinned_albums'),
101104
fn ($q) => $q
102105
->joinSub(DB::table('base_albums')->select(['id', 'is_pinned'])->where('is_pinned', '=', false), 'not_pinned', 'not_pinned.id', '=', 'albums.id')
103-
));
104-
105-
$user_id = Auth::id();
106+
), $user);
106107
if ($user_id !== null) {
107108
// For authenticated users we group albums by ownership.
108109
$albums = (new SortingDecorator($query))

app/Actions/Photo/Timeline.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@
1515
use App\Exceptions\Internal\LycheeInvalidArgumentException;
1616
use App\Exceptions\Internal\TimelineGranularityException;
1717
use App\Models\Photo;
18+
use App\Policies\AlbumPolicy;
1819
use App\Policies\PhotoQueryPolicy;
1920
use App\Repositories\ConfigManager;
2021
use Illuminate\Database\Eloquent\Builder;
2122
use Illuminate\Support\Carbon;
2223
use Illuminate\Support\Collection;
24+
use Illuminate\Support\Facades\Auth;
2325
use Illuminate\Support\Facades\DB;
2426

2527
class Timeline
@@ -42,6 +44,9 @@ public function __construct(
4244
*/
4345
public function do(): Builder
4446
{
47+
$user = Auth::user();
48+
$unlocked_album_ids = AlbumPolicy::getUnlockedAlbumIDs();
49+
4550
$order = $this->config_manager->getValueAsEnum('timeline_photos_order', ColumnSortingPhotoType::class);
4651

4752
// Safe default (should not be needed).
@@ -53,6 +58,8 @@ public function do(): Builder
5358

5459
return $this->photo_query_policy->applySearchabilityFilter(
5560
query: Photo::query()->with(['statistics', 'size_variants', 'statistics', 'palette', 'tags', 'rating']),
61+
user: $user,
62+
unlocked_album_ids: $unlocked_album_ids,
5663
origin: null,
5764
include_nsfw: !$this->config_manager->getValueAsBool('hide_nsfw_in_timeline')
5865
)->orderBy($order->value, OrderSortingType::DESC->value);
@@ -68,6 +75,9 @@ public function do(): Builder
6875
*/
6976
public function countYoungerFromDate(Carbon $date): int
7077
{
78+
$user = Auth::user();
79+
$unlocked_album_ids = AlbumPolicy::getUnlockedAlbumIDs();
80+
7181
$order = $this->config_manager->getValueAsEnum('timeline_photos_order', ColumnSortingPhotoType::class);
7282

7383
$granularity = $this->config_manager->getValueAsEnum('timeline_photos_granularity', TimelinePhotoGranularity::class);
@@ -91,6 +101,8 @@ public function countYoungerFromDate(Carbon $date): int
91101
query: Photo::query()
92102
->where($order->value, '>=', $date_offset)
93103
->whereNotNull($order->value),
104+
user: $user,
105+
unlocked_album_ids: $unlocked_album_ids,
94106
origin: null,
95107
include_nsfw: !$this->config_manager->getValueAsBool('hide_nsfw_in_timeline')
96108
)->count();
@@ -106,6 +118,9 @@ public function countYoungerFromDate(Carbon $date): int
106118
*/
107119
public function countYoungerFromPhoto(Photo $photo): int
108120
{
121+
$user = Auth::user();
122+
$unlocked_album_ids = AlbumPolicy::getUnlockedAlbumIDs();
123+
109124
$order = $this->config_manager->getValueAsEnum('timeline_photos_order', ColumnSortingPhotoType::class);
110125

111126
// Safe default (should not be needed).
@@ -125,6 +140,8 @@ public function countYoungerFromPhoto(Photo $photo): int
125140
second: 'photos.' . $order->value
126141
)
127142
->whereNotNull('photos.' . $order->value),
143+
user: $user,
144+
unlocked_album_ids: $unlocked_album_ids,
128145
origin: null,
129146
include_nsfw: !$this->config_manager->getValueAsBool('hide_nsfw_in_timeline')
130147
)->count();
@@ -137,6 +154,9 @@ public function countYoungerFromPhoto(Photo $photo): int
137154
*/
138155
public function dates(): Collection
139156
{
157+
$user = Auth::user();
158+
$unlocked_album_ids = AlbumPolicy::getUnlockedAlbumIDs();
159+
140160
$order = $this->config_manager->getValueAsEnum('timeline_photos_order', ColumnSortingPhotoType::class);
141161

142162
// Safe default (should not be needed).
@@ -170,6 +190,8 @@ public function dates(): Collection
170190

171191
->selectRaw(sprintf($formatter, $order->value, $date_format) . ' as date')
172192
->whereNotNull($order->value),
193+
user: $user,
194+
unlocked_album_ids: $unlocked_album_ids,
173195
origin: null,
174196
include_nsfw: !$this->config_manager->getValueAsBool('hide_nsfw_in_timeline')
175197
)->groupBy('date')

app/Actions/RSS/Generate.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
use App\Exceptions\Internal\FrameworkException;
1515
use App\Models\Extensions\UTCBasedTimes;
1616
use App\Models\Photo;
17+
use App\Policies\AlbumPolicy;
1718
use App\Policies\PhotoQueryPolicy;
1819
use App\Repositories\ConfigManager;
1920
use App\Services\UrlGenerator;
@@ -22,6 +23,7 @@
2223
use Illuminate\Contracts\Container\BindingResolutionException;
2324
use Illuminate\Support\Carbon;
2425
use Illuminate\Support\Collection;
26+
use Illuminate\Support\Facades\Auth;
2527
use Illuminate\Support\Facades\DB;
2628
use Spatie\Feed\FeedItem;
2729

@@ -72,6 +74,9 @@ private function toFeedItem(object $data): FeedItem
7274
*/
7375
public function do(): Collection
7476
{
77+
$user = Auth::user();
78+
$unlocked_album_ids = AlbumPolicy::getUnlockedAlbumIDs();
79+
7580
$rss_recent = $this->config_manager->getValueAsInt('rss_recent_days');
7681
$rss_max = $this->config_manager->getValueAsInt('rss_max_items');
7782
try {
@@ -84,6 +89,8 @@ public function do(): Collection
8489
$photos = $this->photo_query_policy
8590
->applySearchabilityFilter(
8691
query: Photo::query(),
92+
user: $user,
93+
unlocked_album_ids: $unlocked_album_ids,
8794
origin: null,
8895
include_nsfw: !$this->config_manager->getValueAsBool('hide_nsfw_in_rss')
8996
)

app/Actions/Search/AlbumSearch.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,10 @@
1717
use App\Models\Builders\TagAlbumBuilder;
1818
use App\Models\Extensions\SortingDecorator;
1919
use App\Models\TagAlbum;
20+
use App\Policies\AlbumPolicy;
2021
use App\Policies\AlbumQueryPolicy;
2122
use Illuminate\Database\Eloquent\Collection;
23+
use Illuminate\Support\Facades\Auth;
2224

2325
class AlbumSearch
2426
{
@@ -36,10 +38,13 @@ public function __construct(
3638
*/
3739
public function queryTagAlbums(array $terms): Collection
3840
{
41+
$user = Auth::user();
42+
3943
// Note: `applyVisibilityFilter` already adds a JOIN clause with `base_albums`.
4044
// No need to add a second JOIN clause.
4145
$album_query = $this->album_query_policy->applyVisibilityFilter(
42-
TagAlbum::query()
46+
TagAlbum::query(),
47+
$user
4348
);
4449
$this->addSearchCondition($terms, $album_query);
4550

@@ -60,13 +65,16 @@ public function queryTagAlbums(array $terms): Collection
6065
*/
6166
public function queryAlbums(array $terms, ?Album $album = null): Collection
6267
{
68+
$user = Auth::user();
69+
$unlocked_album_ids = AlbumPolicy::getUnlockedAlbumIDs();
70+
6371
$album_query = Album::query()
6472
->select(['albums.*'])
6573
->join('base_albums', 'base_albums.id', '=', 'albums.id')
6674
->when($album !== null, fn ($q) => $q->where('albums._lft', '>=', $album->_lft)
6775
->where('albums._rgt', '<=', $album->_rgt));
6876
$this->addSearchCondition($terms, $album_query);
69-
$this->album_query_policy->applyBrowsabilityFilter($album_query);
77+
$this->album_query_policy->applyBrowsabilityFilter($album_query, $user, $unlocked_album_ids);
7078

7179
$sorting = AlbumSortingCriterion::createDefault();
7280

app/Actions/Search/PhotoSearch.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,12 @@
1414
use App\Models\Album;
1515
use App\Models\Extensions\SortingDecorator;
1616
use App\Models\Photo;
17+
use App\Policies\AlbumPolicy;
1718
use App\Policies\PhotoQueryPolicy;
1819
use App\Repositories\ConfigManager;
1920
use Illuminate\Database\Eloquent\Builder;
2021
use Illuminate\Database\Eloquent\Collection;
22+
use Illuminate\Support\Facades\Auth;
2123

2224
class PhotoSearch
2325
{
@@ -55,8 +57,13 @@ public function query(array $terms): Collection
5557
*/
5658
public function sqlQuery(array $terms, ?Album $album = null): Builder
5759
{
60+
$user = Auth::user();
61+
$unlocked_album_ids = AlbumPolicy::getUnlockedAlbumIDs();
62+
5863
$query = $this->photo_query_policy->applySearchabilityFilter(
5964
query: Photo::query()->with(['albums', 'statistics', 'size_variants', 'palette', 'tags', 'rating']),
65+
user: $user,
66+
unlocked_album_ids: $unlocked_album_ids,
6067
origin: $album,
6168
include_nsfw: !$this->config_manager->getValueAsBool('hide_nsfw_in_search')
6269
);

app/Actions/Shop/BasketService.php

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
use App\Models\Order;
1818
use App\Models\Photo;
1919
use App\Models\User;
20+
use App\Policies\AlbumPolicy;
2021
use App\Policies\AlbumQueryPolicy;
22+
use Illuminate\Support\Facades\Auth;
2123
use Illuminate\Support\Facades\Log;
2224

2325
/**
@@ -139,7 +141,12 @@ public function addAlbumToBasket(
139141
// up with photos that are purchasable but in albums that the user cannot see.
140142
// This would lead to inconsistencies in the OrderItems.
141143
if ($include_subalbums) {
142-
$albums_ids = $this->album_query_policy->applyBrowsabilityFilter(Album::query()->select('id'), $album->_lft, $album->_rgt)->pluck('id')->toArray();
144+
$albums_ids = $this->album_query_policy->applyBrowsabilityFilter(
145+
query: Album::query()->select('id'),
146+
user: Auth::user(),
147+
unlocked_album_ids: AlbumPolicy::getUnlockedAlbumIDs(),
148+
origin_left: $album->_lft,
149+
origin_right: $album->_rgt)->pluck('id')->toArray();
143150
} else {
144151
$albums_ids = [$album->id];
145152
}

app/Actions/Tag/GetTagWithPhotos.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ public function do(Tag $tag): TagWithPhotosResource
5454

5555
$photos_query = $this->photo_query_policy->applySensitivityFilter(
5656
query: $base_query,
57+
user: $user,
5758
origin: null,
5859
include_nsfw: !$this->config_manager->getValueAsBool('hide_nsfw_in_tag_listing')
5960
);

0 commit comments

Comments
 (0)