aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlain <lain@soykaf.club>2020-05-12 13:13:03 +0200
committerlain <lain@soykaf.club>2020-05-12 13:13:03 +0200
commitb5aa204eb8bf3f737d3d807a9924c0153d1b6d3e (patch)
tree0ebbe58181b58eb18d466f02e98a2e7726c6d8d7
parentf28ed36b4daf2f7ed2e35b90b07a5b0552b2a2c9 (diff)
downloadpleroma-b5aa204eb8bf3f737d3d807a9924c0153d1b6d3e.tar.gz
ChatController: Support deletion of chat messages.
-rw-r--r--lib/pleroma/web/activity_pub/object_validators/delete_validator.ex3
-rw-r--r--lib/pleroma/web/api_spec/operations/chat_operation.ex25
-rw-r--r--lib/pleroma/web/pleroma_api/controllers/chat_controller.ex24
-rw-r--r--lib/pleroma/web/router.ex1
-rw-r--r--test/web/pleroma_api/controllers/chat_controller_test.exs24
5 files changed, 75 insertions, 2 deletions
diff --git a/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex b/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex
index f42c03510..e5d08eb5c 100644
--- a/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex
+++ b/lib/pleroma/web/activity_pub/object_validators/delete_validator.ex
@@ -46,12 +46,13 @@ defmodule Pleroma.Web.ActivityPub.ObjectValidators.DeleteValidator do
Answer
Article
Audio
+ ChatMessage
Event
Note
Page
Question
- Video
Tombstone
+ Video
}
def validate_data(cng) do
cng
diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex
index fe6c2f52f..8ba10c603 100644
--- a/lib/pleroma/web/api_spec/operations/chat_operation.ex
+++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex
@@ -166,6 +166,31 @@ defmodule Pleroma.Web.ApiSpec.ChatOperation do
}
end
+ def delete_message_operation do
+ %Operation{
+ tags: ["chat"],
+ summary: "delete_message",
+ operationId: "ChatController.delete_message",
+ parameters: [
+ Operation.parameter(:id, :path, :string, "The ID of the Chat"),
+ Operation.parameter(:message_id, :path, :string, "The ID of the message")
+ ],
+ responses: %{
+ 200 =>
+ Operation.response(
+ "The deleted ChatMessage",
+ "application/json",
+ ChatMessage
+ )
+ },
+ security: [
+ %{
+ "oAuth" => ["write"]
+ }
+ ]
+ }
+ end
+
def chats_response do
%Schema{
title: "ChatsResponse",
diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
index 04f136dcd..8eed88752 100644
--- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
+++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
@@ -4,6 +4,7 @@
defmodule Pleroma.Web.PleromaAPI.ChatController do
use Pleroma.Web, :controller
+ alias Pleroma.Activity
alias Pleroma.Chat
alias Pleroma.Object
alias Pleroma.Pagination
@@ -22,7 +23,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
plug(
OAuthScopesPlug,
- %{scopes: ["write:statuses"]} when action in [:post_chat_message, :create, :mark_as_read]
+ %{scopes: ["write:statuses"]}
+ when action in [:post_chat_message, :create, :mark_as_read, :delete_message]
)
plug(
@@ -34,6 +36,26 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.ChatOperation
+ def delete_message(%{assigns: %{user: %{ap_id: actor} = user}} = conn, %{
+ message_id: id
+ }) do
+ with %Object{
+ data: %{
+ "actor" => ^actor,
+ "id" => object,
+ "to" => [recipient],
+ "type" => "ChatMessage"
+ }
+ } = message <- Object.get_by_id(id),
+ %Chat{} = chat <- Chat.get(user.id, recipient),
+ %Activity{} = activity <- Activity.get_create_by_object_ap_id(object),
+ {:ok, _delete} <- CommonAPI.delete(activity.id, user) do
+ conn
+ |> put_view(ChatMessageView)
+ |> render("show.json", for: user, object: message, chat: chat)
+ end
+ end
+
def post_chat_message(
%{body_params: %{content: content} = params, assigns: %{user: %{id: user_id} = user}} =
conn,
diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex
index 3b1834d97..0e4f45869 100644
--- a/lib/pleroma/web/router.ex
+++ b/lib/pleroma/web/router.ex
@@ -310,6 +310,7 @@ defmodule Pleroma.Web.Router do
get("/chats/:id", ChatController, :show)
get("/chats/:id/messages", ChatController, :messages)
post("/chats/:id/messages", ChatController, :post_chat_message)
+ delete("/chats/:id/messages/:message_id", ChatController, :delete_message)
post("/chats/:id/read", ChatController, :mark_as_read)
end
diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs
index dda4f9e5b..86ccbb117 100644
--- a/test/web/pleroma_api/controllers/chat_controller_test.exs
+++ b/test/web/pleroma_api/controllers/chat_controller_test.exs
@@ -4,6 +4,7 @@
defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do
use Pleroma.Web.ConnCase, async: true
+ alias Pleroma.Object
alias Pleroma.Chat
alias Pleroma.Web.ActivityPub.ActivityPub
alias Pleroma.Web.CommonAPI
@@ -78,6 +79,29 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do
end
end
+ describe "DELETE /api/v1/pleroma/chats/:id/messages/:message_id" do
+ setup do: oauth_access(["write:statuses"])
+
+ test "it deletes a message for the author of the message", %{conn: conn, user: user} do
+ recipient = insert(:user)
+
+ {:ok, message} =
+ CommonAPI.post_chat_message(user, recipient, "Hello darkness my old friend")
+
+ object = Object.normalize(message, false)
+
+ chat = Chat.get(user.id, recipient.ap_id)
+
+ result =
+ conn
+ |> put_req_header("content-type", "application/json")
+ |> delete("/api/v1/pleroma/chats/#{chat.id}/messages/#{object.id}")
+ |> json_response_and_validate_schema(200)
+
+ assert result["id"] == to_string(object.id)
+ end
+ end
+
describe "GET /api/v1/pleroma/chats/:id/messages" do
setup do: oauth_access(["read:statuses"])