Update Discover, add trending hashtags, places and posts

This commit is contained in:
Daniel Supernault 2020-08-13 18:05:36 -06:00
parent 3cfae0a960
commit c251d41b2e
No known key found for this signature in database
GPG key ID: 0DEF1C662C9033F7
4 changed files with 278 additions and 24 deletions

View file

@ -16,6 +16,7 @@ use Auth, DB, Cache;
use Illuminate\Http\Request;
use App\Transformer\Api\AccountTransformer;
use App\Transformer\Api\AccountWithStatusesTransformer;
use App\Transformer\Api\StatusTransformer;
use App\Transformer\Api\StatusStatelessTransformer;
use League\Fractal;
use League\Fractal\Serializer\ArraySerializer;
@ -165,4 +166,74 @@ class DiscoverController extends Controller
return $res;
}
public function trendingApi(Request $request)
{
$this->validate($request, [
'range' => 'nullable|string|in:daily,monthly,alltime'
]);
$range = $request->filled('range') ?
$request->input('range') == 'alltime' ? '-1' :
($request->input('range') == 'daily' ? 1 : 31) : 1;
$key = ':api:discover:trending:v1:range:' . $range;
$ttl = now()->addHours(2);
$res = Cache::remember($key, $ttl, function() use($range) {
if($range == '-1') {
$res = Status::orderBy('likes_count','desc')
->take(12)
->get();
} else {
$res = Status::orderBy('likes_count','desc')
->take(12)
->where('created_at', '>', now()->subDays($range))
->get();
}
$resource = new Fractal\Resource\Collection($res, new StatusStatelessTransformer());
return $this->fractal->createData($resource)->toArray();
});
return response()->json($res, 200, [], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
}
public function trendingHashtags(Request $request)
{
$res = StatusHashtag::select('hashtag_id', \DB::raw('count(*) as total'))
->groupBy('hashtag_id')
->orderBy('total','desc')
->where('created_at', '>', now()->subDays(4))
->take(9)
->get()
->map(function($h) {
$hashtag = $h->hashtag;
return [
'id' => $hashtag->id,
'total' => $h->total,
'name' => '#'.$hashtag->name,
'url' => $hashtag->url('?src=dsh1')
];
});
return $res;
}
public function trendingPlaces(Request $request)
{
$res = Status::select('place_id',DB::raw('count(place_id) as total'))
->whereNotNull('place_id')
->where('created_at','>',now()->subDays(14))
->groupBy('place_id')
->orderBy('total')
->limit(4)
->get()
->map(function($s){
$p = $s->place;
return [
'name' => $p->name,
'country' => $p->country,
'url' => $p->url()
];
});
return $res;
}
}