summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlain <lain@soykaf.club>2020-06-05 12:01:33 +0200
committerlain <lain@soykaf.club>2020-06-05 12:01:33 +0200
commitcc8a7dc205a4516452c48659e6bf081f3f730496 (patch)
tree51e8e382cef023acc6500966c48f2c239d21ada3
parentaa2ac76510d95f2412e23f3739e8e1ae4402643f (diff)
SideEffects / ChatView: Add an unread cache.
This is to prevent wrong values in the stream.
-rw-r--r--lib/pleroma/web/activity_pub/side_effects.ex5
-rw-r--r--lib/pleroma/web/pleroma_api/views/chat_view.ex2
-rw-r--r--lib/pleroma/web/streamer/streamer.ex28
-rw-r--r--lib/pleroma/web/views/streamer_view.ex2
-rw-r--r--test/web/pleroma_api/views/chat_view_test.exs15
5 files changed, 30 insertions, 22 deletions
diff --git a/lib/pleroma/web/activity_pub/side_effects.ex b/lib/pleroma/web/activity_pub/side_effects.ex
index e9f109d80..992c04ac1 100644
--- a/lib/pleroma/web/activity_pub/side_effects.ex
+++ b/lib/pleroma/web/activity_pub/side_effects.ex
@@ -142,6 +142,11 @@ defmodule Pleroma.Web.ActivityPub.SideEffects do
{:ok, chat} = Chat.bump_or_create(user.id, other_user.ap_id)
{:ok, cm_ref} = ChatMessageReference.create(chat, object, user.ap_id != actor.ap_id)
+ # We add a cache of the unread value here so that it doesn't change when being streamed out
+ chat =
+ chat
+ |> Map.put(:unread, ChatMessageReference.unread_count_for_chat(chat))
+
Streamer.stream(
["user", "user:pleroma_chat"],
{user, %{cm_ref | chat: chat, object: object}}
diff --git a/lib/pleroma/web/pleroma_api/views/chat_view.ex b/lib/pleroma/web/pleroma_api/views/chat_view.ex
index c903a71fd..91d50dd1e 100644
--- a/lib/pleroma/web/pleroma_api/views/chat_view.ex
+++ b/lib/pleroma/web/pleroma_api/views/chat_view.ex
@@ -20,7 +20,7 @@ defmodule Pleroma.Web.PleromaAPI.ChatView do
%{
id: chat.id |> to_string(),
account: AccountView.render("show.json", Map.put(opts, :user, recipient)),
- unread: ChatMessageReference.unread_count_for_chat(chat),
+ unread: Map.get(chat, :unread) || ChatMessageReference.unread_count_for_chat(chat),
last_message:
last_message &&
ChatMessageReferenceView.render("show.json", chat_message_reference: last_message),
diff --git a/lib/pleroma/web/streamer/streamer.ex b/lib/pleroma/web/streamer/streamer.ex
index 5e37e2cf2..b22297955 100644
--- a/lib/pleroma/web/streamer/streamer.ex
+++ b/lib/pleroma/web/streamer/streamer.ex
@@ -90,34 +90,20 @@ defmodule Pleroma.Web.Streamer do
if should_env_send?(), do: Registry.unregister(@registry, topic)
end
- def stream(topics, item) when is_list(topics) do
+ def stream(topics, items) do
if should_env_send?() do
- Enum.each(topics, fn t ->
- spawn(fn -> do_stream(t, item) end)
+ List.wrap(topics)
+ |> Enum.each(fn topic ->
+ List.wrap(items)
+ |> Enum.each(fn item ->
+ spawn(fn -> do_stream(topic, item) end)
+ end)
end)
end
:ok
end
- def stream(topic, items) when is_list(items) do
- if should_env_send?() do
- Enum.each(items, fn i ->
- spawn(fn -> do_stream(topic, i) end)
- end)
-
- :ok
- end
- end
-
- def stream(topic, item) do
- if should_env_send?() do
- spawn(fn -> do_stream(topic, item) end)
- end
-
- :ok
- end
-
def filtered_by_user?(%User{} = user, %Activity{} = item) do
%{block: blocked_ap_ids, mute: muted_ap_ids, reblog_mute: reblog_muted_ap_ids} =
User.outgoing_relationships_ap_ids(user, [:block, :mute, :reblog_mute])
diff --git a/lib/pleroma/web/views/streamer_view.ex b/lib/pleroma/web/views/streamer_view.ex
index a6efd0109..b000e7ce0 100644
--- a/lib/pleroma/web/views/streamer_view.ex
+++ b/lib/pleroma/web/views/streamer_view.ex
@@ -55,6 +55,8 @@ defmodule Pleroma.Web.StreamerView do
# Explicitly giving the cmr for the object here, so we don't accidentally
# send a later 'last_message' that was inserted between inserting this and
# streaming it out
+ #
+ # It also contains the chat with a cache of the correct unread count
Logger.debug("Trying to stream out #{inspect(cm_ref)}")
representation =
diff --git a/test/web/pleroma_api/views/chat_view_test.exs b/test/web/pleroma_api/views/chat_view_test.exs
index f3bd12616..f77584dd1 100644
--- a/test/web/pleroma_api/views/chat_view_test.exs
+++ b/test/web/pleroma_api/views/chat_view_test.exs
@@ -16,6 +16,21 @@ defmodule Pleroma.Web.PleromaAPI.ChatViewTest do
import Pleroma.Factory
+ test "giving a chat with an 'unread' field, it uses that" do
+ user = insert(:user)
+ recipient = insert(:user)
+
+ {:ok, chat} = Chat.get_or_create(user.id, recipient.ap_id)
+
+ chat =
+ chat
+ |> Map.put(:unread, 5)
+
+ represented_chat = ChatView.render("show.json", chat: chat)
+
+ assert represented_chat[:unread] == 5
+ end
+
test "it represents a chat" do
user = insert(:user)
recipient = insert(:user)