From cf3405d852c1b51ce05ee1423df66a89c7f1ea7f Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Thu, 26 Sep 2019 18:30:56 -0600 Subject: [PATCH] Add /api/v1/timelines/home endpoint --- app/Http/Controllers/Api/ApiV1Controller.php | 88 ++++++++++++++++++++ routes/web.php | 3 +- 2 files changed, 90 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Api/ApiV1Controller.php b/app/Http/Controllers/Api/ApiV1Controller.php index 0693827cf9..b1c8f15ddb 100644 --- a/app/Http/Controllers/Api/ApiV1Controller.php +++ b/app/Http/Controllers/Api/ApiV1Controller.php @@ -1134,6 +1134,94 @@ public function accountNotifications(Request $request) return response()->json($res); } + /** + * GET /api/v1/timelines/home + * + * + * @return App\Transformer\Api\StatusTransformer + */ + public function timelineHome(Request $request) + { + abort_if(!$request->user(), 403); + + $this->validate($request,[ + 'page' => 'nullable|integer|max:40', + 'min_id' => 'nullable|integer|min:0|max:' . PHP_INT_MAX, + 'max_id' => 'nullable|integer|min:0|max:' . PHP_INT_MAX, + 'limit' => 'nullable|integer|max:40' + ]); + + $page = $request->input('page'); + $min = $request->input('min_id'); + $max = $request->input('max_id'); + $limit = $request->input('limit') ?? 3; + + $pid = $request->user()->profile_id; + + $following = Cache::remember('profile:following:'.$pid, now()->addMinutes(1440), function() use($pid) { + $following = Follower::whereProfileId($pid)->pluck('following_id'); + return $following->push($pid)->toArray(); + }); + + if($min || $max) { + $dir = $min ? '>' : '<'; + $id = $min ?? $max; + $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', + 'place_id', + 'created_at', + 'updated_at' + )->whereIn('type', ['photo', 'photo:album', 'video', 'video:album']) + ->with('profile', 'hashtags', 'mentions') + ->where('id', $dir, $id) + ->whereIn('profile_id', $following) + ->whereIn('visibility',['public', 'unlisted', 'private']) + ->latest() + ->limit($limit) + ->get(); + } 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', + 'place_id', + 'created_at', + 'updated_at' + )->whereIn('type', ['photo', 'photo:album', 'video', 'video:album']) + ->with('profile', 'hashtags', 'mentions') + ->whereIn('profile_id', $following) + ->whereIn('visibility',['public', 'unlisted', 'private']) + ->latest() + ->simplePaginate($limit); + } + + $fractal = new Fractal\Resource\Collection($timeline, new StatusTransformer()); + $res = $this->fractal->createData($fractal)->toArray(); + return response()->json($res, 200, [], JSON_PRETTY_PRINT); + } + public function statusById(Request $request, $id) { $status = Status::whereVisibility('public')->findOrFail($id); diff --git a/routes/web.php b/routes/web.php index bcfcefd972..6537a64232 100644 --- a/routes/web.php +++ b/routes/web.php @@ -115,13 +115,14 @@ Route::post('accounts/{id}/mute', 'Api\ApiV1Controller@accountMuteById')->middleware('auth:api'); Route::post('accounts/{id}/unmute', 'Api\ApiV1Controller@accountUnmuteById')->middleware('auth:api'); Route::get('notifications', 'Api\ApiV1Controller@accountNotifications')->middleware('auth:api'); + + Route::get('timelines/home', 'Api\ApiV1Controller@timelineHome'); // Route::get('likes', 'ApiController@hydrateLikes'); // Route::post('media', 'ApiController@uploadMedia')->middleware('auth:api'); // Route::delete('media', 'ApiController@deleteMedia')->middleware('auth:api'); // Route::get('notifications', 'ApiController@notifications')->middleware('auth:api'); // Route::get('timelines/public', 'PublicApiController@publicTimelineApi'); - // Route::get('timelines/home', 'PublicApiController@homeTimelineApi')->middleware('auth:api'); // Route::post('status', 'Api\ApiV1Controller@createStatus')->middleware('auth:api'); Route::get('accounts/{id}', 'Api\ApiV1Controller@accountById'); });