diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index 7f371d3bc..481f6c1b3 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -9,6 +9,11 @@ use App\Status; use Illuminate\Http\Request; use App\Util\ActivityPub\Helpers; use Illuminate\Support\Facades\Cache; +use App\Transformer\Api\{ + AccountTransformer, + HashtagTransformer, + StatusTransformer, +}; class SearchController extends Controller { @@ -22,26 +27,33 @@ class SearchController extends Controller if(mb_strlen($tag) < 3) { return; } + $tag = e(urldecode($tag)); + $hash = hash('sha256', $tag); $tokens = Cache::remember('api:search:tag:'.$hash, now()->addMinutes(5), function () use ($tag) { - $tokens = collect([]); - if(Helpers::validateUrl($tag)) { + $tokens = []; + if(Helpers::validateUrl($tag) != false) { $remote = Helpers::fetchFromUrl($tag); if(isset($remote['type']) && in_array($remote['type'], ['Create', 'Person']) == true) { $type = $remote['type']; if($type == 'Person') { $item = Helpers::profileFirstOrNew($tag); - $tokens->push([[ + $tokens['profiles'] = [[ 'count' => 1, 'url' => $item->url(), 'type' => 'profile', 'value' => $item->username, 'tokens' => [$item->username], 'name' => $item->name, - ]]); + 'entity' => [ + 'id' => $item->id, + 'following' => $item->followedBy(Auth::user()->profile), + 'thumb' => $item->avatarUrl() + ] + ]]; } else if ($type == 'Create') { $item = Helpers::statusFirstOrFetch($tag, false); - $tokens->push([[ + $tokens['posts'] = [[ 'count' => 0, 'url' => $item->url(), 'type' => 'status', @@ -49,10 +61,9 @@ class SearchController extends Controller 'tokens' => [$item->caption], 'name' => $item->caption, 'thumb' => $item->thumb(), - ]]); + ]]; } } - } $hashtags = Hashtag::select('id', 'name', 'slug')->where('slug', 'like', '%'.$tag.'%')->whereHas('posts')->limit(20)->get(); if($hashtags->count() > 0) { @@ -62,37 +73,46 @@ class SearchController extends Controller 'url' => $item->url(), 'type' => 'hashtag', 'value' => $item->name, - 'tokens' => explode('-', $item->name), + 'tokens' => '', 'name' => null, ]; }); - $tokens->push($tags); + $tokens['hashtags'] = $tags; } - $users = Profile::select('username', 'name', 'id') - ->whereNull('status') - ->whereNull('domain') - ->where('username', 'like', '%'.$tag.'%') - //->orWhere('remote_url', $tag) - ->limit(20) - ->get(); - - if($users->count() > 0) { - $profiles = $users->map(function ($item, $key) { - return [ - 'count' => 0, - 'url' => $item->url(), - 'type' => 'profile', - 'value' => $item->username, - 'tokens' => [$item->username], - 'name' => $item->name, - 'id' => $item->id - ]; - }); - $tokens->push($profiles); - } - return $tokens; }); + $users = Profile::select('username', 'name', 'id') + ->whereNull('status') + ->where('id', '!=', Auth::user()->profile->id) + ->where('username', 'like', '%'.$tag.'%') + ->orWhere('remote_url', $tag) + ->limit(20) + ->get(); + + if($users->count() > 0) { + $profiles = $users->map(function ($item, $key) { + return [ + 'count' => 0, + 'url' => $item->url(), + 'type' => 'profile', + 'value' => $item->username, + 'tokens' => [$item->username], + 'name' => $item->name, + 'avatar' => $item->avatarUrl(), + 'id' => $item->id, + 'entity' => [ + 'id' => $item->id, + 'following' => $item->followedBy(Auth::user()->profile), + 'thumb' => $item->avatarUrl() + ] + ]; + }); + if(isset($tokens['profiles'])) { + array_push($tokens['profiles'], $profiles); + } else { + $tokens['profiles'] = $profiles; + } + } $posts = Status::select('id', 'profile_id', 'caption', 'created_at') ->whereHas('media') ->whereNull('in_reply_to_id') @@ -100,7 +120,8 @@ class SearchController extends Controller ->whereProfileId(Auth::user()->profile->id) ->where('caption', 'like', '%'.$tag.'%') ->orWhere('uri', $tag) - ->orderBy('created_at', 'desc') + ->latest() + ->limit(10) ->get(); if($posts->count() > 0) { @@ -115,11 +136,9 @@ class SearchController extends Controller 'thumb' => $item->thumb(), ]; }); - $tokens = $tokens->push($posts); - } - if($tokens->count() > 0) { - $tokens = $tokens[0]; + $tokens['posts'] = $posts; } + return response()->json($tokens); }