ChatController: Handle pagination.
authorlain <lain@soykaf.club>
Thu, 16 Apr 2020 16:43:31 +0000 (18:43 +0200)
committerlain <lain@soykaf.club>
Thu, 16 Apr 2020 16:43:31 +0000 (18:43 +0200)
lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
lib/pleroma/web/pleroma_api/views/chat_message_view.ex
lib/pleroma/web/pleroma_api/views/chat_view.ex
test/web/pleroma_api/controllers/chat_controller_test.exs

index 5ec54684796ecbffebbd350a7e4ad748d3464f20..8cf8d82e4595ef2ce0f0c6a74607be4fda3cb894 100644 (file)
@@ -11,6 +11,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
   alias Pleroma.Web.CommonAPI
   alias Pleroma.Web.PleromaAPI.ChatView
   alias Pleroma.Web.PleromaAPI.ChatMessageView
+  alias Pleroma.Pagination
 
   import Ecto.Query
 
@@ -35,7 +36,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
     end
   end
 
-  def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{"id" => id}) do
+  def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{"id" => id} = params) do
     with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id) do
       messages =
         from(o in Object,
@@ -54,10 +55,9 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
               ^chat.recipient,
               o.data,
               ^[user.ap_id]
-            ),
-          order_by: [desc: o.id]
+            )
         )
-        |> Repo.all()
+        |> Pagination.fetch_paginated(params)
 
       conn
       |> put_view(ChatMessageView)
@@ -65,13 +65,13 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
     end
   end
 
-  def index(%{assigns: %{user: %{id: user_id}}} = conn, _params) do
+  def index(%{assigns: %{user: %{id: user_id}}} = conn, params) do
     chats =
       from(c in Chat,
         where: c.user_id == ^user_id,
         order_by: [desc: c.updated_at]
       )
-      |> Repo.all()
+      |> Pagination.fetch_paginated(params)
 
     conn
     |> put_view(ChatView)
index 2df5913584b83688e807ebf9419b1bec5e7abd1d..fdbb9ff1bd0177cfd969dfe277659be56b4dd61a 100644 (file)
@@ -15,9 +15,9 @@ defmodule Pleroma.Web.PleromaAPI.ChatMessageView do
         }
       ) do
     %{
-      id: id,
+      id: id |> to_string(),
       content: chat_message["content"],
-      chat_id: chat_id,
+      chat_id: chat_id |> to_string(),
       actor: chat_message["actor"]
     }
   end
index ee48385bf9ef49660f545c9be75e1937e8336468..7b8c6450a5c25febb4a1a855bb3e8b849f98b2b7 100644 (file)
@@ -9,7 +9,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatView do
 
   def render("show.json", %{chat: %Chat{} = chat}) do
     %{
-      id: chat.id,
+      id: chat.id |> to_string(),
       recipient: chat.recipient,
       unread: chat.unread
     }
index dad37a889b57ec967664eb1a86bee0c743c067b6..f30fd661561aa0c76965b24ceebfa180df1e6326 100644 (file)
@@ -23,11 +23,38 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do
         |> json_response(200)
 
       assert result["content"] == "Hallo!!"
-      assert result["chat_id"] == chat.id
+      assert result["chat_id"] == chat.id |> to_string()
     end
   end
 
   describe "GET /api/v1/pleroma/chats/:id/messages" do
+    test "it paginates", %{conn: conn} do
+      user = insert(:user)
+      recipient = insert(:user)
+
+      Enum.each(1..30, fn _ ->
+        {:ok, _} = CommonAPI.post_chat_message(user, recipient, "hey")
+      end)
+
+      chat = Chat.get(user.id, recipient.ap_id)
+
+      result =
+        conn
+        |> assign(:user, user)
+        |> get("/api/v1/pleroma/chats/#{chat.id}/messages")
+        |> json_response(200)
+
+      assert length(result) == 20
+
+      result =
+        conn
+        |> assign(:user, user)
+        |> get("/api/v1/pleroma/chats/#{chat.id}/messages", %{"max_id" => List.last(result)["id"]})
+        |> json_response(200)
+
+      assert length(result) == 10
+    end
+
     # TODO
     # - Test the case where it's not the user's chat
     test "it returns the messages for a given chat", %{conn: conn} do
@@ -50,7 +77,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do
 
       result
       |> Enum.each(fn message ->
-        assert message["chat_id"] == chat.id
+        assert message["chat_id"] == chat.id |> to_string()
       end)
 
       assert length(result) == 3
@@ -73,6 +100,31 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do
   end
 
   describe "GET /api/v1/pleroma/chats" do
+    test "it paginates", %{conn: conn} do
+      user = insert(:user)
+
+      Enum.each(1..30, fn _ ->
+        recipient = insert(:user)
+        {:ok, _} = Chat.get_or_create(user.id, recipient.ap_id)
+      end)
+
+      result =
+        conn
+        |> assign(:user, user)
+        |> get("/api/v1/pleroma/chats")
+        |> json_response(200)
+
+      assert length(result) == 20
+
+      result =
+        conn
+        |> assign(:user, user)
+        |> get("/api/v1/pleroma/chats", %{max_id: List.last(result)["id"]})
+        |> json_response(200)
+
+      assert length(result) == 10
+    end
+
     test "it return a list of chats the current user is participating in, in descending order of updates",
          %{conn: conn} do
       user = insert(:user)
@@ -98,7 +150,11 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do
 
       ids = Enum.map(result, & &1["id"])
 
-      assert ids == [chat_2.id, chat_3.id, chat_1.id]
+      assert ids == [
+               chat_2.id |> to_string(),
+               chat_3.id |> to_string(),
+               chat_1.id |> to_string()
+             ]
     end
   end
 end