aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md1
-rw-r--r--docs/development/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/pleroma/web/pleroma_api/controllers/chat_controller_test.exs18
6 files changed, 66 insertions, 1 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index ecefba381..bc87adcfd 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -15,6 +15,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
### Added
- `activeMonth` and `activeHalfyear` fields in NodeInfo usage.users object
+- Pleroma API: Add chat deletion.
### Fixed
- Subscription(Bell) Notifications: Don't create from Pipeline Ingested replies
diff --git a/docs/development/API/chats.md b/docs/development/API/chats.md
index f50144c86..2d488f610 100644
--- a/docs/development/API/chats.md
+++ b/docs/development/API/chats.md
@@ -218,6 +218,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 23cb66392..c8f1e2ee7 100644
--- a/lib/pleroma/web/api_spec/operations/chat_operation.ex
+++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex
@@ -222,6 +222,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: ["Chats"],
diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
index 669d50132..7d634a154 100644
--- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
+++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex
@@ -29,7 +29,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do
:create,
:mark_as_read,
:mark_message_as_read,
- :delete_message
+ :delete_message,
+ :delete
]
)
@@ -42,6 +43,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 fa1d1b93f..7aa66248b 100644
--- a/lib/pleroma/web/router.ex
+++ b/lib/pleroma/web/router.ex
@@ -388,6 +388,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/pleroma/web/pleroma_api/controllers/chat_controller_test.exs b/test/pleroma/web/pleroma_api/controllers/chat_controller_test.exs
index 99b0d43a7..1c0f72583 100644
--- a/test/pleroma/web/pleroma_api/controllers/chat_controller_test.exs
+++ b/test/pleroma/web/pleroma_api/controllers/chat_controller_test.exs
@@ -304,6 +304,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
+
for tested_endpoint <- ["/api/v1/pleroma/chats", "/api/v2/pleroma/chats"] do
describe "GET #{tested_endpoint}" do
setup do: oauth_access(["read:chats"])