From d6eac65555911f4f63a55853c0a2f82f188f2d31 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Tue, 5 Mar 2024 04:37:20 -0700 Subject: [PATCH] Update ApiV1Controller, fix public timeline scope, properly support both local + remote parameters --- app/Http/Controllers/Api/ApiV1Controller.php | 38 ++++++++++++++++++-- 1 file changed, 35 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Api/ApiV1Controller.php b/app/Http/Controllers/Api/ApiV1Controller.php index e6aa2cb7b..832256344 100644 --- a/app/Http/Controllers/Api/ApiV1Controller.php +++ b/app/Http/Controllers/Api/ApiV1Controller.php @@ -2634,8 +2634,8 @@ class ApiV1Controller extends Controller } $user = $request->user(); - $remote = $request->has('remote'); - $local = $request->has('local'); + $remote = $request->has('remote') && $request->boolean('remote'); + $local = $request->boolean('local'); $userRoleKey = $remote ? 'can-view-network-feed' : 'can-view-public-feed'; if ($user->has_roles && ! UserRoleService::can($userRoleKey, $user->id)) { return []; @@ -2646,7 +2646,36 @@ class ApiV1Controller extends Controller $hideNsfw = config('instance.hide_nsfw_on_public_feeds'); $amin = SnowflakeService::byDate(now()->subDays(config('federation.network_timeline_days_falloff'))); - if ($remote) { + if ($local && $remote) { + $feed = Status::select( + 'id', + 'uri', + 'type', + 'scope', + 'created_at', + 'profile_id', + 'in_reply_to_id', + 'reblog_of_id' + ) + ->when($minOrMax, function ($q, $minOrMax) use ($min, $max) { + $dir = $min ? '>' : '<'; + $id = $min ?? $max; + + return $q->where('id', $dir, $id); + }) + ->whereNull(['in_reply_to_id', 'reblog_of_id']) + ->when($hideNsfw, function ($q, $hideNsfw) { + return $q->where('is_nsfw', false); + }) + ->whereIn('type', ['photo', 'photo:album', 'video', 'video:album', 'photo:video:album']) + ->whereScope('public') + ->where('id', '>', $amin) + ->orderByDesc('id') + ->limit(($limit * 2)) + ->pluck('id') + ->values() + ->toArray(); + } elseif ($remote && ! $local) { if (config('instance.timeline.network.cached')) { Cache::remember('api:v1:timelines:network:cache_check', 10368000, function () { if (NetworkTimelineService::count() == 0) { @@ -2799,6 +2828,9 @@ class ApiV1Controller extends Controller if ($remote) { $baseUrl .= 'remote=1&'; } + if ($local) { + $baseUrl .= 'local=1&'; + } $minId = $res->map(function ($s) { return ['id' => $s['id']]; })->min('id');