ChatController: Validate parameters.
authorlain <lain@soykaf.club>
Tue, 21 Apr 2020 16:23:00 +0000 (18:23 +0200)
committerlain <lain@soykaf.club>
Tue, 21 Apr 2020 16:23:00 +0000 (18:23 +0200)
lib/pleroma/web/api_spec/operations/chat_operation.ex
lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
test/web/pleroma_api/controllers/chat_controller_test.exs

index 5bd41ec4fd60898d6580447245f67b89a0efb755..dc99bd773b0f34a8cc1d315d1dd333270cd9b8cc 100644 (file)
@@ -21,6 +21,7 @@ defmodule Pleroma.Web.ApiSpec.ChatOperation do
     %Operation{
       tags: ["chat"],
       summary: "Create a chat",
+      operationId: "ChatController.create",
       parameters: [
         Operation.parameter(
           :ap_id,
@@ -47,6 +48,7 @@ defmodule Pleroma.Web.ApiSpec.ChatOperation do
     %Operation{
       tags: ["chat"],
       summary: "Get a list of chats that you participated in",
+      operationId: "ChatController.index",
       parameters: [
         Operation.parameter(:limit, :query, :integer, "How many results to return", example: 20),
         Operation.parameter(:min_id, :query, :string, "Return only chats after this id"),
@@ -67,6 +69,7 @@ defmodule Pleroma.Web.ApiSpec.ChatOperation do
     %Operation{
       tags: ["chat"],
       summary: "Get the most recent messages of the chat",
+      operationId: "ChatController.messages",
       parameters: [
         Operation.parameter(:id, :path, :string, "The ID of the Chat"),
         Operation.parameter(:limit, :query, :integer, "How many results to return", example: 20),
@@ -89,6 +92,7 @@ defmodule Pleroma.Web.ApiSpec.ChatOperation do
     %Operation{
       tags: ["chat"],
       summary: "Post a message to the chat",
+      operationId: "ChatController.post_chat_message",
       parameters: [
         Operation.parameter(:id, :path, :string, "The ID of the Chat")
       ],
index 9d8b9b3cfb0c8cd22aeb5fcdbe3fdac861901ee8..771ad621797bbc206e113330718f80def779c853 100644 (file)
@@ -14,6 +14,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
   alias Pleroma.Web.PleromaAPI.ChatMessageView
   alias Pleroma.Web.PleromaAPI.ChatView
 
+  import Pleroma.Web.ActivityPub.ObjectValidator, only: [stringify_keys: 1]
+
   import Ecto.Query
 
   # TODO
@@ -29,12 +31,16 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
     %{scopes: ["read:statuses"]} when action in [:messages, :index]
   )
 
+  plug(OpenApiSpex.Plug.CastAndValidate)
+
   defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.ChatOperation
 
-  def post_chat_message(%{assigns: %{user: %{id: user_id} = user}} = conn, %{
-        "id" => id,
-        "content" => content
-      }) do
+  def post_chat_message(
+        %{body_params: %{content: content}, assigns: %{user: %{id: user_id} = user}} = conn,
+        %{
+          id: id
+        }
+      ) do
     with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id),
          %User{} = recipient <- User.get_cached_by_ap_id(chat.recipient),
          {:ok, activity} <- CommonAPI.post_chat_message(user, recipient, content),
@@ -45,7 +51,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
     end
   end
 
-  def messages(%{assigns: %{user: %{id: user_id} = user}} = conn, %{"id" => id} = params) 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,
@@ -66,7 +72,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
               ^[user.ap_id]
             )
         )
-        |> Pagination.fetch_paginated(params)
+        |> Pagination.fetch_paginated(params |> stringify_keys())
 
       conn
       |> put_view(ChatMessageView)
@@ -85,7 +91,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
         where: c.user_id == ^user_id,
         order_by: [desc: c.updated_at]
       )
-      |> Pagination.fetch_paginated(params)
+      |> Pagination.fetch_paginated(params |> stringify_keys)
 
     conn
     |> put_view(ChatView)
@@ -93,7 +99,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
   end
 
   def create(%{assigns: %{user: user}} = conn, params) do
-    recipient = params["ap_id"] |> URI.decode_www_form()
+    recipient = params[:ap_id]
 
     with {:ok, %Chat{} = chat} <- Chat.get_or_create(user.id, recipient) do
       conn
index 52a34d23f9f6fd6a66f20940db31da26f8d05d9f..84610e51101771b3a60a6d5a25634dc05a5af04a 100644 (file)
@@ -25,6 +25,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do
 
       result =
         conn
+        |> put_req_header("content-type", "application/json")
         |> post("/api/v1/pleroma/chats/#{chat.id}/messages", %{"content" => "Hallo!!"})
         |> json_response(200)
 
@@ -56,7 +57,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do
 
       result =
         conn
-        |> get("/api/v1/pleroma/chats/#{chat.id}/messages", %{"max_id" => List.last(result)["id"]})
+        |> get("/api/v1/pleroma/chats/#{chat.id}/messages?max_id=#{List.last(result)["id"]}")
         |> json_response(200)
 
       assert length(result) == 10
@@ -132,7 +133,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do
 
       result =
         conn
-        |> get("/api/v1/pleroma/chats", %{max_id: List.last(result)["id"]})
+        |> get("/api/v1/pleroma/chats?max_id=#{List.last(result)["id"]}")
         |> json_response(200)
 
       assert length(result) == 10