Merge branch 'develop' into 'remove-avatar-header'
[akkoma] / lib / pleroma / conversation / participation.ex
index f200c1df56698495f49cac149daeb95a527f238d..5883e4183780ef3e1f32b4d44cb4da60ed0ca4f8 100644 (file)
@@ -22,15 +22,17 @@ defmodule Pleroma.Conversation.Participation do
 
   def creation_cng(struct, params) do
     struct
-    |> cast(params, [:user_id, :conversation_id])
+    |> cast(params, [:user_id, :conversation_id, :read])
     |> validate_required([:user_id, :conversation_id])
   end
 
-  def create_for_user_and_conversation(user, conversation) do
+  def create_for_user_and_conversation(user, conversation, opts \\ []) do
+    read = !!opts[:read]
+
     %__MODULE__{}
-    |> creation_cng(%{user_id: user.id, conversation_id: conversation.id})
+    |> creation_cng(%{user_id: user.id, conversation_id: conversation.id, read: read})
     |> Repo.insert(
-      on_conflict: [set: [read: false, updated_at: NaiveDateTime.utc_now()]],
+      on_conflict: [set: [read: read, updated_at: NaiveDateTime.utc_now()]],
       returning: true,
       conflict_target: [:user_id, :conversation_id]
     )
@@ -57,34 +59,26 @@ defmodule Pleroma.Conversation.Participation do
   def for_user(user, params \\ %{}) do
     from(p in __MODULE__,
       where: p.user_id == ^user.id,
-      order_by: [desc: p.updated_at]
+      order_by: [desc: p.updated_at],
+      preload: [conversation: [:users]]
     )
     |> Pleroma.Pagination.fetch_paginated(params)
-    |> Repo.preload(conversation: [:users])
   end
 
   def for_user_with_last_activity_id(user, params \\ %{}) do
     for_user(user, params)
-    |> Repo.preload(:conversation)
     |> Enum.map(fn participation ->
-      # TODO: Don't load all those activities, just get the most recent
-      # Involves splitting up the query.
-      activities =
-        ActivityPub.fetch_activities_for_context(participation.conversation.ap_id, %{
+      activity_id =
+        ActivityPub.fetch_latest_activity_id_for_context(participation.conversation.ap_id, %{
           "user" => user,
           "blocking_user" => user
         })
 
-      activity_id =
-        case activities do
-          [activity | _] -> activity.id
-          _ -> nil
-        end
-
       %{
         participation
         | last_activity_id: activity_id
       }
     end)
+    |> Enum.filter(& &1.last_activity_id)
   end
 end