From 9650b668e9bf7ccc7ed4ccb75e5756bbcf22ecfa Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Thu, 8 Jul 2021 17:33:51 -0600 Subject: [PATCH] Update PublicApiController, fix public timeline filtering --- app/Http/Controllers/PublicApiController.php | 71 +++++++++++++++----- app/Services/PublicTimelineService.php | 3 + 2 files changed, 56 insertions(+), 18 deletions(-) diff --git a/app/Http/Controllers/PublicApiController.php b/app/Http/Controllers/PublicApiController.php index 549349042..e017a9808 100644 --- a/app/Http/Controllers/PublicApiController.php +++ b/app/Http/Controllers/PublicApiController.php @@ -296,26 +296,61 @@ class PublicApiController extends Controller ->whereIn('filter_type', ['mute', 'block']) ->pluck('filterable_id')->toArray(); - if(PublicTimelineService::count() == 0) { - PublicTimelineService::warmCache(true, 400); + if($min || $max) { + $dir = $min ? '>' : '<'; + $id = $min ?? $max; + $timeline = Status::select( + 'id', + 'profile_id', + 'type', + 'scope', + 'local' + )->where('id', $dir, $id) + ->whereIn('type', ['text', 'photo', 'photo:album', 'video', 'video:album', 'photo:video:album']) + ->whereNotIn('profile_id', $filtered) + ->whereLocal(true) + ->whereScope('public') + ->orderBy('id', 'desc') + ->limit($limit) + ->get() + ->map(function($s) use ($user) { + $status = StatusService::get($s->id); + $status['favourited'] = (bool) LikeService::liked($user->profile_id, $s->id); + return $status; + }); + $res = $timeline->toArray(); + } else { + $timeline = Status::select( + 'id', + 'uri', + 'caption', + 'rendered', + 'profile_id', + 'type', + 'in_reply_to_id', + 'reblog_of_id', + 'is_nsfw', + 'scope', + 'local', + 'reply_count', + 'comments_disabled', + 'created_at', + 'place_id', + 'likes_count', + 'reblogs_count', + 'updated_at' + )->whereIn('type', ['text', 'photo', 'photo:album', 'video', 'video:album', 'photo:video:album']) + ->whereNotIn('profile_id', $filtered) + ->with('profile', 'hashtags', 'mentions') + ->whereLocal(true) + ->whereScope('public') + ->orderBy('id', 'desc') + ->simplePaginate($limit); + + $fractal = new Fractal\Resource\Collection($timeline, new StatusTransformer()); + $res = $this->fractal->createData($fractal)->toArray(); } - if ($max) { - $feed = PublicTimelineService::getRankedMaxId($max, $limit); - } else if ($min) { - $feed = PublicTimelineService::getRankedMinId($min, $limit); - } else { - $feed = PublicTimelineService::get(0, $limit); - } - - $res = collect($feed) - ->map(function($k) use($user) { - $status = StatusService::get($k); - $status['favourited'] = (bool) LikeService::liked($user->profile_id, $k); - return $status; - }) - ->toArray(); - return response()->json($res); } diff --git a/app/Services/PublicTimelineService.php b/app/Services/PublicTimelineService.php index e20d29ea9..6f003aed0 100644 --- a/app/Services/PublicTimelineService.php +++ b/app/Services/PublicTimelineService.php @@ -48,6 +48,8 @@ class PublicTimelineService { public static function add($val) { + return; + if(config('database.redis.client') === 'phpredis' && self::count() > 400) { Redis::zpopmin(self::CACHE_KEY); } @@ -73,6 +75,7 @@ class PublicTimelineService { public static function warmCache($force = false, $limit = 100) { if(self::count() == 0 || $force == true) { + Redis::del(self::CACHE_KEY); $ids = Status::whereNull('uri') ->whereNull('in_reply_to_id') ->whereNull('reblog_of_id')