api/v1/timelines/direct implementation
[akkoma] / lib / pleroma / web / activity_pub / activity_pub.ex
index 8c1ba1ea39977099e4929157b17e52086e7e995d..d5d00d4a2726f0e5802af5b901836683a7c1b04d 100644 (file)
@@ -224,6 +224,28 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
     |> Enum.reverse()
   end
 
+  @valid_visibilities ~w[direct unlisted public private]
+
+  defp restrict_visibility(query, %{visibility: "direct"}) do
+    public = "https://www.w3.org/ns/activitystreams#Public"
+
+    from(
+      activity in query,
+      join: sender in User,
+      on: sender.ap_id == activity.actor,
+      where:
+        fragment("not data->'to' \\? ?", ^public) and fragment("not data->'cc' \\? ?", ^public) and
+          fragment("not data->'to' \\? ?", sender.follower_address)
+    )
+  end
+
+  defp restrict_visibility(_query, %{visibility: visibility})
+       when visibility not in @valid_visibilities do
+    Logger.error("Could not restrict visibility to #{visibility}")
+  end
+
+  defp restrict_visibility(query, _visibility), do: query
+
   defp restrict_since(query, %{"since_id" => since_id}) do
     from(activity in query, where: activity.id > ^since_id)
   end
@@ -347,6 +369,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
     |> restrict_recent(opts)
     |> restrict_blocked(opts)
     |> restrict_media(opts)
+    |> restrict_visibility(opts)
   end
 
   def fetch_activities(recipients, opts \\ %{}) do