Add fetching for recipients.
authorRoger Braun <roger@rogerbraun.net>
Wed, 22 Mar 2017 13:45:17 +0000 (14:45 +0100)
committerRoger Braun <roger@rogerbraun.net>
Wed, 22 Mar 2017 13:45:17 +0000 (14:45 +0100)
lib/pleroma/web/activity_pub/activity_pub.ex
lib/pleroma/web/router.ex
test/web/activity_pub/activity_pub_test.exs

index 5e4f3bbf5b5e0cba942ffe50eabe12cce2dcd6f4..121c46c51c8e952c3c78d1e6c63aa04b6f076616 100644 (file)
@@ -8,14 +8,26 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
   end
 
   def fetch_public_activities(opts \\ %{}) do
+    public = ["https://www.w3.org/ns/activitystreams#Public"]
+    fetch_activities(public, opts)
+  end
+
+  def fetch_activities(recipients, opts \\ %{}) do
     since_id = opts["since_id"] || 0
 
     query = from activity in Activity,
-      where: fragment(~s(? @> '{"to": ["https://www.w3.org/ns/activitystreams#Public"]}'), activity.data),
-      where: activity.id > ^since_id,
       limit: 20,
       order_by: [desc: :inserted_at]
 
+    query = Enum.reduce(recipients, query, fn (recipient, q) ->
+      map = %{ to: [recipient] }
+      from activity in q,
+      or_where: fragment(~s(? @> ?), activity.data, ^map)
+    end)
+
+    query = from activity in query,
+      where: activity.id > ^since_id
+
     Repo.all(query)
     |> Enum.reverse
   end
index 0440af8c139a21fece628750fc72936bc8967ab8..aa2f7865ea3be7a9bb38e59415eced032896d3e6 100644 (file)
@@ -22,6 +22,7 @@ defmodule Pleroma.Web.Router do
   scope "/api", Pleroma.Web do
     pipe_through :api
     get "/statuses/public_timeline.json", TwitterAPI.Controller, :public_timeline
+    get "/statuses/public_and_external_timeline.json", TwitterAPI.Controller, :public_timeline
   end
 
   scope "/api", Pleroma.Web do
index ba157f191739b0f5bf38603be5ba67303bd445b5..754bd72f3151e08292a0195e35e967f8b5e2e26c 100644 (file)
@@ -15,6 +15,19 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
     end
   end
 
+
+  describe "fetch activities for recipients" do
+    test "retrieve the activities for certain recipients" do
+      {:ok, activity_one} = ActivityBuilder.insert(%{"to" => ["someone"]})
+      {:ok, activity_two} = ActivityBuilder.insert(%{"to" => ["someone_else"]})
+      {:ok, activity_three} = ActivityBuilder.insert(%{"to" => ["noone"]})
+
+      activities = ActivityPub.fetch_activities(["someone", "someone_else"])
+      assert length(activities) == 2
+      assert activities == [activity_one, activity_two]
+    end
+  end
+
   describe "public fetch activities" do
     test "retrieves public activities" do
       %{public: public} = ActivityBuilder.public_and_non_public