giant massive dep upgrade and dialyxir-found error emporium (#371)
[akkoma] / lib / pleroma / following_relationship.ex
index 5390a58e1357e9475bb473b3c2c83077022ee824..c489ccbbe0d44cea41b4806ba4313259011179f3 100644 (file)
@@ -1,5 +1,5 @@
 # Pleroma: A lightweight social networking server
-# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
 # SPDX-License-Identifier: AGPL-3.0-only
 
 defmodule Pleroma.FollowingRelationship do
@@ -14,6 +14,8 @@ defmodule Pleroma.FollowingRelationship do
   alias Pleroma.Repo
   alias Pleroma.User
 
+  @type follow_state :: :follow_pending | :follow_accept | :follow_reject | :unfollow
+
   schema "following_relationships" do
     field(:state, State, default: :follow_pending)
 
@@ -72,6 +74,7 @@ defmodule Pleroma.FollowingRelationship do
     end
   end
 
+  @spec follow(User.t(), User.t()) :: {:ok, User.t(), User.t()} | {:error, any}
   def follow(%User{} = follower, %User{} = following, state \\ :follow_accept) do
     with {:ok, _following_relationship} <-
            %__MODULE__{}
@@ -81,6 +84,7 @@ defmodule Pleroma.FollowingRelationship do
     end
   end
 
+  @spec unfollow(User.t(), User.t()) :: {:ok, User.t(), User.t()} | {:error, any}
   def unfollow(%User{} = follower, %User{} = following) do
     case get(follower, following) do
       %__MODULE__{} = following_relationship ->
@@ -89,10 +93,12 @@ defmodule Pleroma.FollowingRelationship do
         end
 
       _ ->
-        {:ok, nil}
+        {:ok, follower, following}
     end
   end
 
+  @spec after_update(follow_state(), User.t(), User.t()) ::
+          {:ok, User.t(), User.t()} | {:error, any()}
   defp after_update(state, %User{} = follower, %User{} = following) do
     with {:ok, following} <- User.update_follower_count(following),
          {:ok, follower} <- User.update_following_count(follower) do
@@ -103,6 +109,8 @@ defmodule Pleroma.FollowingRelationship do
       })
 
       {:ok, follower, following}
+    else
+      err -> {:error, err}
     end
   end
 
@@ -152,7 +160,7 @@ defmodule Pleroma.FollowingRelationship do
     |> join(:inner, [r], f in assoc(r, :follower))
     |> where([r], r.state == ^:follow_pending)
     |> where([r], r.following_id == ^id)
-    |> where([r, f], f.deactivated != true)
+    |> where([r, f], f.is_active == true)
     |> select([r, f], f)
     |> Repo.all()
   end
@@ -194,12 +202,13 @@ defmodule Pleroma.FollowingRelationship do
     |> join(:inner, [r], f in assoc(r, :follower))
     |> where(following_id: ^origin.id)
     |> where([r, f], f.allow_following_move == true)
+    |> where([r, f], f.local == true)
     |> limit(50)
     |> preload([:follower])
     |> Repo.all()
     |> Enum.map(fn following_relationship ->
-      Repo.delete(following_relationship)
       Pleroma.Web.CommonAPI.follow(following_relationship.follower, target)
+      Pleroma.Web.CommonAPI.unfollow(following_relationship.follower, origin)
     end)
     |> case do
       [] ->
@@ -239,30 +248,6 @@ defmodule Pleroma.FollowingRelationship do
     end)
   end
 
-  @doc """
-  For a query with joined activity,
-  keeps rows where activity's actor is followed by user -or- is NOT domain-blocked by user.
-  """
-  def keep_following_or_not_domain_blocked(query, user) do
-    where(
-      query,
-      [_, activity],
-      fragment(
-        # "(actor's domain NOT in domain_blocks) OR (actor IS in followed AP IDs)"
-        """
-        NOT (substring(? from '.*://([^/]*)') = ANY(?)) OR
-          ? = ANY(SELECT ap_id FROM users AS u INNER JOIN following_relationships AS fr
-            ON u.id = fr.following_id WHERE fr.follower_id = ? AND fr.state = ?)
-        """,
-        activity.actor,
-        ^user.domain_blocks,
-        activity.actor,
-        ^User.binary_id(user.id),
-        ^accept_state_code()
-      )
-    )
-  end
-
   defp validate_not_self_relationship(%Changeset{} = changeset) do
     changeset
     |> validate_follower_id_following_id_inequality()