Browse Source

Update web routes

Daniel Supernault 3 years ago
parent
commit
5828a863cb
2 changed files with 124 additions and 0 deletions
  1. 122 0
      app/Http/Controllers/Api/ApiV1Controller.php
  2. 2 0
      routes/api.php

+ 122 - 0
app/Http/Controllers/Api/ApiV1Controller.php

@@ -2459,4 +2459,126 @@ class ApiV1Controller extends Controller
 		->values();
 		return response()->json(compact('posts'));
 	}
+
+	/**
+	* GET /api/v2/statuses/{id}/replies
+	*
+	*
+	* @return array
+	*/
+	public function statusReplies(Request $request, $id)
+	{
+		abort_if(!$request->user(), 403);
+
+		$this->validate($request, [
+			'limit' => 'int|min:1|max:10',
+			'sort' => 'in:all,newest,popular'
+		]);
+
+		$limit = $request->input('limit', 3);
+		$pid = $request->user()->profile_id;
+		$status = StatusService::get($id);
+
+		abort_if(!in_array($status['visibility'], ['public', 'unlisted']), 404);
+
+		$sortBy = $request->input('sort', 'all');
+
+		if($sortBy == 'all' && !$request->has('cursor')) {
+			$ids = Cache::remember('status:replies:all:' . $id, 900, function() use($id) {
+				return DB::table('statuses')
+					->where('in_reply_to_id', $id)
+					->orderBy('id')
+					->cursorPaginate(3);
+			});
+		} else {
+			$ids = DB::table('statuses')
+				->where('in_reply_to_id', $id)
+				->when($sortBy, function($q, $sortBy) {
+					if($sortBy === 'all') {
+						return $q->orderBy('id');
+					}
+
+					if($sortBy === 'newest') {
+						return $q->orderByDesc('created_at');
+					}
+
+					if($sortBy === 'popular') {
+						return $q->orderByDesc('likes_count');
+					}
+				})
+				->cursorPaginate($limit);
+		}
+
+		$data = $ids->map(function($post) use($pid) {
+			$status = StatusService::get($post->id);
+
+			if(!$status || !isset($status['id'])) {
+				return false;
+			}
+
+			$status['favourited'] = LikeService::liked($pid, $post->id);
+			return $status;
+		})
+		->filter(function($post) {
+			return $post && isset($post['id']);
+		})
+		->values();
+
+		$res = [
+			'data' => $data,
+			'next' => $ids->nextPageUrl()
+		];
+
+		return $res;
+	}
+
+	/**
+	* GET /api/v2/statuses/{id}/state
+	*
+	*
+	* @return array
+	*/
+	public function statusState(Request $request, $id)
+	{
+		abort_if(!$request->user(), 403);
+
+		$status = Status::findOrFail($id);
+		$pid = $request->user()->profile_id;
+		abort_if(!in_array($status->scope, ['public', 'unlisted', 'private']), 404);
+
+		return StatusService::getState($status->id, $pid);
+	}
+
+   /**
+	* GET /api/v1/discover/accounts/popular
+	*
+	*
+	* @return array
+	*/
+	public function discoverAccountsPopular(Request $request)
+	{
+		abort_if(!$request->user(), 403);
+		$pid = $request->user()->profile_id;
+
+		$ids = DB::table('profiles')
+			->where('is_private', false)
+			->whereNull('status')
+			->orderByDesc('profiles.followers_count')
+			->limit(20)
+			->get();
+
+		$ids = $ids->map(function($profile) {
+				return AccountService::get($profile->id);
+			})
+			->filter(function($profile) use($pid) {
+				return $profile &&
+					isset($profile['id']) &&
+					!FollowerService::follows($pid, $profile['id']) &&
+					$profile['id'] != $pid;
+			})
+			->take(6)
+			->values();
+
+		return response()->json($ids, 200, [], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES);
+	}
 }

+ 2 - 0
routes/api.php

@@ -85,6 +85,8 @@ Route::group(['prefix' => 'api'], function() use($middleware) {
 
 	Route::group(['prefix' => 'v2'], function() use($middleware) {
 		Route::get('search', 'Api\ApiV1Controller@searchV2')->middleware($middleware);
+		Route::get('statuses/{id}/replies', 'Api\ApiV1Controller@statusReplies')->middleware($middleware);
+		Route::get('statuses/{id}/state', 'Api\ApiV1Controller@statusState')->middleware($middleware);
 	});
 
 });