aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md1
-rw-r--r--docs/API/chats.md8
-rw-r--r--lib/pleroma/web/api_spec/operations/chat_operation.ex24
-rw-r--r--lib/pleroma/web/pleroma_api/controllers/chat_controller.ex15
-rw-r--r--lib/pleroma/web/router.ex1
-rw-r--r--test/web/pleroma_api/controllers/chat_controller_test.exs18
6 files changed, 66 insertions, 1 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8fc1750d1..6b0aa5363 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -23,6 +23,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
- Introduced optional dependencies on `ffmpeg`, `ImageMagick`, `exiftool` software packages. Please refer to `docs/installation/optional/media_graphics_packages.md`.
### Added
+- Pleroma API: Add chat deletion.
- Media preview proxy (requires `ffmpeg` and `ImageMagick` to be installed and media proxy to be enabled; see `:media_preview_proxy` config for more details).
- Pleroma API: Importing the mutes users from CSV files.
- Experimental websocket-based federation between Pleroma instances.
diff --git a/docs/API/chats.md b/docs/API/chats.md
index aa6119670..ea65ec7a3 100644
--- a/docs/API/chats.md
+++ b/docs/API/chats.md
@@ -211,6 +211,14 @@ Returned data:
}
```
+### Deleting a chat
+
+Deleting a chat works like this:
+
+`DELETE /api/v1/pleroma/chats/:chat_id`
+
+Returned data is the deleted chat.
+
### Deleting a chat message
Deleting a chat message for given Chat id works like this:
diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex
index 0dcfdb354..1883db7fc 100644
--- a/lib/pleroma/web/api_spec/operations/chat_operation.ex
+++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex
@@ -196,6 +196,30 @@ defmodule Pleroma.Web.ApiSpec.ChatOperation do
}
end
+ def delete_operation do
+ %Operation{
+ tags: ["chat"],
+ summary: "delete",
+ operationId: "ChatController.delete",
+ parameters: [
+ Operation.parameter(:id, :path, :string, "The ID of the Chat")
+ ],
+ responses: %{
+ 200 =>
+ Operation.response(
+ "The deleted Chat",
+ "application/json",
+ Chat
+ )
+ },
+ security: [
+ %{
+ "oAuth" => ["write:chats"]
+ }
+ ]
+ }
+ end
+
def delete_message_operation do
%Operation{
tags: ["chat"],
diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
index e667831c5..231d42c19 100644
--- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
+++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
@@ -30,7 +30,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
:create,
:mark_as_read,
:mark_message_as_read,
- :delete_message
+ :delete_message,
+ :delete
]
)
@@ -43,6 +44,18 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.ChatOperation
+ def delete(%{assigns: %{user: user}} = conn, %{id: chat_id}) do
+ with {:ok, chat} <- Chat.get_by_user_and_id(user, chat_id),
+ {:ok, chat} <- Pleroma.Repo.delete(chat) do
+ conn
+ |> put_view(ChatView)
+ |> render("show.json", chat: chat)
+ else
+ _e ->
+ {:error, :could_not_delete}
+ end
+ end
+
def delete_message(%{assigns: %{user: %{id: user_id} = user}} = conn, %{
message_id: message_id,
id: chat_id
diff --git a/lib/pleroma/web/router.ex b/lib/pleroma/web/router.ex
index e22b31b4c..158281f56 100644
--- a/lib/pleroma/web/router.ex
+++ b/lib/pleroma/web/router.ex
@@ -334,6 +334,7 @@ defmodule Pleroma.Web.Router do
post("/chats/by-account-id/:id", ChatController, :create)
get("/chats", ChatController, :index)
get("/chats/:id", ChatController, :show)
+ delete("/chats/:id", ChatController, :delete)
get("/chats/:id/messages", ChatController, :messages)
post("/chats/:id/messages", ChatController, :post_chat_message)
delete("/chats/:id/messages/:message_id", ChatController, :delete_message)
diff --git a/test/web/pleroma_api/controllers/chat_controller_test.exs b/test/web/pleroma_api/controllers/chat_controller_test.exs
index 11d5ba373..2b3845097 100644
--- a/test/web/pleroma_api/controllers/chat_controller_test.exs
+++ b/test/web/pleroma_api/controllers/chat_controller_test.exs
@@ -301,6 +301,24 @@ defmodule Pleroma.Web.PleromaAPI.ChatControllerTest do
end
end
+ describe "DELETE /api/v1/pleroma/chats/:id" do
+ setup do: oauth_access(["write:chats"])
+
+ test "it deletes a chat", %{conn: conn, user: user} do
+ other_user = insert(:user)
+ {:ok, chat} = Chat.get_or_create(user.id, other_user.ap_id)
+
+ result =
+ conn
+ |> delete("/api/v1/pleroma/chats/#{chat.id}")
+ |> json_response_and_validate_schema(200)
+
+ assert result["id"] == to_string(chat.id)
+
+ refute Chat.get_by_id(chat.id)
+ end
+ end
+
describe "GET /api/v1/pleroma/chats" do
setup do: oauth_access(["read:chats"])