From 46485426eaae97006ee40d65f598812ba336e47b Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Wed, 5 Jan 2022 21:36:02 -0700 Subject: [PATCH] Update ApiV1Controller, add mastoapi strict mode --- app/Http/Controllers/Api/ApiV1Controller.php | 56 +++++++++----------- app/Services/AccountService.php | 4 ++ app/Services/StatusService.php | 5 ++ config/exp.php | 26 ++++++++- 4 files changed, 59 insertions(+), 32 deletions(-) diff --git a/app/Http/Controllers/Api/ApiV1Controller.php b/app/Http/Controllers/Api/ApiV1Controller.php index b4cc51e93..6140700ff 100644 --- a/app/Http/Controllers/Api/ApiV1Controller.php +++ b/app/Http/Controllers/Api/ApiV1Controller.php @@ -64,7 +64,6 @@ use App\Services\{ NotificationService, MediaPathService, PublicTimelineService, - ProfileService, RelationshipService, SearchApiV2Service, StatusService, @@ -142,7 +141,7 @@ class ApiV1Controller extends Controller $id = $request->user()->profile_id; - $res = ProfileService::get($id); + $res = AccountService::getMastodon($id); $res['source'] = [ 'privacy' => $res['locked'] ? 'private' : 'public', @@ -164,10 +163,10 @@ class ApiV1Controller extends Controller */ public function accountById(Request $request, $id) { - $profile = Profile::whereNull('status')->findOrFail($id); - $resource = new Fractal\Resource\Item($profile, new AccountTransformer()); - $res = $this->fractal->createData($resource)->toArray(); - + $res = AccountService::getMastodon($id, true); + if(!$res) { + return response()->json(['error' => 'Record not found'], 404); + } return response()->json($res); } @@ -394,7 +393,7 @@ class ApiV1Controller extends Controller MediaSyncLicensePipeline::dispatch($user->id, $request->input('license')); } - $res = AccountService::get($user->profile_id); + $res = AccountService::getMastodon($user->profile_id); $res['bio'] = strip_tags($res['note']); $res = array_merge($res, $other); @@ -508,7 +507,7 @@ class ApiV1Controller extends Controller 'limit' => 'nullable|integer|min:1|max:80' ]); - $profile = AccountService::get($id); + $profile = AccountService::getMastodon($id); abort_if(!$profile, 404); $limit = $request->limit ?? 20; @@ -534,17 +533,12 @@ class ApiV1Controller extends Controller if($pid == $profile['id']) { $visibility = ['public', 'unlisted', 'private']; } else if($profile['locked']) { - $following = Cache::remember('profile:following:'.$pid, now()->addMinutes(1440), function() use($pid) { - $following = Follower::whereProfileId($pid)->pluck('following_id'); - return $following->push($pid)->toArray(); - }); - $visibility = true == in_array($profile['id'], $following) ? ['public', 'unlisted', 'private'] : []; + $following = FollowerService::follows($pid, $profile['id']); + abort_unless($following, 403); + $visibility = ['public', 'unlisted', 'private']; } else { - $following = Cache::remember('profile:following:'.$pid, now()->addMinutes(1440), function() use($pid) { - $following = Follower::whereProfileId($pid)->pluck('following_id'); - return $following->push($pid)->toArray(); - }); - $visibility = true == in_array($profile['id'], $following) ? ['public', 'unlisted', 'private'] : ['public', 'unlisted']; + $following = FollowerService::follows($pid, $profile['id']); + $visibility = $following ? ['public', 'unlisted', 'private'] : ['public', 'unlisted']; } $dir = $min_id ? '>' : '<'; @@ -560,7 +554,7 @@ class ApiV1Controller extends Controller ->get() ->map(function($s) use($user) { try { - $status = StatusService::get($s->id, false); + $status = StatusService::getMastodon($s->id, false); } catch (\Exception $e) { $status = false; } @@ -968,7 +962,7 @@ class ApiV1Controller extends Controller ->limit($limit) ->get() ->map(function($like) { - $status = StatusService::get($like['status_id'], false); + $status = StatusService::getMastodon($like['status_id'], false); $status['like_id'] = $like->id; $status['liked_at'] = $like->created_at->format('c'); return $status; @@ -1731,7 +1725,7 @@ class ApiV1Controller extends Controller 'id' => $dm->id, 'unread' => false, 'accounts' => [ - AccountService::get($from) + AccountService::getMastodon($from) ], 'last_status' => StatusService::getDirectMessage($dm->status_id) ]; @@ -1784,7 +1778,7 @@ class ApiV1Controller extends Controller $res = collect($feed) ->map(function($k) use($user) { - $status = StatusService::get($k); + $status = StatusService::getMastodon($k); if($user) { $status['favourited'] = (bool) LikeService::liked($user->profile_id, $k); $status['relationship'] = RelationshipService::get($user->profile_id, $status['account']['id']); @@ -1811,7 +1805,7 @@ class ApiV1Controller extends Controller $user = $request->user(); - $res = StatusService::get($id, false); + $res = StatusService::getMastodon($id, false); if(!$res || !isset($res['visibility'])) { abort(404); } @@ -2000,7 +1994,7 @@ class ApiV1Controller extends Controller ->limit($limit) ->get() ->map(function($like) { - $account = AccountService::get($like->profile_id); + $account = AccountService::getMastodon($like->profile_id); $account['follows'] = isset($like->created_at); return $account; }) @@ -2314,10 +2308,10 @@ class ApiV1Controller extends Controller ->limit($limit) ->pluck('status_id') ->filter(function($i) { - return StatusService::get($i); + return StatusService::getMastodon($i); }) ->map(function ($i) { - return StatusService::get($i); + return StatusService::getMastodon($i); }) ->filter() ->values() @@ -2367,7 +2361,7 @@ class ApiV1Controller extends Controller $res = []; foreach($bookmarks as $id) { - $res[] = \App\Services\StatusService::get($id); + $res[] = \App\Services\StatusService::getMastodon($id); } return $res; } @@ -2470,7 +2464,7 @@ class ApiV1Controller extends Controller $filters = UserFilterService::filters($pid); $forYou = DiscoverService::getForYou(); $posts = $forYou->take(50)->map(function($post) { - return StatusService::get($post); + return StatusService::getMastodon($post); }) ->filter(function($post) use($filters) { return $post && @@ -2500,7 +2494,7 @@ class ApiV1Controller extends Controller $limit = $request->input('limit', 3); $pid = $request->user()->profile_id; - $status = StatusService::get($id); + $status = StatusService::getMastodon($id); abort_if(!$status || !in_array($status['visibility'], ['public', 'unlisted']), 404); @@ -2533,7 +2527,7 @@ class ApiV1Controller extends Controller } $data = $ids->map(function($post) use($pid) { - $status = StatusService::get($post->id); + $status = StatusService::getMastodon($post->id); if(!$status || !isset($status['id'])) { return false; @@ -2591,7 +2585,7 @@ class ApiV1Controller extends Controller ->get(); $ids = $ids->map(function($profile) { - return AccountService::get($profile->id); + return AccountService::getMastodon($profile->id); }) ->filter(function($profile) use($pid) { return $profile && diff --git a/app/Services/AccountService.php b/app/Services/AccountService.php index 0410f8f64..62996a838 100644 --- a/app/Services/AccountService.php +++ b/app/Services/AccountService.php @@ -40,6 +40,10 @@ class AccountService return null; } + if(config('exp.emc') == false) { + return $account; + } + unset( $account['header_bg'], $account['is_admin'], diff --git a/app/Services/StatusService.php b/app/Services/StatusService.php index 3532c8733..7d72ccbe0 100644 --- a/app/Services/StatusService.php +++ b/app/Services/StatusService.php @@ -46,6 +46,11 @@ class StatusService if(!$status) { return null; } + + if(config('exp.emc') == false) { + return $status; + } + $status['replies_count'] = $status['reply_count']; unset( $status['_v'], diff --git a/config/exp.php b/config/exp.php index c52614f96..181c49f47 100644 --- a/config/exp.php +++ b/config/exp.php @@ -1,13 +1,37 @@ env('EXP_LC', false), + + // Recommendations (deprecated) 'rec' => false, + + // Loops feature (deprecated) 'loops' => false, + + // Text only posts (alpha) 'top' => env('EXP_TOP', false), + + // Poll statuses (alpha) 'polls' => env('EXP_POLLS', false), + + // Cached public timeline for larger instances (beta) 'cached_public_timeline' => env('EXP_CPT', false), + + // Groups (unreleased) 'gps' => env('EXP_GPS', false), + + // Single page application (beta) 'spa' => true, + + // Enforce Mastoapi Compatibility (alpha) + // Note: this may break 3rd party apps who use non-mastodon compliant fields + 'emc' => env('EXP_EMC', false), ];