forked from YokaiRick/akkoma
Handle follow/unfollow directed to themselves
This commit is contained in:
parent
8c6d5a6b4d
commit
507e7821e3
2 changed files with 52 additions and 3 deletions
|
@ -815,13 +815,17 @@ def reject_follow_request(%{assigns: %{user: followed}} = conn, %{"id" => id}) d
|
||||||
end
|
end
|
||||||
|
|
||||||
def follow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do
|
def follow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do
|
||||||
with %User{} = followed <- User.get_by_id(id),
|
with {_, %User{} = followed} <- {:followed, User.get_by_id(id)},
|
||||||
|
{_, true} <- {:followed, follower.id != followed.id},
|
||||||
false <- User.following?(follower, followed),
|
false <- User.following?(follower, followed),
|
||||||
{:ok, follower, followed, _} <- CommonAPI.follow(follower, followed) do
|
{:ok, follower, followed, _} <- CommonAPI.follow(follower, followed) do
|
||||||
conn
|
conn
|
||||||
|> put_view(AccountView)
|
|> put_view(AccountView)
|
||||||
|> render("relationship.json", %{user: follower, target: followed})
|
|> render("relationship.json", %{user: follower, target: followed})
|
||||||
else
|
else
|
||||||
|
{:followed, _} ->
|
||||||
|
{:error, :not_found}
|
||||||
|
|
||||||
true ->
|
true ->
|
||||||
followed = User.get_cached_by_id(id)
|
followed = User.get_cached_by_id(id)
|
||||||
|
|
||||||
|
@ -843,12 +847,16 @@ def follow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def follow(%{assigns: %{user: follower}} = conn, %{"uri" => uri}) do
|
def follow(%{assigns: %{user: follower}} = conn, %{"uri" => uri}) do
|
||||||
with %User{} = followed <- User.get_by_nickname(uri),
|
with {_, %User{} = followed} <- {:followed, User.get_by_nickname(uri)},
|
||||||
|
{_, true} <- {:followed, follower.id != followed.id},
|
||||||
{:ok, follower, followed, _} <- CommonAPI.follow(follower, followed) do
|
{:ok, follower, followed, _} <- CommonAPI.follow(follower, followed) do
|
||||||
conn
|
conn
|
||||||
|> put_view(AccountView)
|
|> put_view(AccountView)
|
||||||
|> render("account.json", %{user: followed, for: follower})
|
|> render("account.json", %{user: followed, for: follower})
|
||||||
else
|
else
|
||||||
|
{:followed, _} ->
|
||||||
|
{:error, :not_found}
|
||||||
|
|
||||||
{:error, message} ->
|
{:error, message} ->
|
||||||
conn
|
conn
|
||||||
|> put_resp_content_type("application/json")
|
|> put_resp_content_type("application/json")
|
||||||
|
@ -857,11 +865,18 @@ def follow(%{assigns: %{user: follower}} = conn, %{"uri" => uri}) do
|
||||||
end
|
end
|
||||||
|
|
||||||
def unfollow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do
|
def unfollow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do
|
||||||
with %User{} = followed <- User.get_by_id(id),
|
with {_, %User{} = followed} <- {:followed, User.get_by_id(id)},
|
||||||
|
{_, true} <- {:followed, follower.id != followed.id},
|
||||||
{:ok, follower} <- CommonAPI.unfollow(follower, followed) do
|
{:ok, follower} <- CommonAPI.unfollow(follower, followed) do
|
||||||
conn
|
conn
|
||||||
|> put_view(AccountView)
|
|> put_view(AccountView)
|
||||||
|> render("relationship.json", %{user: follower, target: followed})
|
|> render("relationship.json", %{user: follower, target: followed})
|
||||||
|
else
|
||||||
|
{:followed, _} ->
|
||||||
|
{:error, :not_found}
|
||||||
|
|
||||||
|
error ->
|
||||||
|
error
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -1587,6 +1587,40 @@ test "following / unfollowing a user", %{conn: conn} do
|
||||||
assert id == to_string(other_user.id)
|
assert id == to_string(other_user.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "following / unfollowing errors" do
|
||||||
|
user = insert(:user)
|
||||||
|
|
||||||
|
conn =
|
||||||
|
build_conn()
|
||||||
|
|> assign(:user, user)
|
||||||
|
|
||||||
|
# self follow
|
||||||
|
conn_res = post(conn, "/api/v1/accounts/#{user.id}/follow")
|
||||||
|
assert %{"error" => "Record not found"} = json_response(conn_res, 404)
|
||||||
|
|
||||||
|
# self unfollow
|
||||||
|
user = User.get_by_id(user.id)
|
||||||
|
conn_res = post(conn, "/api/v1/accounts/#{user.id}/unfollow")
|
||||||
|
assert %{"error" => "Record not found"} = json_response(conn_res, 404)
|
||||||
|
|
||||||
|
# self follow via uri
|
||||||
|
user = User.get_by_id(user.id)
|
||||||
|
conn_res = post(conn, "/api/v1/follows", %{"uri" => user.nickname})
|
||||||
|
assert %{"error" => "Record not found"} = json_response(conn_res, 404)
|
||||||
|
|
||||||
|
# follow non existing user
|
||||||
|
conn_res = post(conn, "/api/v1/accounts/doesntexist/follow")
|
||||||
|
assert %{"error" => "Record not found"} = json_response(conn_res, 404)
|
||||||
|
|
||||||
|
# follow non existing user via uri
|
||||||
|
conn_res = post(conn, "/api/v1/follows", %{"uri" => "doesntexist"})
|
||||||
|
assert %{"error" => "Record not found"} = json_response(conn_res, 404)
|
||||||
|
|
||||||
|
# unfollow non existing user
|
||||||
|
conn_res = post(conn, "/api/v1/accounts/doesntexist/unfollow")
|
||||||
|
assert %{"error" => "Record not found"} = json_response(conn_res, 404)
|
||||||
|
end
|
||||||
|
|
||||||
test "muting / unmuting a user", %{conn: conn} do
|
test "muting / unmuting a user", %{conn: conn} do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
other_user = insert(:user)
|
other_user = insert(:user)
|
||||||
|
|
Loading…
Reference in a new issue