ChatMessageReferences: Adjust views
authorlain <lain@soykaf.club>
Wed, 3 Jun 2020 10:49:53 +0000 (12:49 +0200)
committerlain <lain@soykaf.club>
Wed, 3 Jun 2020 10:49:53 +0000 (12:49 +0200)
lib/pleroma/chat_message_reference.ex
lib/pleroma/web/mastodon_api/views/notification_view.ex
lib/pleroma/web/pleroma_api/views/chat_view.ex
lib/pleroma/web/views/streamer_view.ex
test/web/mastodon_api/views/notification_view_test.exs
test/web/pleroma_api/views/chat_view_test.exs

index e9ca3dfe8fb76a78f02908686a1fc91c2136dae7..6808d13657c9d71e847460250bdecae8f99fc2cb 100644 (file)
@@ -66,6 +66,13 @@ defmodule Pleroma.ChatMessageReference do
     )
   end
 
+  def last_message_for_chat(chat) do
+    chat
+    |> for_chat_query()
+    |> limit(1)
+    |> Repo.one()
+  end
+
   def create(chat, object, seen) do
     params = %{
       chat_id: chat.id,
index af15bba48003140cd126664a1533b7e5a45c0db3..2ae82eb2d7997540c221d666393c2970f9361cf6 100644 (file)
@@ -6,6 +6,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do
   use Pleroma.Web, :view
 
   alias Pleroma.Activity
+  alias Pleroma.ChatMessageReference
   alias Pleroma.Notification
   alias Pleroma.Object
   alias Pleroma.User
@@ -14,7 +15,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do
   alias Pleroma.Web.MastodonAPI.AccountView
   alias Pleroma.Web.MastodonAPI.NotificationView
   alias Pleroma.Web.MastodonAPI.StatusView
-  alias Pleroma.Web.PleromaAPI.ChatMessageView
+  alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView
 
   @parent_types ~w{Like Announce EmojiReact}
 
@@ -138,8 +139,9 @@ defmodule Pleroma.Web.MastodonAPI.NotificationView do
     object = Object.normalize(activity)
     author = User.get_cached_by_ap_id(object.data["actor"])
     chat = Pleroma.Chat.get(reading_user.id, author.ap_id)
-    render_opts = Map.merge(opts, %{object: object, for: reading_user, chat: chat})
-    chat_message_render = ChatMessageView.render("show.json", render_opts)
+    cm_ref = ChatMessageReference.for_chat_and_object(chat, object)
+    render_opts = Map.merge(opts, %{for: reading_user, chat_message_reference: cm_ref})
+    chat_message_render = ChatMessageReferenceView.render("show.json", render_opts)
 
     Map.put(response, :chat_message, chat_message_render)
   end
index 223b6498717f06349deb526098a9981b7f9a8a1e..331c1d2823e7421a4dd8fff26875328992058813 100644 (file)
@@ -6,22 +6,24 @@ defmodule Pleroma.Web.PleromaAPI.ChatView do
   use Pleroma.Web, :view
 
   alias Pleroma.Chat
+  alias Pleroma.ChatMessageReference
   alias Pleroma.User
   alias Pleroma.Web.CommonAPI.Utils
   alias Pleroma.Web.MastodonAPI.AccountView
-  alias Pleroma.Web.PleromaAPI.ChatMessageView
+  alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView
 
   def render("show.json", %{chat: %Chat{} = chat} = opts) do
     recipient = User.get_cached_by_ap_id(chat.recipient)
 
-    last_message = opts[:message] || Chat.last_message_for_chat(chat)
+    last_message = opts[:last_message] || ChatMessageReference.last_message_for_chat(chat)
 
     %{
       id: chat.id |> to_string(),
       account: AccountView.render("show.json", Map.put(opts, :user, recipient)),
       unread: chat.unread,
       last_message:
-        last_message && ChatMessageView.render("show.json", chat: chat, object: last_message),
+        last_message &&
+          ChatMessageReferenceView.render("show.json", chat_message_reference: last_message),
       updated_at: Utils.to_masto_date(chat.updated_at)
     }
   end
index 5e953d7706d6c9ff161966110764edd83d7ada41..616e0c4f24f8c5e1743cfa877f70361eacc105ee 100644 (file)
@@ -7,6 +7,7 @@ defmodule Pleroma.Web.StreamerView do
 
   alias Pleroma.Activity
   alias Pleroma.Chat
+  alias Pleroma.ChatMessageReference
   alias Pleroma.Conversation.Participation
   alias Pleroma.Notification
   alias Pleroma.User
@@ -15,10 +16,15 @@ defmodule Pleroma.Web.StreamerView do
   def render("chat_update.json", object, user, recipients) do
     chat = Chat.get(user.id, hd(recipients -- [user.ap_id]))
 
+    # 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
+    cm_ref = ChatMessageReference.for_chat_and_object(chat, object)
+
     representation =
       Pleroma.Web.PleromaAPI.ChatView.render(
         "show.json",
-        %{message: object, chat: chat}
+        %{last_message: cm_ref, chat: chat}
       )
 
     %{
index 384fe7253940005966a1daa700eecc57f5dd2a02..c5691341a07cc621aa35f241f7d8e3402d6aa728 100644 (file)
@@ -7,6 +7,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
 
   alias Pleroma.Activity
   alias Pleroma.Chat
+  alias Pleroma.ChatMessageReference
   alias Pleroma.Notification
   alias Pleroma.Object
   alias Pleroma.Repo
@@ -16,7 +17,7 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
   alias Pleroma.Web.MastodonAPI.AccountView
   alias Pleroma.Web.MastodonAPI.NotificationView
   alias Pleroma.Web.MastodonAPI.StatusView
-  alias Pleroma.Web.PleromaAPI.ChatMessageView
+  alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView
   import Pleroma.Factory
 
   defp test_notifications_rendering(notifications, user, expected_result) do
@@ -44,13 +45,15 @@ defmodule Pleroma.Web.MastodonAPI.NotificationViewTest do
     object = Object.normalize(activity)
     chat = Chat.get(recipient.id, user.ap_id)
 
+    cm_ref = ChatMessageReference.for_chat_and_object(chat, object)
+
     expected = %{
       id: to_string(notification.id),
       pleroma: %{is_seen: false},
       type: "pleroma:chat_mention",
       account: AccountView.render("show.json", %{user: user, for: recipient}),
       chat_message:
-        ChatMessageView.render("show.json", %{object: object, for: recipient, chat: chat}),
+        ChatMessageReferenceView.render("show.json", %{chat_message_reference: cm_ref}),
       created_at: Utils.to_masto_date(notification.inserted_at)
     }
 
index 6062a0cfef122d2e469d510141d63228c8ae0d2e..f3bd12616a5063a2d0ba60c4ae73b3d6d54af4ff 100644 (file)
@@ -6,11 +6,12 @@ defmodule Pleroma.Web.PleromaAPI.ChatViewTest do
   use Pleroma.DataCase
 
   alias Pleroma.Chat
+  alias Pleroma.ChatMessageReference
   alias Pleroma.Object
   alias Pleroma.Web.CommonAPI
   alias Pleroma.Web.CommonAPI.Utils
   alias Pleroma.Web.MastodonAPI.AccountView
-  alias Pleroma.Web.PleromaAPI.ChatMessageView
+  alias Pleroma.Web.PleromaAPI.ChatMessageReferenceView
   alias Pleroma.Web.PleromaAPI.ChatView
 
   import Pleroma.Factory
@@ -39,7 +40,9 @@ defmodule Pleroma.Web.PleromaAPI.ChatViewTest do
 
     represented_chat = ChatView.render("show.json", chat: chat)
 
+    cm_ref = ChatMessageReference.for_chat_and_object(chat, chat_message)
+
     assert represented_chat[:last_message] ==
-             ChatMessageView.render("show.json", chat: chat, object: chat_message)
+             ChatMessageReferenceView.render("show.json", chat_message_reference: cm_ref)
   end
 end