implement tracking of follow requests
authorWilliam Pitcock <nenolod@dereferenced.org>
Sat, 26 May 2018 16:03:32 +0000 (16:03 +0000)
committerWilliam Pitcock <nenolod@dereferenced.org>
Mon, 11 Jun 2018 22:15:53 +0000 (22:15 +0000)
lib/pleroma/user.ex
lib/pleroma/web/activity_pub/utils.ex
lib/pleroma/web/mastodon_api/mastodon_api_controller.ex
lib/pleroma/web/router.ex

index c7b7b4f0a0cf5491b5158867ee909811dfec7f4d..35f3371ba17a858df16e3577ac84119f1d02595c 100644 (file)
@@ -353,6 +353,36 @@ defmodule Pleroma.User do
     {:ok, Repo.all(q)}
   end
 
+  def get_follow_requests_query(%User{} = user) do
+    from(
+      a in Activity,
+      where: fragment(
+        "? ->> 'type' = 'Follow'",
+        a.data
+      ),
+      where: fragment(
+        "? ->> 'state' = 'pending'",
+        a.data
+      ),
+      where: fragment(
+        "? @> ?",
+        a.data,
+        ^%{"object" => user.ap_id}
+      )
+    )
+  end
+
+  def get_follow_requests(%User{} = user) do
+    q = get_follow_requests_query(user)
+    reqs = Repo.all(q)
+
+    users =
+      Enum.map(reqs, fn (req) -> req.actor end)
+      |> Enum.map(fn (ap_id) -> get_by_ap_id(ap_id) end)
+
+    {:ok, users}
+  end
+
   def increase_note_count(%User{} = user) do
     note_count = (user.info["note_count"] || 0) + 1
     new_info = Map.put(user.info, "note_count", note_count)
index 56b80a8db63ed2b479b86470648d2a756221133b..3229949c063080bb9e0ac5b5c8fcad9336be6778 100644 (file)
@@ -219,7 +219,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do
   @doc """
   Makes a follow activity data for the given follower and followed
   """
-  def make_follow_data(%User{ap_id: follower_id}, %User{ap_id: followed_id}, activity_id) do
+  def make_follow_data(%User{ap_id: follower_id}, %User{ap_id: followed_id} = followed, activity_id) do
     data = %{
       "type" => "Follow",
       "actor" => follower_id,
@@ -229,6 +229,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do
     }
 
     if activity_id, do: Map.put(data, "id", activity_id), else: data
+    if User.locked?(followed), do: Map.put(data, "state", "pending"), else: data
   end
 
   def fetch_latest_follow(%User{ap_id: follower_id}, %User{ap_id: followed_id}) do
index 0f7d4bb6d85289d8e5075f5de9f2dc787194e497..e92c6277b477ba514432d398ea924a6f5e1b0ff9 100644 (file)
@@ -476,6 +476,12 @@ defmodule Pleroma.Web.MastodonAPI.MastodonAPIController do
     end
   end
 
+  def follow_requests(%{assigns: %{user: followed}} = conn, _params) do
+    with {:ok, follow_requests} <- User.get_follow_requests(followed) do
+      render(conn, AccountView, "accounts.json", %{users: follow_requests, as: :user})
+    end
+  end
+
   def follow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do
     with %User{} = followed <- Repo.get(User, id),
          {:ok, follower} <- User.maybe_direct_follow(follower, followed),
index 57b10bff1e5149efa445b5d23c47317aaaf4b985..e517510b8ec549d806d9caa8fce0c48b0ec2b44f 100644 (file)
@@ -97,11 +97,13 @@ defmodule Pleroma.Web.Router do
     post("/accounts/:id/mute", MastodonAPIController, :relationship_noop)
     post("/accounts/:id/unmute", MastodonAPIController, :relationship_noop)
 
+    get("/follow_requests", MastodonAPIController, :follow_requests)
+
     post("/follows", MastodonAPIController, :follow)
 
     get("/blocks", MastodonAPIController, :blocks)
 
-    get("/follow_requests", MastodonAPIController, :empty_array)
+    get("/domain_blocks", MastodonAPIController, :empty_array)
     get("/mutes", MastodonAPIController, :empty_array)
 
     get("/timelines/home", MastodonAPIController, :home_timeline)