From 175a848665c38fe035bc37aec326b78b30218628 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Tue, 9 May 2023 00:21:46 -0600 Subject: [PATCH] Add /api/v1/followed_tags api endpoint --- app/Http/Controllers/Api/ApiV1Controller.php | 47 ++++++++++++++++++- .../MastoApi/FollowedTagResource.php | 33 +++++++++++++ routes/api.php | 2 + 3 files changed, 81 insertions(+), 1 deletion(-) create mode 100644 app/Http/Resources/MastoApi/FollowedTagResource.php diff --git a/app/Http/Controllers/Api/ApiV1Controller.php b/app/Http/Controllers/Api/ApiV1Controller.php index 1c4254fef..d142575c0 100644 --- a/app/Http/Controllers/Api/ApiV1Controller.php +++ b/app/Http/Controllers/Api/ApiV1Controller.php @@ -19,6 +19,7 @@ use App\{ Follower, FollowRequest, Hashtag, + HashtagFollow, Instance, Like, Media, @@ -99,6 +100,7 @@ use App\Jobs\FollowPipeline\FollowRejectPipeline; use Illuminate\Support\Facades\RateLimiter; use Purify; use Carbon\Carbon; +use App\Http\Resources\MastoApi\FollowedTagResource; class ApiV1Controller extends Controller { @@ -3644,7 +3646,7 @@ class ApiV1Controller extends Controller return $this->json(StatusService::getState($status->id, $pid)); } - /** + /** * GET /api/v1.1/discover/accounts/popular * * @@ -3802,4 +3804,47 @@ class ApiV1Controller extends Controller return $this->json([]); } + + /** + * GET /api/v1/followed_tags + * + * + * @return array + */ + public function getFollowedTags(Request $request) + { + abort_if(!$request->user(), 403); + + if(config('pixelfed.bouncer.cloud_ips.ban_api')) { + abort_if(BouncerService::checkIp($request->ip()), 404); + } + + $account = AccountService::get($request->user()->profile_id); + + $this->validate($request, [ + 'cursor' => 'sometimes', + 'limit' => 'sometimes|integer|min:1|max:200' + ]); + $limit = $request->input('limit', 100); + + $res = HashtagFollow::whereProfileId($account['id']) + ->cursorPaginate($limit)->withQueryString(); + + $pagination = false; + $prevPage = $res->nextPageUrl(); + $nextPage = $res->previousPageUrl(); + if($nextPage && $prevPage) { + $pagination = '<' . $nextPage . '>; rel="next", <' . $prevPage . '>; rel="prev"'; + } else if($nextPage && !$prevPage) { + $pagination = '<' . $nextPage . '>; rel="next"'; + } else if(!$nextPage && $prevPage) { + $pagination = '<' . $prevPage . '>; rel="prev"'; + } + + if($pagination) { + return response()->json(FollowedTagResource::collection($res)->collection) + ->header('Link', $pagination); + } + return response()->json(FollowedTagResource::collection($res)->collection); + } } diff --git a/app/Http/Resources/MastoApi/FollowedTagResource.php b/app/Http/Resources/MastoApi/FollowedTagResource.php new file mode 100644 index 000000000..3c690d05a --- /dev/null +++ b/app/Http/Resources/MastoApi/FollowedTagResource.php @@ -0,0 +1,33 @@ +hashtag_id); + + if(!$tag || !isset($tag['name'])) { + return []; + } + + return [ + 'name' => $tag['name'], + 'url' => config('app.url') . '/i/web/hashtag/' . $tag['slug'], + 'history' => [], + 'following' => true, + ]; + } +} diff --git a/routes/api.php b/routes/api.php index f05489c7f..2c35d2e06 100644 --- a/routes/api.php +++ b/routes/api.php @@ -89,6 +89,8 @@ Route::group(['prefix' => 'api'], function() use($middleware) { Route::get('announcements', 'Api\ApiV1Controller@getAnnouncements')->middleware($middleware); Route::get('markers', 'Api\ApiV1Controller@getMarkers')->middleware($middleware); Route::post('markers', 'Api\ApiV1Controller@setMarkers')->middleware($middleware); + + Route::get('followed_tags', 'Api\ApiV1Controller@getFollowedTags')->middleware($middleware); }); Route::group(['prefix' => 'v2'], function() use($middleware) {