Browse Source

Update DiscoverController, cache public tag feed and only include local posts for unauthenticated users

Daniel Supernault 3 years ago
parent
commit
0541aed510
2 changed files with 37 additions and 6 deletions
  1. 36 6
      app/Http/Controllers/DiscoverController.php
  2. 1 0
      app/Media.php

+ 36 - 6
app/Http/Controllers/DiscoverController.php

@@ -63,12 +63,12 @@ class DiscoverController extends Controller
 
 
 	public function getHashtags(Request $request)
 	public function getHashtags(Request $request)
 	{
 	{
-		$auth = Auth::check();
-		abort_if(!config('instance.discover.tags.is_public') && !$auth, 403);
+		$user = $request->user();
+		abort_if(!config('instance.discover.tags.is_public') && !$user, 403);
 
 
 		$this->validate($request, [
 		$this->validate($request, [
 			'hashtag' => 'required|string|min:1|max:124',
 			'hashtag' => 'required|string|min:1|max:124',
-			'page' => 'nullable|integer|min:1|max:' . ($auth ? 29 : 10)
+			'page' => 'nullable|integer|min:1|max:' . ($user ? 29 : 10)
 		]);
 		]);
 
 
 		$page = $request->input('page') ?? '1';
 		$page = $request->input('page') ?? '1';
@@ -76,8 +76,8 @@ class DiscoverController extends Controller
 		$tag = $request->input('hashtag');
 		$tag = $request->input('hashtag');
 
 
 		$hashtag = Hashtag::whereName($tag)->firstOrFail();
 		$hashtag = Hashtag::whereName($tag)->firstOrFail();
-		if($page == 1) {
-			$res['follows'] = HashtagFollow::whereUserId(Auth::id())
+		if($user && $page == 1) {
+			$res['follows'] = HashtagFollow::whereUserId($user->id)
 				->whereHashtagId($hashtag->id)
 				->whereHashtagId($hashtag->id)
 				->exists();
 				->exists();
 		}
 		}
@@ -85,7 +85,37 @@ class DiscoverController extends Controller
 			'name' => $hashtag->name,
 			'name' => $hashtag->name,
 			'url' => $hashtag->url()
 			'url' => $hashtag->url()
 		];
 		];
-		$res['tags'] = StatusHashtagService::get($hashtag->id, $page, $end);
+		if($user) {
+			$tags = StatusHashtagService::get($hashtag->id, $page, $end);
+			$res['tags'] = collect($tags)
+				->filter(function($tag) {
+					if(!StatusService::get($tag['status']['id'])) {
+						return false;
+					}
+					return true;
+				})
+				->values();
+		} else {
+			$key = 'discover:tags:public_feed:' . $hashtag->id . ':page:' . $page;
+			$tags = Cache::remember($key, 900, function() use($hashtag, $page, $end) {
+				return collect(StatusHashtagService::get($hashtag->id, $page, $end))
+					->filter(function($tag) {
+						if(!$tag['status']['local']) {
+							return false;
+						}
+						return true;
+					})
+					->values();
+			});
+			$res['tags'] = collect($tags)
+				->filter(function($tag) {
+					if(!StatusService::get($tag['status']['id'])) {
+						return false;
+					}
+					return true;
+				})
+				->values();
+		}
 		return $res;
 		return $res;
 	}
 	}
 
 

+ 1 - 0
app/Media.php

@@ -6,6 +6,7 @@ use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\SoftDeletes;
 use Illuminate\Database\Eloquent\SoftDeletes;
 use App\Util\Media\License;
 use App\Util\Media\License;
 use Storage;
 use Storage;
+use Illuminate\Support\Str;
 
 
 class Media extends Model
 class Media extends Model
 {
 {