diff options
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | docs/development/API/chats.md | 8 | ||||
-rw-r--r-- | lib/pleroma/web/api_spec/operations/chat_operation.ex | 24 | ||||
-rw-r--r-- | lib/pleroma/web/pleroma_api/controllers/chat_controller.ex | 15 | ||||
-rw-r--r-- | lib/pleroma/web/router.ex | 1 | ||||
-rw-r--r-- | test/pleroma/web/pleroma_api/controllers/chat_controller_test.exs | 18 |
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"]) |