AdminAPI: list chats for a user
authorAlex Gleason <alex@alexgleason.me>
Tue, 1 Sep 2020 01:23:33 +0000 (20:23 -0500)
committerAlex Gleason <alex@alexgleason.me>
Fri, 11 Sep 2020 19:10:05 +0000 (14:10 -0500)
lib/pleroma/web/admin_api/controllers/admin_api_controller.ex
lib/pleroma/web/router.ex
test/web/admin_api/controllers/admin_api_controller_test.exs

index f5e4d49f9ac2aaa8445188933dc9bb7909328187..9b66c2f10f600b262985955a8979f99612de2ed9 100644 (file)
@@ -5,6 +5,7 @@
 defmodule Pleroma.Web.AdminAPI.AdminAPIController do
   use Pleroma.Web, :controller
 
+  import Ecto.Query
   import Pleroma.Web.ControllerHelper, only: [json_response: 3]
 
   alias Pleroma.Config
@@ -21,6 +22,7 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
   alias Pleroma.Web.AdminAPI.ModerationLogView
   alias Pleroma.Web.AdminAPI.Search
   alias Pleroma.Web.Endpoint
+  alias Pleroma.Web.PleromaAPI
   alias Pleroma.Web.Router
 
   require Logger
@@ -68,6 +70,12 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
     when action in [:list_user_statuses, :list_instance_statuses]
   )
 
+  plug(
+    OAuthScopesPlug,
+    %{scopes: ["read:chats"], admin: true}
+    when action in [:list_user_chats]
+  )
+
   plug(
     OAuthScopesPlug,
     %{scopes: ["read"], admin: true}
@@ -256,6 +264,25 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIController do
     end
   end
 
+  def list_user_chats(%{assigns: %{user: admin}} = conn, %{"nickname" => nickname} = _params) do
+    with %User{id: user_id} <- User.get_cached_by_nickname_or_id(nickname, for: admin) do
+      chats =
+        from(c in Pleroma.Chat,
+          where: c.user_id == ^user_id,
+          order_by: [desc: c.updated_at],
+          inner_join: u in User,
+          on: u.ap_id == c.recipient
+        )
+        |> Pleroma.Repo.all()
+
+      conn
+      |> put_view(PleromaAPI.ChatView)
+      |> render("index.json", chats: chats)
+    else
+      _ -> {:error, :not_found}
+    end
+  end
+
   def user_toggle_activation(%{assigns: %{user: admin}} = conn, %{"nickname" => nickname}) do
     user = User.get_cached_by_nickname(nickname)
 
index e438768ed18ffb9a3d0a7f9a03fd591911db1e9e..ad3282df45bcec157a362df6c1ef18248bf052eb 100644 (file)
@@ -178,6 +178,7 @@ defmodule Pleroma.Web.Router do
     get("/users", AdminAPIController, :list_users)
     get("/users/:nickname", AdminAPIController, :user_show)
     get("/users/:nickname/statuses", AdminAPIController, :list_user_statuses)
+    get("/users/:nickname/chats", AdminAPIController, :list_user_chats)
 
     get("/instances/:instance/statuses", AdminAPIController, :list_instance_statuses)
 
@@ -215,6 +216,8 @@ defmodule Pleroma.Web.Router do
     post("/media_proxy_caches/delete", MediaProxyCacheController, :delete)
     post("/media_proxy_caches/purge", MediaProxyCacheController, :purge)
 
+    # get("/chats/:id", ChatController, :show)
+    # get("/chats/:id/messages", ChatController, :messages)
     delete("/chats/:id/messages/:message_id", ChatController, :delete_message)
   end
 
index dbf478edf0dd2c9fb87299fb7a5595774d87726a..cf5637246d98a19afd1126f9d6a0b66ff8ccd2a6 100644 (file)
@@ -1510,6 +1510,24 @@ defmodule Pleroma.Web.AdminAPI.AdminAPIControllerTest do
     end
   end
 
+  describe "GET /api/pleroma/admin/users/:nickname/chats" do
+    setup do
+      user = insert(:user)
+
+      insert(:chat, user: user)
+      insert(:chat, user: user)
+      insert(:chat, user: user)
+
+      %{user: user}
+    end
+
+    test "renders user's statuses", %{conn: conn, user: user} do
+      conn = get(conn, "/api/pleroma/admin/users/#{user.nickname}/chats")
+
+      assert json_response(conn, 200) |> length() == 3
+    end
+  end
+
   describe "GET /api/pleroma/admin/moderation_log" do
     setup do
       moderator = insert(:user, is_moderator: true)