ChatController: Add creation and return of chats.
authorlain <lain@soykaf.club>
Thu, 9 Apr 2020 13:13:55 +0000 (15:13 +0200)
committerlain <lain@soykaf.club>
Thu, 9 Apr 2020 13:13:55 +0000 (15:13 +0200)
lib/pleroma/chat.ex
lib/pleroma/web/pleroma_api/controllers/chat_controller.ex [new file with mode: 0644]
lib/pleroma/web/router.ex
test/web/pleroma_api/controllers/chat_controller_test.exs [new file with mode: 0644]

index b61bc4c0e741b8eacfa7df5106b721572c902a5d..2475019d1833a07c0f08e01f52060c161edb6530 100644 (file)
@@ -35,6 +35,16 @@ defmodule Pleroma.Chat do
     |> Repo.get_by(user_id: user_id, recipient: recipient)
   end
 
+  def get_or_create(user_id, recipient) do
+    %__MODULE__{}
+    |> creation_cng(%{user_id: user_id, recipient: recipient})
+    |> Repo.insert(
+      on_conflict: :nothing,
+      returning: true,
+      conflict_target: [:user_id, :recipient]
+    )
+  end
+
   def bump_or_create(user_id, recipient) do
     %__MODULE__{}
     |> creation_cng(%{user_id: user_id, recipient: recipient, unread: 1})
diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
new file mode 100644 (file)
index 0000000..0ee8bea
--- /dev/null
@@ -0,0 +1,47 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+defmodule Pleroma.Web.PleromaAPI.ChatController do
+  use Pleroma.Web, :controller
+
+  alias Pleroma.Chat
+  alias Pleroma.Repo
+
+  import Ecto.Query
+
+  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()
+
+    represented_chats =
+      Enum.map(chats, fn chat ->
+        %{
+          id: chat.id,
+          recipient: chat.recipient,
+          unread: chat.unread
+        }
+      end)
+
+    conn
+    |> json(represented_chats)
+  end
+
+  def create(%{assigns: %{user: user}} = conn, params) do
+    recipient = params["ap_id"] |> URI.decode_www_form()
+
+    with {:ok, %Chat{} = chat} <- Chat.get_or_create(user.id, recipient) do
+      represented_chat = %{
+        id: chat.id,
+        recipient: chat.recipient,
+        unread: chat.unread
+      }
+
+      conn
+      |> json(represented_chat)
+    end
+  end
+end
index 3ecd59cd1a67d19eb3d7f588a662e4f456bffd69..18ce9ee4b3347676ef6df29da1eecc367ad52296 100644 (file)
@@ -284,6 +284,13 @@ defmodule Pleroma.Web.Router do
   end
 
   scope "/api/v1/pleroma", Pleroma.Web.PleromaAPI do
+    scope [] do
+      pipe_through(:authenticated_api)
+
+      post("/chats/by-ap-id/:ap_id", ChatController, :create)
+      get("/chats", ChatController, :index)
+    end
+
     scope [] do
       pipe_through(:authenticated_api)
 
diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs
new file mode 100644 (file)
index 0000000..40c09d1
--- /dev/null
@@ -0,0 +1,55 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2020 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do
+  use Pleroma.Web.ConnCase, async: true
+
+  alias Pleroma.Chat
+
+  import Pleroma.Factory
+
+  describe "POST /api/v1/pleroma/chats/by-ap-id/:id" do
+    test "it creates or returns a chat", %{conn: conn} do
+      user = insert(:user)
+      other_user = insert(:user)
+
+      result =
+        conn
+        |> assign(:user, user)
+        |> post("/api/v1/pleroma/chats/by-ap-id/#{URI.encode_www_form(other_user.ap_id)}")
+        |> json_response(200)
+
+      assert result["id"]
+    end
+  end
+
+  describe "GET /api/v1/pleroma/chats" do
+    test "it return a list of chats the current user is participating in, in descending order of updates",
+         %{conn: conn} do
+      user = insert(:user)
+      har = insert(:user)
+      jafnhar = insert(:user)
+      tridi = insert(:user)
+
+      {:ok, chat_1} = Chat.get_or_create(user.id, har.ap_id)
+      :timer.sleep(1000)
+      {:ok, _chat_2} = Chat.get_or_create(user.id, jafnhar.ap_id)
+      :timer.sleep(1000)
+      {:ok, chat_3} = Chat.get_or_create(user.id, tridi.ap_id)
+      :timer.sleep(1000)
+
+      # bump the second one
+      {:ok, chat_2} = Chat.bump_or_create(user.id, jafnhar.ap_id)
+
+      result =
+        conn
+        |> assign(:user, user)
+        |> get("/api/v1/pleroma/chats")
+        |> json_response(200)
+
+      ids = Enum.map(result, & &1["id"])
+
+      assert ids == [chat_2.id, chat_3.id, chat_1.id]
+    end
+  end
+end