瀏覽代碼

Update ApiV1Controller, add mastoapi strict mode

Daniel Supernault 3 年之前
父節點
當前提交
46485426ea
共有 4 個文件被更改,包括 59 次插入32 次删除
  1. 25 31
      app/Http/Controllers/Api/ApiV1Controller.php
  2. 4 0
      app/Services/AccountService.php
  3. 5 0
      app/Services/StatusService.php
  4. 25 1
      config/exp.php

+ 25 - 31
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 &&

+ 4 - 0
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'],

+ 5 - 0
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'],

+ 25 - 1
config/exp.php

@@ -1,13 +1,37 @@
 <?php
 
-return [
+/*
+ *   Experimental configuration options
+ *
+ *   (Use at your own risk)
+ */
 
+return [
+	// Hidden like counts (deprecated)
 	'lc' => 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),
 ];