From 2db28df4cffa2ef43a84ac68caee6cef24cce19b Mon Sep 17 00:00:00 2001
From: Roger Braun <roger@rogerbraun.net>
Date: Tue, 21 Mar 2017 21:09:20 +0100
Subject: [PATCH] Add public timeline TwAPI.

---
 lib/pleroma/web/activity_pub/activity_pub.ex   |  2 +-
 lib/pleroma/web/router.ex                      |  9 ++++++++-
 lib/pleroma/web/twitter_api/twitter_api.ex     |  4 ++--
 .../web/twitter_api/twitter_api_controller.ex  |  8 ++++++++
 test/web/activity_pub/activity_pub_test.exs    |  2 +-
 .../twitter_api_controller_test.exs            | 18 +++++++++++++++++-
 6 files changed, 37 insertions(+), 6 deletions(-)

diff --git a/lib/pleroma/web/activity_pub/activity_pub.ex b/lib/pleroma/web/activity_pub/activity_pub.ex
index 94e52a0fb..5e4f3bbf5 100644
--- a/lib/pleroma/web/activity_pub/activity_pub.ex
+++ b/lib/pleroma/web/activity_pub/activity_pub.ex
@@ -8,7 +8,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
   end
 
   def fetch_public_activities(opts \\ %{}) do
-    since_id = opts[:since_id] || 0
+    since_id = opts["since_id"] || 0
 
     query = from activity in Activity,
       where: fragment(~s(? @> '{"to": ["https://www.w3.org/ns/activitystreams#Public"]}'), activity.data),
diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex
index 1e865b358..0440af8c1 100644
--- a/lib/pleroma/web/router.ex
+++ b/lib/pleroma/web/router.ex
@@ -9,12 +9,19 @@ defmodule Pleroma.Web.Router do
 
   pipeline :api do
     plug :accepts, ["json"]
+    plug :fetch_session
+    plug Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Pleroma.Web.Router.user_fetcher/1, optional: true}
   end
 
   pipeline :authenticated_api do
     plug :accepts, ["json"]
     plug :fetch_session
-    plug Pleroma.Plugs.AuthenticationPlug, fetcher: &Pleroma.Web.Router.user_fetcher/1
+    plug Pleroma.Plugs.AuthenticationPlug, %{fetcher: &Pleroma.Web.Router.user_fetcher/1}
+  end
+
+  scope "/api", Pleroma.Web do
+    pipe_through :api
+    get "/statuses/public_timeline.json", TwitterAPI.Controller, :public_timeline
   end
 
   scope "/api", Pleroma.Web do
diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex
index 9e3251df6..da707dd6e 100644
--- a/lib/pleroma/web/twitter_api/twitter_api.ex
+++ b/lib/pleroma/web/twitter_api/twitter_api.ex
@@ -21,8 +21,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
     ActivityPub.insert(activity)
   end
 
-  def fetch_public_statuses do
-    activities = ActivityPub.fetch_public_activities
+  def fetch_public_statuses(opts \\ %{}) do
+    activities = ActivityPub.fetch_public_activities(opts)
 
     Enum.map(activities, fn(activity) ->
       actor = get_in(activity.data, ["actor"])
diff --git a/lib/pleroma/web/twitter_api/twitter_api_controller.ex b/lib/pleroma/web/twitter_api/twitter_api_controller.ex
index 1f0a547d0..404afef6d 100644
--- a/lib/pleroma/web/twitter_api/twitter_api_controller.ex
+++ b/lib/pleroma/web/twitter_api/twitter_api_controller.ex
@@ -16,6 +16,14 @@ defmodule Pleroma.Web.TwitterAPI.Controller do
     |> json_reply(200, ActivityRepresenter.to_json(activity, %{user: user}))
   end
 
+  def public_timeline(conn, params) do
+    statuses = TwitterAPI.fetch_public_statuses(params)
+    {:ok, json} = Poison.encode(statuses)
+
+    conn
+    |> json_reply(200, json)
+  end
+
   defp json_reply(conn, status, json) do
     conn
     |> put_resp_content_type("application/json")
diff --git a/test/web/activity_pub/activity_pub_test.exs b/test/web/activity_pub/activity_pub_test.exs
index 6f636d5d1..ba157f191 100644
--- a/test/web/activity_pub/activity_pub_test.exs
+++ b/test/web/activity_pub/activity_pub_test.exs
@@ -41,7 +41,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubTest do
       since_id = List.last(activities).id
       last_expected = List.last(later_activities)
 
-      activities = ActivityPub.fetch_public_activities(%{since_id: since_id})
+      activities = ActivityPub.fetch_public_activities(%{"since_id" => since_id})
       last = List.last(activities)
 
       assert length(activities) == 10
diff --git a/test/web/twitter_api/twitter_api_controller_test.exs b/test/web/twitter_api/twitter_api_controller_test.exs
index c3241817d..e243942c6 100644
--- a/test/web/twitter_api/twitter_api_controller_test.exs
+++ b/test/web/twitter_api/twitter_api_controller_test.exs
@@ -1,7 +1,7 @@
 defmodule Pleroma.Web.TwitterAPI.ControllerTest do
   use Pleroma.Web.ConnCase
   alias Pleroma.Web.TwitterAPI.Representers.{UserRepresenter, ActivityRepresenter}
-  alias Pleroma.Builders.UserBuilder
+  alias Pleroma.Builders.{ActivityBuilder, UserBuilder}
   alias Pleroma.{Repo, Activity}
 
   describe "POST /api/account/verify_credentials" do
@@ -36,6 +36,22 @@ defmodule Pleroma.Web.TwitterAPI.ControllerTest do
     end
   end
 
+  describe "GET /statuses/public_timeline.json" do
+    test "returns statuses", %{conn: conn} do
+      {:ok, user} = UserBuilder.insert
+      activities = ActivityBuilder.insert_list(30, %{}, %{user: user})
+      ActivityBuilder.insert_list(10, %{}, %{user: user})
+      since_id = List.last(activities).id
+
+      conn = conn
+        |> get("/api/statuses/public_timeline.json", %{since_id: since_id})
+
+      response = json_response(conn, 200)
+
+      assert length(response) == 10
+    end
+  end
+
   defp valid_user(_context) do
     { :ok, user } = UserBuilder.insert
     [user: user]
-- 
GitLab