forked from AkkomaGang/akkoma
Add virtual :thread_muted? field
that may be set when fetching activities
This commit is contained in:
parent
b30b51c3b7
commit
eb02edcad9
6 changed files with 61 additions and 3 deletions
|
@ -10,6 +10,7 @@ defmodule Pleroma.Activity do
|
||||||
alias Pleroma.Notification
|
alias Pleroma.Notification
|
||||||
alias Pleroma.Object
|
alias Pleroma.Object
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
|
alias Pleroma.ThreadMute
|
||||||
alias Pleroma.User
|
alias Pleroma.User
|
||||||
|
|
||||||
import Ecto.Changeset
|
import Ecto.Changeset
|
||||||
|
@ -37,6 +38,7 @@ defmodule Pleroma.Activity do
|
||||||
field(:local, :boolean, default: true)
|
field(:local, :boolean, default: true)
|
||||||
field(:actor, :string)
|
field(:actor, :string)
|
||||||
field(:recipients, {:array, :string}, default: [])
|
field(:recipients, {:array, :string}, default: [])
|
||||||
|
field(:thread_muted?, :boolean, virtual: true)
|
||||||
# This is a fake relation, do not use outside of with_preloaded_bookmark/get_bookmark
|
# This is a fake relation, do not use outside of with_preloaded_bookmark/get_bookmark
|
||||||
has_one(:bookmark, Bookmark)
|
has_one(:bookmark, Bookmark)
|
||||||
has_many(:notifications, Notification, on_delete: :delete_all)
|
has_many(:notifications, Notification, on_delete: :delete_all)
|
||||||
|
@ -90,6 +92,16 @@ def with_preloaded_bookmark(query, %User{} = user) do
|
||||||
|
|
||||||
def with_preloaded_bookmark(query, _), do: query
|
def with_preloaded_bookmark(query, _), do: query
|
||||||
|
|
||||||
|
def with_set_thread_muted_field(query, %User{} = user) do
|
||||||
|
from([a] in query,
|
||||||
|
left_join: tm in ThreadMute,
|
||||||
|
on: tm.user_id == ^user.id and tm.context == fragment("?->>'context'", a.data),
|
||||||
|
select: %Activity{a | thread_muted?: not is_nil(tm.id)}
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
def with_set_thread_muted_field(query, _), do: query
|
||||||
|
|
||||||
def get_by_ap_id(ap_id) do
|
def get_by_ap_id(ap_id) do
|
||||||
Repo.one(
|
Repo.one(
|
||||||
from(
|
from(
|
||||||
|
|
|
@ -834,6 +834,13 @@ defp maybe_preload_bookmarks(query, opts) do
|
||||||
|> Activity.with_preloaded_bookmark(opts["user"])
|
|> Activity.with_preloaded_bookmark(opts["user"])
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp maybe_set_thread_muted_field(query, %{"skip_preload" => true}), do: query
|
||||||
|
|
||||||
|
defp maybe_set_thread_muted_field(query, opts) do
|
||||||
|
query
|
||||||
|
|> Activity.with_set_thread_muted_field(opts["user"])
|
||||||
|
end
|
||||||
|
|
||||||
defp maybe_order(query, %{order: :desc}) do
|
defp maybe_order(query, %{order: :desc}) do
|
||||||
query
|
query
|
||||||
|> order_by(desc: :id)
|
|> order_by(desc: :id)
|
||||||
|
@ -852,6 +859,7 @@ def fetch_activities_query(recipients, opts \\ %{}) do
|
||||||
base_query
|
base_query
|
||||||
|> maybe_preload_objects(opts)
|
|> maybe_preload_objects(opts)
|
||||||
|> maybe_preload_bookmarks(opts)
|
|> maybe_preload_bookmarks(opts)
|
||||||
|
|> maybe_set_thread_muted_field(opts)
|
||||||
|> maybe_order(opts)
|
|> maybe_order(opts)
|
||||||
|> restrict_recipients(recipients, opts["user"])
|
|> restrict_recipients(recipients, opts["user"])
|
||||||
|> restrict_tag(opts)
|
|> restrict_tag(opts)
|
||||||
|
|
|
@ -157,6 +157,12 @@ def render("status.json", %{activity: %{data: %{"object" => _object}} = activity
|
||||||
|
|
||||||
bookmarked = Activity.get_bookmark(activity, opts[:for]) != nil
|
bookmarked = Activity.get_bookmark(activity, opts[:for]) != nil
|
||||||
|
|
||||||
|
thread_muted? =
|
||||||
|
case activity.thread_muted? do
|
||||||
|
thread_muted? when is_boolean(thread_muted?) -> thread_muted?
|
||||||
|
nil -> CommonAPI.thread_muted?(user, activity)
|
||||||
|
end
|
||||||
|
|
||||||
attachment_data = object.data["attachment"] || []
|
attachment_data = object.data["attachment"] || []
|
||||||
attachments = render_many(attachment_data, StatusView, "attachment.json", as: :attachment)
|
attachments = render_many(attachment_data, StatusView, "attachment.json", as: :attachment)
|
||||||
|
|
||||||
|
@ -228,7 +234,7 @@ def render("status.json", %{activity: %{data: %{"object" => _object}} = activity
|
||||||
reblogged: reblogged?(activity, opts[:for]),
|
reblogged: reblogged?(activity, opts[:for]),
|
||||||
favourited: present?(favorited),
|
favourited: present?(favorited),
|
||||||
bookmarked: present?(bookmarked),
|
bookmarked: present?(bookmarked),
|
||||||
muted: CommonAPI.thread_muted?(user, activity) || User.mutes?(opts[:for], user),
|
muted: thread_muted? || User.mutes?(opts[:for], user),
|
||||||
pinned: pinned?(activity, user),
|
pinned: pinned?(activity, user),
|
||||||
sensitive: sensitive,
|
sensitive: sensitive,
|
||||||
spoiler_text: summary_html,
|
spoiler_text: summary_html,
|
||||||
|
|
|
@ -284,6 +284,12 @@ def render(
|
||||||
Pleroma.Web.RichMedia.Helpers.fetch_data_for_activity(activity)
|
Pleroma.Web.RichMedia.Helpers.fetch_data_for_activity(activity)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
thread_muted? =
|
||||||
|
case activity.thread_muted? do
|
||||||
|
thread_muted? when is_boolean(thread_muted?) -> thread_muted?
|
||||||
|
nil -> CommonAPI.thread_muted?(user, activity)
|
||||||
|
end
|
||||||
|
|
||||||
%{
|
%{
|
||||||
"id" => activity.id,
|
"id" => activity.id,
|
||||||
"uri" => object.data["id"],
|
"uri" => object.data["id"],
|
||||||
|
@ -314,7 +320,7 @@ def render(
|
||||||
"summary" => summary,
|
"summary" => summary,
|
||||||
"summary_html" => summary |> Formatter.emojify(object.data["emoji"]),
|
"summary_html" => summary |> Formatter.emojify(object.data["emoji"]),
|
||||||
"card" => card,
|
"card" => card,
|
||||||
"muted" => CommonAPI.thread_muted?(user, activity) || User.mutes?(opts[:for], user)
|
"muted" => thread_muted? || User.mutes?(opts[:for], user)
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ defmodule Pleroma.ActivityTest do
|
||||||
use Pleroma.DataCase
|
use Pleroma.DataCase
|
||||||
alias Pleroma.Activity
|
alias Pleroma.Activity
|
||||||
alias Pleroma.Bookmark
|
alias Pleroma.Bookmark
|
||||||
|
alias Pleroma.ThreadMute
|
||||||
import Pleroma.Factory
|
import Pleroma.Factory
|
||||||
|
|
||||||
test "returns an activity by it's AP id" do
|
test "returns an activity by it's AP id" do
|
||||||
|
@ -47,6 +48,31 @@ test "preloading a bookmark" do
|
||||||
assert queried_activity.bookmark == bookmark3
|
assert queried_activity.bookmark == bookmark3
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "setting thread_muted?" do
|
||||||
|
activity = insert(:note_activity)
|
||||||
|
user = insert(:user)
|
||||||
|
annoyed_user = insert(:user)
|
||||||
|
{:ok, _} = ThreadMute.add_mute(annoyed_user.id, activity.data["context"])
|
||||||
|
|
||||||
|
activity_with_unset_thread_muted_field =
|
||||||
|
Ecto.Query.from(Activity)
|
||||||
|
|> Repo.one()
|
||||||
|
|
||||||
|
activity_for_user =
|
||||||
|
Ecto.Query.from(Activity)
|
||||||
|
|> Activity.with_set_thread_muted_field(user)
|
||||||
|
|> Repo.one()
|
||||||
|
|
||||||
|
activity_for_annoyed_user =
|
||||||
|
Ecto.Query.from(Activity)
|
||||||
|
|> Activity.with_set_thread_muted_field(annoyed_user)
|
||||||
|
|> Repo.one()
|
||||||
|
|
||||||
|
assert activity_with_unset_thread_muted_field.thread_muted? == nil
|
||||||
|
assert activity_for_user.thread_muted? == false
|
||||||
|
assert activity_for_annoyed_user.thread_muted? == true
|
||||||
|
end
|
||||||
|
|
||||||
describe "getting a bookmark" do
|
describe "getting a bookmark" do
|
||||||
test "when association is loaded" do
|
test "when association is loaded" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
|
@ -902,7 +902,7 @@ test "hide a user's statuses from timelines and notifications" do
|
||||||
|
|
||||||
assert [activity] == ActivityPub.fetch_public_activities(%{}) |> Repo.preload(:bookmark)
|
assert [activity] == ActivityPub.fetch_public_activities(%{}) |> Repo.preload(:bookmark)
|
||||||
|
|
||||||
assert [activity] ==
|
assert [%{activity | thread_muted?: CommonAPI.thread_muted?(user2, activity)}] ==
|
||||||
ActivityPub.fetch_activities([user2.ap_id | user2.following], %{"user" => user2})
|
ActivityPub.fetch_activities([user2.ap_id | user2.following], %{"user" => user2})
|
||||||
|
|
||||||
{:ok, _user} = User.deactivate(user)
|
{:ok, _user} = User.deactivate(user)
|
||||||
|
|
Loading…
Reference in a new issue