Browse Source

Update ApiV1Controller, fix account settings bug

Daniel Supernault 3 years ago
parent
commit
08246f2482

+ 59 - 49
app/Http/Controllers/Api/ApiV1Controller.php

@@ -411,34 +411,40 @@ class ApiV1Controller extends Controller
 	public function accountFollowersById(Request $request, $id)
 	public function accountFollowersById(Request $request, $id)
 	{
 	{
 		abort_if(!$request->user(), 403);
 		abort_if(!$request->user(), 403);
+		$account = AccountService::get($id);
+		abort_if(!$account, 404);
+		$pid = $request->user()->profile_id;
 
 
-		$user = $request->user();
-		$profile = Profile::whereNull('status')->findOrFail($id);
-		$limit = $request->input('limit') ?? 40;
-
-		if($profile->domain) {
-			$res = [];
-		} else {
-			if($profile->id == $user->profile_id) {
-				$followers = $profile->followers()->paginate($limit);
-				$resource = new Fractal\Resource\Collection($followers, new AccountTransformer());
-				$res = $this->fractal->createData($resource)->toArray();
-			} else {
-				if($profile->is_private) {
-					abort_if(!$profile->followedBy($user->profile), 403);
-				}
-				$settings = $profile->user->settings;
-				if( in_array($user->profile_id, $profile->blockedIds()->toArray()) ||
-					$settings->show_profile_followers == false
-				) {
-					$res = [];
-				} else {
-					$followers = $profile->followers()->paginate($limit);
-					$resource = new Fractal\Resource\Collection($followers, new AccountTransformer());
-					$res = $this->fractal->createData($resource)->toArray();
+		if($pid != $account['id']) {
+			if($account['locked']) {
+				if(FollowerService::follows($pid, $account['id'])) {
+					return [];
 				}
 				}
 			}
 			}
+
+			if(AccountService::hiddenFollowers($id)) {
+				return [];
+			}
+
+			if($request->has('page') && $request->page >= 5) {
+				return [];
+			}
 		}
 		}
+
+		$res = DB::table('followers')
+			->select('id', 'profile_id', 'following_id')
+			->whereFollowingId($account['id'])
+			->orderByDesc('id')
+			->simplePaginate(10)
+			->map(function($follower) {
+				return AccountService::getMastodon($follower->profile_id);
+			})
+			->filter(function($account) {
+				return $account && isset($account['id']);
+			})
+			->values()
+			->toArray();
+
 		return response()->json($res);
 		return response()->json($res);
 	}
 	}
 
 
@@ -451,36 +457,40 @@ class ApiV1Controller extends Controller
 	 */
 	 */
 	public function accountFollowingById(Request $request, $id)
 	public function accountFollowingById(Request $request, $id)
 	{
 	{
-		abort_if(!$request->user(), 403);
-
-		$user = $request->user();
-		$profile = Profile::whereNull('status')->findOrFail($id);
-		$limit = $request->input('limit') ?? 40;
+	abort_if(!$request->user(), 403);
+		$account = AccountService::get($id);
+		abort_if(!$account, 404);
+		$pid = $request->user()->profile_id;
 
 
-		if($profile->domain) {
-			$res = [];
-		} else {
-			if($profile->id == $user->profile_id) {
-				$following = $profile->following()->paginate($limit);
-				$resource = new Fractal\Resource\Collection($following, new AccountTransformer());
-				$res = $this->fractal->createData($resource)->toArray();
-			} else {
-				if($profile->is_private) {
-					abort_if(!$profile->followedBy($user->profile), 403);
-				}
-				$settings = $profile->user->settings;
-				if( in_array($user->profile_id, $profile->blockedIds()->toArray()) ||
-					$settings->show_profile_following == false
-				) {
-					$res = [];
-				} else {
-					$following = $profile->following()->paginate($limit);
-					$resource = new Fractal\Resource\Collection($following, new AccountTransformer());
-					$res = $this->fractal->createData($resource)->toArray();
+		if($pid != $account['id']) {
+			if($account['locked']) {
+				if(FollowerService::follows($pid, $account['id'])) {
+					return [];
 				}
 				}
 			}
 			}
+
+			if(AccountService::hiddenFollowing($id)) {
+				return [];
+			}
+
+			if($request->has('page') && $request->page >= 5) {
+				return [];
+			}
 		}
 		}
 
 
+		$res = DB::table('followers')
+			->select('id', 'profile_id', 'following_id')
+			->whereProfileId($account['id'])
+			->orderByDesc('id')
+			->simplePaginate(10)
+			->map(function($follower) {
+				return AccountService::get($follower->following_id);
+			})
+			->filter(function($account) {
+				return $account && isset($account['id']);
+			})
+			->values()
+			->toArray();
 
 
 		return response()->json($res);
 		return response()->json($res);
 	}
 	}

+ 66 - 54
app/Http/Controllers/PublicApiController.php

@@ -15,7 +15,7 @@ use App\{
     StatusView,
     StatusView,
     UserFilter
     UserFilter
 };
 };
-use Auth, Cache;
+use Auth, Cache, DB;
 use Illuminate\Support\Facades\Redis;
 use Illuminate\Support\Facades\Redis;
 use Carbon\Carbon;
 use Carbon\Carbon;
 use League\Fractal;
 use League\Fractal;
@@ -651,70 +651,82 @@ class PublicApiController extends Controller
 
 
     public function accountFollowers(Request $request, $id)
     public function accountFollowers(Request $request, $id)
     {
     {
-        abort_unless(Auth::check(), 403);
-        $profile = Profile::with('user')->whereNull('status')->findOrFail($id);
-        $owner = Auth::id() == $profile->user_id;
+		abort_if(!$request->user(), 403);
+		$account = AccountService::get($id);
+		abort_if(!$account, 404);
+		$pid = $request->user()->profile_id;
 
 
-        if(Auth::id() != $profile->user_id && $profile->is_private) {
-            return response()->json([]);
-        }
-        if(!$profile->domain && !$profile->user->settings->show_profile_followers) {
-            return response()->json([]);
-        }
-        if(!$owner && $request->page > 5) {
-            return [];
-        }
+		if($pid != $account['id']) {
+			if($account['locked']) {
+				if(FollowerService::follows($pid, $account['id'])) {
+					return [];
+				}
+			}
 
 
-        $res = Follower::select('id', 'profile_id', 'following_id')
-            ->whereFollowingId($profile->id)
-            ->orderByDesc('id')
-            ->simplePaginate(10)
-            ->map(function($follower) {
-                return ProfileService::get($follower['profile_id']);
-            })
-            ->toArray();
+			if(AccountService::hiddenFollowers($id)) {
+				return [];
+			}
 
 
-        return response()->json($res);
+			if($request->has('page') && $request->page >= 5) {
+				return [];
+			}
+		}
+
+		$res = DB::table('followers')
+			->select('id', 'profile_id', 'following_id')
+			->whereFollowingId($account['id'])
+			->orderByDesc('id')
+			->simplePaginate(10)
+			->map(function($follower) {
+				return AccountService::get($follower->profile_id);
+			})
+			->filter(function($account) {
+				return $account && isset($account['id']);
+			})
+			->values()
+			->toArray();
+
+		return response()->json($res);
     }
     }
 
 
     public function accountFollowing(Request $request, $id)
     public function accountFollowing(Request $request, $id)
     {
     {
-        abort_unless(Auth::check(), 403);
-
-        $profile = Profile::with('user')
-            ->whereNull('status')
-            ->findOrFail($id);
-
-        // filter by username
-        $search = $request->input('fbu');
-        $owner = Auth::id() == $profile->user_id;
-        $filter = ($owner == true) && ($search != null);
-
-        abort_if($owner == false && $profile->is_private == true && !$profile->followedBy(Auth::user()->profile), 404);
+    	abort_if(!$request->user(), 403);
+		$account = AccountService::get($id);
+		abort_if(!$account, 404);
+		$pid = $request->user()->profile_id;
 
 
-        if(!$profile->domain) {
-            abort_if($profile->user->settings->show_profile_following == false && $owner == false, 404);
-        }
+		if($pid != $account['id']) {
+			if($account['locked']) {
+				if(FollowerService::follows($pid, $account['id'])) {
+					return [];
+				}
+			}
 
 
-        if(!$owner && $request->page > 5) {
-            return [];
-        }
+			if(AccountService::hiddenFollowing($id)) {
+				return [];
+			}
 
 
-        if($search) {
-            abort_if(!$owner, 404);
-            $following = $profile->following()
-                    ->where('profiles.username', 'like', '%'.$search.'%')
-                    ->orderByDesc('followers.created_at')
-                    ->paginate(10);
-        } else {
-            $following = $profile->following()
-                ->orderByDesc('followers.created_at')
-                ->paginate(10);
-        }
-        $resource = new Fractal\Resource\Collection($following, new AccountTransformer());
-        $res = $this->fractal->createData($resource)->toArray();
+			if($request->has('page') && $request->page >= 5) {
+				return [];
+			}
+		}
 
 
-        return response()->json($res);
+		$res = DB::table('followers')
+			->select('id', 'profile_id', 'following_id')
+			->whereProfileId($account['id'])
+			->orderByDesc('id')
+			->simplePaginate(10)
+			->map(function($follower) {
+				return AccountService::get($follower->following_id);
+			})
+			->filter(function($account) {
+				return $account && isset($account['id']);
+			})
+			->values()
+			->toArray();
+
+		return response()->json($res);
     }
     }
 
 
     public function accountStatuses(Request $request, $id)
     public function accountStatuses(Request $request, $id)

+ 3 - 1
app/Http/Controllers/Settings/PrivacySettings.php

@@ -77,6 +77,8 @@ trait PrivacySettings
         Cache::forget('profile:follower_count:' . $profile->id);
         Cache::forget('profile:follower_count:' . $profile->id);
         Cache::forget('profile:following_count:' . $profile->id);
         Cache::forget('profile:following_count:' . $profile->id);
         Cache::forget('profile:embed:' . $profile->id);
         Cache::forget('profile:embed:' . $profile->id);
+        Cache::forget('pf:acct:settings:hidden-followers:' . $profile->id);
+        Cache::forget('pf:acct:settings:hidden-following:' . $profile->id);
         return redirect(route('settings.privacy'))->with('status', 'Settings successfully updated!');
         return redirect(route('settings.privacy'))->with('status', 'Settings successfully updated!');
     }
     }
 
 
@@ -225,4 +227,4 @@ trait PrivacySettings
         Cache::forget('profiles:private');
         Cache::forget('profiles:private');
         return [200];
         return [200];
     }
     }
-}
+}