From f0e48a09a3687a6848b0911abf5f848869489f05 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sun, 28 Feb 2021 22:38:07 -0700 Subject: [PATCH] Update ComposeController, add autocomplete apis for hashtags and mentions --- app/Http/Controllers/ComposeController.php | 67 ++++++++++++++++++++++ routes/web.php | 2 + 2 files changed, 69 insertions(+) diff --git a/app/Http/Controllers/ComposeController.php b/app/Http/Controllers/ComposeController.php index a51e2ab04..001fc66c1 100644 --- a/app/Http/Controllers/ComposeController.php +++ b/app/Http/Controllers/ComposeController.php @@ -7,6 +7,7 @@ use Auth, Cache, Storage, URL; use Carbon\Carbon; use App\{ Avatar, + Hashtag, Like, Media, MediaTag, @@ -304,6 +305,72 @@ class ComposeController extends Controller return $places; } + public function searchMentionAutocomplete(Request $request) + { + abort_if(!$request->user(), 403); + + $this->validate($request, [ + 'q' => 'required|string|min:2|max:50' + ]); + + $q = $request->input('q'); + + if(Str::of($q)->startsWith('@')) { + if(strlen($q) < 3) { + return []; + } + } + + $blocked = UserFilter::whereFilterableType('App\Profile') + ->whereFilterType('block') + ->whereFilterableId($request->user()->profile_id) + ->pluck('user_id'); + + $blocked->push($request->user()->profile_id); + + $results = Profile::select('id','domain','username') + ->whereNotIn('id', $blocked) + ->where('username','like','%'.$q.'%') + ->groupBy('domain') + ->limit(15) + ->get() + ->map(function($profile) { + $username = $profile->domain ? substr($profile->username, 1) : $profile->username; + return [ + 'key' => '@' . str_limit($username, 30), + 'value' => $username, + ]; + }); + + return $results; + } + + public function searchHashtagAutocomplete(Request $request) + { + abort_if(!$request->user(), 403); + + $this->validate($request, [ + 'q' => 'required|string|min:2|max:50' + ]); + + $q = $request->input('q'); + + $results = Hashtag::select('slug') + ->where('slug', 'like', '%'.$q.'%') + ->whereIsNsfw(false) + ->whereIsBanned(false) + ->limit(5) + ->get() + ->map(function($tag) { + return [ + 'key' => '#' . $tag->slug, + 'value' => $tag->slug + ]; + }); + + return $results; + } + public function store(Request $request) { $this->validate($request, [ diff --git a/routes/web.php b/routes/web.php index 3606ae93d..91b088a90 100644 --- a/routes/web.php +++ b/routes/web.php @@ -113,6 +113,8 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact Route::delete('/media/delete', 'ComposeController@mediaDelete'); Route::get('/search/tag', 'ComposeController@searchTag'); Route::get('/search/location', 'ComposeController@searchLocation'); + Route::get('/search/mention', 'ComposeController@searchMentionAutocomplete'); + Route::get('/search/hashtag', 'ComposeController@searchHashtagAutocomplete'); Route::post('/publish', 'ComposeController@store') ->middleware('throttle:maxPostsPerHour,60')