Add User.get_follow_state/2

This commit is contained in:
Egor Kislitsyn 2020-02-07 16:17:34 +04:00
parent 2cc4fbab96
commit bc2e98b200
No known key found for this signature in database
GPG key ID: 1B49CB15B71E7805
3 changed files with 27 additions and 28 deletions

View file

@ -30,24 +30,9 @@ def changeset(%__MODULE__{} = following_relationship, attrs) do
end end
def get(%User{} = follower, %User{} = following) do def get(%User{} = follower, %User{} = following) do
following_relationship =
__MODULE__ __MODULE__
|> where(follower_id: ^follower.id, following_id: ^following.id) |> where(follower_id: ^follower.id, following_id: ^following.id)
|> Repo.one() |> Repo.one()
case {following_relationship, following.local} do
{nil, false} ->
case Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(follower, following) do
%{data: %{"state" => state}} when state in ["pending", "accept"] ->
%{state: state}
_ ->
nil
end
{following_relationship, _} ->
following_relationship
end
end end
def update(follower, following, "reject"), do: unfollow(follower, following) def update(follower, following, "reject"), do: unfollow(follower, following)

View file

@ -652,8 +652,8 @@ def unfollow(%User{ap_id: ap_id}, %User{ap_id: ap_id}) do
end end
def unfollow(%User{} = follower, %User{} = followed) do def unfollow(%User{} = follower, %User{} = followed) do
case FollowingRelationship.get(follower, followed) do case get_follow_state(follower, followed) do
%{state: state} when state in ["accept", "pending"] -> state when state in ["accept", "pending"] ->
FollowingRelationship.unfollow(follower, followed) FollowingRelationship.unfollow(follower, followed)
{:ok, followed} = update_follower_count(followed) {:ok, followed} = update_follower_count(followed)
@ -671,6 +671,24 @@ def unfollow(%User{} = follower, %User{} = followed) do
defdelegate following?(follower, followed), to: FollowingRelationship defdelegate following?(follower, followed), to: FollowingRelationship
def get_follow_state(%User{} = follower, %User{} = following) do
following_relationship = FollowingRelationship.get(follower, following)
case {following_relationship, following.local} do
{nil, false} ->
case Utils.fetch_latest_follow(follower, following) do
%{data: %{"state" => state}} when state in ["pending", "accept"] -> state
_ -> nil
end
{%{state: state}, _} ->
state
{nil, _} ->
nil
end
end
def locked?(%User{} = user) do def locked?(%User{} = user) do
user.locked || false user.locked || false
end end

View file

@ -544,11 +544,9 @@ test "cancels a pending follow for a local user" do
assert {:ok, follower, followed, %{id: activity_id, data: %{"state" => "pending"}}} = assert {:ok, follower, followed, %{id: activity_id, data: %{"state" => "pending"}}} =
CommonAPI.follow(follower, followed) CommonAPI.follow(follower, followed)
assert %{state: "pending"} = Pleroma.FollowingRelationship.get(follower, followed) assert User.get_follow_state(follower, followed) == "pending"
assert {:ok, follower} = CommonAPI.unfollow(follower, followed) assert {:ok, follower} = CommonAPI.unfollow(follower, followed)
assert User.get_follow_state(follower, followed) == nil
assert Pleroma.FollowingRelationship.get(follower, followed) == nil
assert %{id: ^activity_id, data: %{"state" => "cancelled"}} = assert %{id: ^activity_id, data: %{"state" => "cancelled"}} =
Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(follower, followed) Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(follower, followed)
@ -568,11 +566,9 @@ test "cancels a pending follow for a remote user" do
assert {:ok, follower, followed, %{id: activity_id, data: %{"state" => "pending"}}} = assert {:ok, follower, followed, %{id: activity_id, data: %{"state" => "pending"}}} =
CommonAPI.follow(follower, followed) CommonAPI.follow(follower, followed)
assert %{state: "pending"} = Pleroma.FollowingRelationship.get(follower, followed) assert User.get_follow_state(follower, followed) == "pending"
assert {:ok, follower} = CommonAPI.unfollow(follower, followed) assert {:ok, follower} = CommonAPI.unfollow(follower, followed)
assert User.get_follow_state(follower, followed) == nil
assert Pleroma.FollowingRelationship.get(follower, followed) == nil
assert %{id: ^activity_id, data: %{"state" => "cancelled"}} = assert %{id: ^activity_id, data: %{"state" => "cancelled"}} =
Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(follower, followed) Pleroma.Web.ActivityPub.Utils.fetch_latest_follow(follower, followed)