Implement ActivityPub inbox view
authorsxsdv1 <sxsdv1@gmail.com>
Sat, 29 Dec 2018 17:15:28 +0000 (18:15 +0100)
committersxsdv1 <sxsdv1@gmail.com>
Sun, 30 Dec 2018 11:01:39 +0000 (12:01 +0100)
More or less verbatim copied from the outbox template with only changes
to the activities fetched and url reported

lib/pleroma/web/activity_pub/activity_pub_controller.ex
lib/pleroma/web/activity_pub/views/user_view.ex
test/web/activity_pub/activity_pub_controller_test.exs

index dfa7eb94b6e8ffa0e2d26bea570128b6faa58f3e..9f083d0a5ba530cd12d018896040263a104f1c41 100644 (file)
@@ -154,11 +154,9 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubController do
 
   def read_inbox(%{assigns: %{user: user}} = conn, %{"nickname" => nickname} = params) do
     if nickname == user.nickname do
-      Logger.info("read inbox #{inspect(params)}")
-
       conn
       |> put_resp_header("content-type", "application/activity+json")
-      |> json("ok!")
+      |> json(UserView.render("inbox.json", %{user: user, max_id: params["max_id"]}))
     else
       conn
       |> put_status(:forbidden)
index f0c268755ceace9ae7ba3758856a33868eff0c21..439d834e4210e1f12328355c7a28072abd2cda28 100644 (file)
@@ -176,6 +176,53 @@ defmodule Pleroma.Web.ActivityPub.UserView do
     end
   end
 
+  def render("inbox.json", %{user: user, max_id: max_qid}) do
+    params = %{
+      "limit" => "10"
+    }
+
+    params =
+      if max_qid != nil do
+        Map.put(params, "max_id", max_qid)
+      else
+        params
+      end
+
+    activities = ActivityPub.fetch_activities([user.ap_id | user.following], params)
+
+    min_id = Enum.at(Enum.reverse(activities), 0).id
+    max_id = Enum.at(activities, 0).id
+
+    collection =
+      Enum.map(activities, fn act ->
+        {:ok, data} = Transmogrifier.prepare_outgoing(act.data)
+        data
+      end)
+
+    iri = "#{user.ap_id}/inbox"
+
+    page = %{
+      "id" => "#{iri}?max_id=#{max_id}",
+      "type" => "OrderedCollectionPage",
+      "partOf" => iri,
+      "totalItems" => -1,
+      "orderedItems" => collection,
+      "next" => "#{iri}?max_id=#{min_id - 1}"
+    }
+
+    if max_qid == nil do
+      %{
+        "id" => iri,
+        "type" => "OrderedCollection",
+        "totalItems" => -1,
+        "first" => page
+      }
+      |> Map.merge(Utils.make_json_ld_header())
+    else
+      page |> Map.merge(Utils.make_json_ld_header())
+    end
+  end
+
   def collection(collection, iri, page, show_items \\ true, total \\ nil) do
     offset = (page - 1) * 10
     items = Enum.slice(collection, offset, 10)
index 95027f8550b8f625a0dc67c902e6aa52ab621a92..589645dd6a7e673e87d46c3d549ced74e7404676 100644 (file)
@@ -125,6 +125,19 @@ defmodule Pleroma.Web.ActivityPub.ActivityPubControllerTest do
 
       assert json_response(conn, 403)
     end
+
+    test "it returns a note activity in a collection", %{conn: conn} do
+      note_activity = insert(:direct_note_activity)
+      user = User.get_cached_by_ap_id(hd(note_activity.data["to"]))
+
+      conn =
+        conn
+        |> assign(:user, user)
+        |> put_req_header("accept", "application/activity+json")
+        |> get("/users/#{user.nickname}/inbox")
+
+      assert response(conn, 200) =~ note_activity.data["object"]["content"]
+    end
   end
 
   describe "/users/:nickname/outbox" do