diff options
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/object/fetcher.ex | 9 | ||||
| -rw-r--r-- | lib/pleroma/user.ex | 54 | ||||
| -rw-r--r-- | lib/pleroma/web/pleroma_api/controllers/pleroma_api_controller.ex | 2 | 
5 files changed, 53 insertions, 58 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/object/fetcher.ex b/lib/pleroma/object/fetcher.ex index 7758cb90b..441ae8b65 100644 --- a/lib/pleroma/object/fetcher.ex +++ b/lib/pleroma/object/fetcher.ex @@ -90,6 +90,9 @@ defmodule Pleroma.Object.Fetcher do        {:fetch_object, %Object{} = object} ->          {:ok, object} +      {:fetch, {:error, error}} -> +        {:error, error} +        e ->          e      end @@ -110,6 +113,9 @@ defmodule Pleroma.Object.Fetcher do      with {:ok, object} <- fetch_object_from_id(id, options) do        object      else +      {:error, %Tesla.Mock.Error{}} -> +        nil +        e ->          Logger.error("Error while fetching #{id}: #{inspect(e)}")          nil @@ -170,6 +176,9 @@ defmodule Pleroma.Object.Fetcher do        {:scheme, _} ->          {:error, "Unsupported URI scheme"} +      {:error, e} -> +        {:error, e} +        e ->          {:error, e}      end diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex index 7bef6e281..5d3f55721 100644 --- a/lib/pleroma/user.ex +++ b/lib/pleroma/user.ex @@ -224,54 +224,6 @@ defmodule Pleroma.User do      |> Repo.aggregate(:count, :id)    end -  @info_fields [ -    :banner, -    :background, -    :source_data, -    :note_count, -    :follower_count, -    :following_count, -    :locked, -    :confirmation_pending, -    :password_reset_pending, -    :confirmation_token, -    :default_scope, -    :blocks, -    :domain_blocks, -    :mutes, -    :muted_reblogs, -    :muted_notifications, -    :subscribers, -    :deactivated, -    :no_rich_text, -    :ap_enabled, -    :is_moderator, -    :is_admin, -    :show_role, -    :settings, -    :magic_key, -    :uri, -    :hide_followers_count, -    :hide_follows_count, -    :hide_followers, -    :hide_follows, -    :hide_favorites, -    :unread_conversation_count, -    :pinned_activities, -    :email_notifications, -    :mascot, -    :emoji, -    :pleroma_settings_store, -    :fields, -    :raw_fields, -    :discoverable, -    :invisible, -    :skip_thread_containment, -    :notification_settings -  ] - -  def info_fields, do: @info_fields -    defp truncate_fields_param(params) do      if Map.has_key?(params, :fields) do        Map.put(params, :fields, Enum.map(params[:fields], &truncate_field/1)) @@ -1019,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 = @@ -1041,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) @@ -1125,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) | 
