diff options
author | eugenijm <eugenijm@protonmail.com> | 2019-10-25 21:29:23 +0300 |
---|---|---|
committer | eugenijm <eugenijm@protonmail.com> | 2019-10-26 02:29:18 +0300 |
commit | 058065448510af59f550ec7d7f99b81388bc7a40 (patch) | |
tree | ebfab2d6e509637607f8c42839abd1c15c0bc5d6 /lib | |
parent | 653054d301b88070cd60f6b0f8a0b188dee81cba (diff) | |
download | pleroma-058065448510af59f550ec7d7f99b81388bc7a40.tar.gz |
Mark the conversations with the blocked user as read and update the blocking user's `unread_conversation_count`.
Since the conversations with the blocked user are invisible, they are excluded
from the blocking user's `unread_conversation_count`.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/conversation.ex | 8 | ||||
-rw-r--r-- | lib/pleroma/conversation/participation.ex | 38 | ||||
-rw-r--r-- | lib/pleroma/user.ex | 6 | ||||
-rw-r--r-- | lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex | 2 |
4 files changed, 44 insertions, 10 deletions
diff --git a/lib/pleroma/conversation.ex b/lib/pleroma/conversation.ex index 098016af2..ade3a526a 100644 --- a/lib/pleroma/conversation.ex +++ b/lib/pleroma/conversation.ex @@ -67,7 +67,13 @@ defmodule Pleroma.Conversation do participations = Enum.map(users, fn user -> - User.increment_unread_conversation_count(conversation, user) + invisible_conversation = Enum.any?(users, &User.blocks?(user, &1)) + + unless invisible_conversation do + User.increment_unread_conversation_count(conversation, user) + end + + opts = Keyword.put(opts, :invisible_conversation, invisible_conversation) {:ok, participation} = Participation.create_for_user_and_conversation(user, conversation, opts) diff --git a/lib/pleroma/conversation/participation.ex b/lib/pleroma/conversation/participation.ex index 41918fa78..176b82a20 100644 --- a/lib/pleroma/conversation/participation.ex +++ b/lib/pleroma/conversation/participation.ex @@ -32,11 +32,20 @@ defmodule Pleroma.Conversation.Participation do def create_for_user_and_conversation(user, conversation, opts \\ []) do read = !!opts[:read] + invisible_conversation = !!opts[:invisible_conversation] + + update_on_conflict = + if(invisible_conversation, do: [], else: [read: read]) + |> Keyword.put(:updated_at, NaiveDateTime.utc_now()) %__MODULE__{} - |> creation_cng(%{user_id: user.id, conversation_id: conversation.id, read: read}) + |> creation_cng(%{ + user_id: user.id, + conversation_id: conversation.id, + read: invisible_conversation || read + }) |> Repo.insert( - on_conflict: [set: [read: read, updated_at: NaiveDateTime.utc_now()]], + on_conflict: [set: update_on_conflict], returning: true, conflict_target: [:user_id, :conversation_id] ) @@ -69,7 +78,26 @@ defmodule Pleroma.Conversation.Participation do end end - def mark_all_as_read(user) do + def mark_all_as_read(%User{local: true} = user, %User{} = target_user) do + target_conversation_ids = + __MODULE__ + |> where([p], p.user_id == ^target_user.id) + |> select([p], p.conversation_id) + |> Repo.all() + + __MODULE__ + |> where([p], p.user_id == ^user.id) + |> where([p], p.conversation_id in ^target_conversation_ids) + |> update([p], set: [read: true]) + |> Repo.update_all([]) + + {:ok, user} = User.set_unread_conversation_count(user) + {:ok, user, []} + end + + def mark_all_as_read(%User{} = user, %User{}), do: {:ok, user, []} + + def mark_all_as_read(%User{} = user) do {_, participations} = __MODULE__ |> where([p], p.user_id == ^user.id) @@ -78,8 +106,8 @@ defmodule Pleroma.Conversation.Participation do |> select([p], p) |> Repo.update_all([]) - User.set_unread_conversation_count(user) - {:ok, participations} + {:ok, user} = User.set_unread_conversation_count(user) + {:ok, user, participations} end def mark_as_unread(participation) do diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index b99e236a4..5d3f55721 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -971,7 +971,7 @@ defmodule Pleroma.User do end end - def set_unread_conversation_count(_), do: :noop + def set_unread_conversation_count(user), do: {:ok, user} def increment_unread_conversation_count(conversation, %User{local: true} = user) do unread_query = @@ -993,7 +993,7 @@ defmodule Pleroma.User do end end - def increment_unread_conversation_count(_, _), do: :noop + def increment_unread_conversation_count(_, user), do: {:ok, user} def remove_duplicated_following(%User{following: following} = user) do uniq_following = Enum.uniq(following) @@ -1077,7 +1077,7 @@ defmodule Pleroma.User do if following?(blocked, blocker), do: unfollow(blocked, blocker) {:ok, blocker} = update_follower_count(blocker) - + {:ok, blocker, _} = Participation.mark_all_as_read(blocker, blocked) add_to_block(blocker, ap_id) end diff --git a/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex b/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex index fc39abf05..651a99423 100644 --- a/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex +++ b/lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex @@ -80,7 +80,7 @@ defmodule Pleroma.Web.PleromaAPI.PleromaAPIController do end def read_conversations(%{assigns: %{user: user}} = conn, _params) do - with {:ok, participations} <- Participation.mark_all_as_read(user) do + with {:ok, _, participations} <- Participation.mark_all_as_read(user) do conn |> add_link_headers(participations) |> put_view(ConversationView) |