diff options
author | lain <lain@soykaf.club> | 2020-06-07 15:38:33 +0200 |
---|---|---|
committer | lain <lain@soykaf.club> | 2020-06-07 15:38:33 +0200 |
commit | 801e668a97adff4a33451dd7bb48799562ed8796 (patch) | |
tree | 414a1da874261e9ea1c0290428daaf8fa4831952 /lib | |
parent | 2cdaac433035d8df3890eae098b55380b9e1c9fc (diff) | |
download | pleroma-801e668a97adff4a33451dd7bb48799562ed8796.tar.gz |
ChatController: Add `last_read_id` option to mark_as_read.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/chat/message_reference.ex | 20 | ||||
-rw-r--r-- | lib/pleroma/web/api_spec/operations/chat_operation.ex | 18 | ||||
-rw-r--r-- | lib/pleroma/web/pleroma_api/controllers/chat_controller.ex | 3 |
3 files changed, 34 insertions, 7 deletions
diff --git a/lib/pleroma/chat/message_reference.ex b/lib/pleroma/chat/message_reference.ex index 7ee7508ca..131ae0186 100644 --- a/lib/pleroma/chat/message_reference.ex +++ b/lib/pleroma/chat/message_reference.ex @@ -98,12 +98,20 @@ defmodule Pleroma.Chat.MessageReference do |> Repo.update() end - def set_all_seen_for_chat(chat) do - chat - |> for_chat_query() - |> exclude(:order_by) - |> exclude(:preload) - |> where([cmr], cmr.unread == true) + def set_all_seen_for_chat(chat, last_read_id \\ nil) do + query = + chat + |> for_chat_query() + |> exclude(:order_by) + |> exclude(:preload) + |> where([cmr], cmr.unread == true) + + if last_read_id do + query + |> where([cmr], cmr.id <= ^last_read_id) + else + query + end |> Repo.update_all(set: [unread: false]) end end diff --git a/lib/pleroma/web/api_spec/operations/chat_operation.ex b/lib/pleroma/web/api_spec/operations/chat_operation.ex index 74c3ad0bd..45fbad311 100644 --- a/lib/pleroma/web/api_spec/operations/chat_operation.ex +++ b/lib/pleroma/web/api_spec/operations/chat_operation.ex @@ -23,6 +23,7 @@ defmodule Pleroma.Web.ApiSpec.ChatOperation do summary: "Mark all messages in the chat as read", operationId: "ChatController.mark_as_read", parameters: [Operation.parameter(:id, :path, :string, "The ID of the Chat")], + requestBody: request_body("Parameters", mark_as_read()), responses: %{ 200 => Operation.response( @@ -333,4 +334,21 @@ defmodule Pleroma.Web.ApiSpec.ChatOperation do } } end + + def mark_as_read do + %Schema{ + title: "MarkAsReadRequest", + description: "POST body for marking a number of chat messages as read", + type: :object, + properties: %{ + last_read_id: %Schema{ + type: :string, + description: "The content of your message. Optional." + } + }, + example: %{ + "last_read_id" => "abcdef12456" + } + } + end end diff --git a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex index 983550b13..002b75082 100644 --- a/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/chat_controller.ex @@ -111,7 +111,8 @@ defmodule Pleroma.Web.PleromaAPI.ChatController do def mark_as_read(%{assigns: %{user: %{id: user_id}}} = conn, %{id: id}) do with %Chat{} = chat <- Repo.get_by(Chat, id: id, user_id: user_id), - {_n, _} <- MessageReference.set_all_seen_for_chat(chat) do + {_n, _} <- + MessageReference.set_all_seen_for_chat(chat, conn.body_params[:last_read_id]) do conn |> put_view(ChatView) |> render("show.json", chat: chat) |