forked from AkkomaGang/akkoma
Reply Filtering: Refactor.
This commit is contained in:
parent
e2f3030c86
commit
d89cd0a197
5 changed files with 69 additions and 77 deletions
|
@ -508,13 +508,13 @@ defp fetch_timelines_with_reply_filtering(user) do
|
||||||
"Public timeline with reply filtering - following" => fn ->
|
"Public timeline with reply filtering - following" => fn ->
|
||||||
public_params
|
public_params
|
||||||
|> Map.put("reply_visibility", "following")
|
|> Map.put("reply_visibility", "following")
|
||||||
|> Map.put("user", user)
|
|> Map.put("reply_filtering_user", user)
|
||||||
|> ActivityPub.fetch_public_activities()
|
|> ActivityPub.fetch_public_activities()
|
||||||
end,
|
end,
|
||||||
"Public timeline with reply filtering - self" => fn ->
|
"Public timeline with reply filtering - self" => fn ->
|
||||||
public_params
|
public_params
|
||||||
|> Map.put("reply_visibility", "self")
|
|> Map.put("reply_visibility", "self")
|
||||||
|> Map.put("user", user)
|
|> Map.put("reply_filtering_user", user)
|
||||||
|> ActivityPub.fetch_public_activities()
|
|> ActivityPub.fetch_public_activities()
|
||||||
end
|
end
|
||||||
},
|
},
|
||||||
|
@ -531,12 +531,19 @@ defp fetch_timelines_with_reply_filtering(user) do
|
||||||
ActivityPub.fetch_activities(recipients, private_params)
|
ActivityPub.fetch_activities(recipients, private_params)
|
||||||
end,
|
end,
|
||||||
"Home timeline with reply filtering - following" => fn ->
|
"Home timeline with reply filtering - following" => fn ->
|
||||||
private_params = Map.put(private_params, "reply_visibility", "following")
|
private_params =
|
||||||
|
private_params
|
||||||
|
|> Map.put("reply_filtering_user", user)
|
||||||
|
|> Map.put("reply_visibility", "following")
|
||||||
|
|
||||||
ActivityPub.fetch_activities(recipients, private_params)
|
ActivityPub.fetch_activities(recipients, private_params)
|
||||||
end,
|
end,
|
||||||
"Home timeline with reply filtering - self" => fn ->
|
"Home timeline with reply filtering - self" => fn ->
|
||||||
private_params = Map.put(private_params, "reply_visibility", "self")
|
private_params =
|
||||||
|
private_params
|
||||||
|
|> Map.put("reply_filtering_user", user)
|
||||||
|
|> Map.put("reply_visibility", "self")
|
||||||
|
|
||||||
ActivityPub.fetch_activities(recipients, private_params)
|
ActivityPub.fetch_activities(recipients, private_params)
|
||||||
end
|
end
|
||||||
},
|
},
|
||||||
|
|
|
@ -44,6 +44,7 @@ defmodule Mix.Tasks.Pleroma.LoadTesting do
|
||||||
]
|
]
|
||||||
|
|
||||||
def run(args) do
|
def run(args) do
|
||||||
|
Logger.configure(level: :error)
|
||||||
Mix.Pleroma.start_pleroma()
|
Mix.Pleroma.start_pleroma()
|
||||||
clean_tables()
|
clean_tables()
|
||||||
{opts, _} = OptionParser.parse!(args, strict: @switches, aliases: @aliases)
|
{opts, _} = OptionParser.parse!(args, strict: @switches, aliases: @aliases)
|
||||||
|
|
|
@ -270,9 +270,9 @@ defp do_create(%{to: to, actor: actor, context: context, object: object} = param
|
||||||
),
|
),
|
||||||
{:ok, activity} <- insert(create_data, local, fake),
|
{:ok, activity} <- insert(create_data, local, fake),
|
||||||
{:fake, false, activity} <- {:fake, fake, activity},
|
{:fake, false, activity} <- {:fake, fake, activity},
|
||||||
{:quick_insert, false, activity} <- {:quick_insert, quick_insert?, activity},
|
|
||||||
_ <- increase_replies_count_if_reply(create_data),
|
_ <- increase_replies_count_if_reply(create_data),
|
||||||
_ <- increase_poll_votes_if_vote(create_data),
|
_ <- increase_poll_votes_if_vote(create_data),
|
||||||
|
{:quick_insert, false, activity} <- {:quick_insert, quick_insert?, activity},
|
||||||
{:ok, _actor} <- increase_note_count_if_public(actor, activity),
|
{:ok, _actor} <- increase_note_count_if_public(actor, activity),
|
||||||
:ok <- maybe_federate(activity) do
|
:ok <- maybe_federate(activity) do
|
||||||
{:ok, activity}
|
{:ok, activity}
|
||||||
|
@ -700,14 +700,12 @@ def fetch_activities_for_context_query(context, opts) do
|
||||||
do: [opts["user"].ap_id | User.following(opts["user"])] ++ public,
|
do: [opts["user"].ap_id | User.following(opts["user"])] ++ public,
|
||||||
else: public
|
else: public
|
||||||
|
|
||||||
opts = Map.put(opts, "user", opts["user"])
|
|
||||||
|
|
||||||
from(activity in Activity)
|
from(activity in Activity)
|
||||||
|> maybe_preload_objects(opts)
|
|> maybe_preload_objects(opts)
|
||||||
|> maybe_preload_bookmarks(opts)
|
|> maybe_preload_bookmarks(opts)
|
||||||
|> maybe_set_thread_muted_field(opts)
|
|> maybe_set_thread_muted_field(opts)
|
||||||
|> restrict_blocked(opts)
|
|> restrict_blocked(opts)
|
||||||
|> restrict_recipients(recipients, opts)
|
|> restrict_recipients(recipients, opts["user"])
|
||||||
|> where(
|
|> where(
|
||||||
[activity],
|
[activity],
|
||||||
fragment(
|
fragment(
|
||||||
|
@ -742,10 +740,7 @@ def fetch_latest_activity_id_for_context(context, opts \\ %{}) do
|
||||||
|
|
||||||
@spec fetch_public_activities(map(), Pagination.type()) :: [Activity.t()]
|
@spec fetch_public_activities(map(), Pagination.type()) :: [Activity.t()]
|
||||||
def fetch_public_activities(opts \\ %{}, pagination \\ :keyset) do
|
def fetch_public_activities(opts \\ %{}, pagination \\ :keyset) do
|
||||||
opts =
|
opts = Map.drop(opts, ["user"])
|
||||||
opts
|
|
||||||
|> Map.put("reply_user", opts["user"])
|
|
||||||
|> Map.delete("user")
|
|
||||||
|
|
||||||
[Constants.as_public()]
|
[Constants.as_public()]
|
||||||
|> fetch_activities_query(opts)
|
|> fetch_activities_query(opts)
|
||||||
|
@ -981,65 +976,13 @@ defp restrict_tag(query, %{"tag" => tag}) when is_binary(tag) do
|
||||||
|
|
||||||
defp restrict_tag(query, _), do: query
|
defp restrict_tag(query, _), do: query
|
||||||
|
|
||||||
defp reply_recipients(user, "following") do
|
defp restrict_recipients(query, [], _user), do: query
|
||||||
[user.ap_id | User.get_cached_user_friends_ap_ids(user)]
|
|
||||||
|
defp restrict_recipients(query, recipients, nil) do
|
||||||
|
from(activity in query, where: fragment("? && ?", ^recipients, activity.recipients))
|
||||||
end
|
end
|
||||||
|
|
||||||
defp reply_recipients(user, "self"), do: [user.ap_id]
|
defp restrict_recipients(query, recipients, user) do
|
||||||
|
|
||||||
defp restrict_recipients(query, [], _opts), do: query
|
|
||||||
|
|
||||||
defp restrict_recipients(
|
|
||||||
query,
|
|
||||||
recipients,
|
|
||||||
%{"user" => nil, "reply_user" => user, "reply_visibility" => visibility}
|
|
||||||
)
|
|
||||||
when not is_nil(user) and visibility in ["following", "self"] do
|
|
||||||
reply_recipients = reply_recipients(user, visibility)
|
|
||||||
|
|
||||||
from([activity, object] in query,
|
|
||||||
where:
|
|
||||||
fragment(
|
|
||||||
"? && ? AND (?->>'inReplyTo' IS NULL OR array_remove(?, ?) && ? OR ? = ?)",
|
|
||||||
^recipients,
|
|
||||||
activity.recipients,
|
|
||||||
object.data,
|
|
||||||
activity.recipients,
|
|
||||||
activity.actor,
|
|
||||||
^reply_recipients,
|
|
||||||
activity.actor,
|
|
||||||
^user.ap_id
|
|
||||||
)
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
defp restrict_recipients(query, recipients, %{"user" => nil}) do
|
|
||||||
from(activity in query,
|
|
||||||
where: fragment("? && ?", ^recipients, activity.recipients)
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
defp restrict_recipients(query, recipients, %{"user" => user, "reply_visibility" => visibility})
|
|
||||||
when visibility in ["following", "self"] do
|
|
||||||
reply_recipients = reply_recipients(user, visibility)
|
|
||||||
|
|
||||||
from(
|
|
||||||
[activity, object] in query,
|
|
||||||
where:
|
|
||||||
fragment(
|
|
||||||
"? && ? AND (?->>'inReplyTo' IS NULL OR array_remove(?, ?) && ?)",
|
|
||||||
^recipients,
|
|
||||||
activity.recipients,
|
|
||||||
object.data,
|
|
||||||
activity.recipients,
|
|
||||||
activity.actor,
|
|
||||||
^reply_recipients
|
|
||||||
),
|
|
||||||
or_where: activity.actor == ^user.ap_id
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
defp restrict_recipients(query, recipients, %{"user" => user}) do
|
|
||||||
from(
|
from(
|
||||||
activity in query,
|
activity in query,
|
||||||
where: fragment("? && ?", ^recipients, activity.recipients),
|
where: fragment("? && ?", ^recipients, activity.recipients),
|
||||||
|
@ -1104,6 +1047,41 @@ defp restrict_replies(query, %{"exclude_replies" => val}) when val == "true" or
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
defp restrict_replies(query, %{
|
||||||
|
"reply_filtering_user" => user,
|
||||||
|
"reply_visibility" => "self"
|
||||||
|
}) do
|
||||||
|
from(
|
||||||
|
[activity, object] in query,
|
||||||
|
where:
|
||||||
|
fragment(
|
||||||
|
"?->>'inReplyTo' is null OR ? = ANY(?)",
|
||||||
|
object.data,
|
||||||
|
^user.ap_id,
|
||||||
|
activity.recipients
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp restrict_replies(query, %{
|
||||||
|
"reply_filtering_user" => user,
|
||||||
|
"reply_visibility" => "following"
|
||||||
|
}) do
|
||||||
|
from(
|
||||||
|
[activity, object] in query,
|
||||||
|
where:
|
||||||
|
fragment(
|
||||||
|
"?->>'inReplyTo' is null OR ? && array_remove(?, ?) OR ? = ?",
|
||||||
|
object.data,
|
||||||
|
^[user.ap_id | User.get_cached_user_friends_ap_ids(user)],
|
||||||
|
activity.recipients,
|
||||||
|
activity.actor,
|
||||||
|
activity.actor,
|
||||||
|
^user.ap_id
|
||||||
|
)
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
defp restrict_replies(query, _), do: query
|
defp restrict_replies(query, _), do: query
|
||||||
|
|
||||||
defp restrict_reblogs(query, %{"exclude_reblogs" => val}) when val == "true" or val == "1" do
|
defp restrict_reblogs(query, %{"exclude_reblogs" => val}) when val == "true" or val == "1" do
|
||||||
|
@ -1311,15 +1289,14 @@ def fetch_activities_query(recipients, opts \\ %{}) do
|
||||||
skip_thread_containment: Config.get([:instance, :skip_thread_containment])
|
skip_thread_containment: Config.get([:instance, :skip_thread_containment])
|
||||||
}
|
}
|
||||||
|
|
||||||
opts = Map.put(opts, "user", opts["user"])
|
|
||||||
|
|
||||||
Activity
|
Activity
|
||||||
|> maybe_preload_objects(opts)
|
|> maybe_preload_objects(opts)
|
||||||
|> maybe_preload_bookmarks(opts)
|
|> maybe_preload_bookmarks(opts)
|
||||||
|> maybe_preload_report_notes(opts)
|
|> maybe_preload_report_notes(opts)
|
||||||
|> maybe_set_thread_muted_field(opts)
|
|> maybe_set_thread_muted_field(opts)
|
||||||
|> maybe_order(opts)
|
|> maybe_order(opts)
|
||||||
|> restrict_recipients(recipients, opts)
|
|> restrict_recipients(recipients, opts["user"])
|
||||||
|
|> restrict_replies(opts)
|
||||||
|> restrict_tag(opts)
|
|> restrict_tag(opts)
|
||||||
|> restrict_tag_reject(opts)
|
|> restrict_tag_reject(opts)
|
||||||
|> restrict_tag_all(opts)
|
|> restrict_tag_all(opts)
|
||||||
|
@ -1334,7 +1311,6 @@ def fetch_activities_query(recipients, opts \\ %{}) do
|
||||||
|> restrict_media(opts)
|
|> restrict_media(opts)
|
||||||
|> restrict_visibility(opts)
|
|> restrict_visibility(opts)
|
||||||
|> restrict_thread_visibility(opts, config)
|
|> restrict_thread_visibility(opts, config)
|
||||||
|> restrict_replies(opts)
|
|
||||||
|> restrict_reblogs(opts)
|
|> restrict_reblogs(opts)
|
||||||
|> restrict_pinned(opts)
|
|> restrict_pinned(opts)
|
||||||
|> restrict_muted_reblogs(restrict_muted_reblogs_opts)
|
|> restrict_muted_reblogs(restrict_muted_reblogs_opts)
|
||||||
|
|
|
@ -37,6 +37,7 @@ def home(%{assigns: %{user: user}} = conn, params) do
|
||||||
|> Map.put("type", ["Create", "Announce"])
|
|> Map.put("type", ["Create", "Announce"])
|
||||||
|> Map.put("blocking_user", user)
|
|> Map.put("blocking_user", user)
|
||||||
|> Map.put("muting_user", user)
|
|> Map.put("muting_user", user)
|
||||||
|
|> Map.put("reply_filtering_user", user)
|
||||||
|> Map.put("user", user)
|
|> Map.put("user", user)
|
||||||
|
|
||||||
recipients = [user.ap_id | User.following(user)]
|
recipients = [user.ap_id | User.following(user)]
|
||||||
|
@ -100,7 +101,7 @@ def public(%{assigns: %{user: user}} = conn, params) do
|
||||||
|> Map.put("local_only", local_only)
|
|> Map.put("local_only", local_only)
|
||||||
|> Map.put("blocking_user", user)
|
|> Map.put("blocking_user", user)
|
||||||
|> Map.put("muting_user", user)
|
|> Map.put("muting_user", user)
|
||||||
|> Map.put("user", user)
|
|> Map.put("reply_filtering_user", user)
|
||||||
|> ActivityPub.fetch_public_activities()
|
|> ActivityPub.fetch_public_activities()
|
||||||
|
|
||||||
conn
|
conn
|
||||||
|
|
|
@ -1936,7 +1936,7 @@ test "public timeline", %{users: %{u1: user}} do
|
||||||
|> Map.put("local_only", false)
|
|> Map.put("local_only", false)
|
||||||
|> Map.put("blocking_user", user)
|
|> Map.put("blocking_user", user)
|
||||||
|> Map.put("muting_user", user)
|
|> Map.put("muting_user", user)
|
||||||
|> Map.put("user", user)
|
|> Map.put("reply_filtering_user", user)
|
||||||
|> ActivityPub.fetch_public_activities()
|
|> ActivityPub.fetch_public_activities()
|
||||||
|> Enum.map(& &1.id)
|
|> Enum.map(& &1.id)
|
||||||
|
|
||||||
|
@ -1958,7 +1958,7 @@ test "public timeline with reply_visibility `following`", %{
|
||||||
|> Map.put("blocking_user", user)
|
|> Map.put("blocking_user", user)
|
||||||
|> Map.put("muting_user", user)
|
|> Map.put("muting_user", user)
|
||||||
|> Map.put("reply_visibility", "following")
|
|> Map.put("reply_visibility", "following")
|
||||||
|> Map.put("user", user)
|
|> Map.put("reply_filtering_user", user)
|
||||||
|> ActivityPub.fetch_public_activities()
|
|> ActivityPub.fetch_public_activities()
|
||||||
|> Enum.map(& &1.id)
|
|> Enum.map(& &1.id)
|
||||||
|
|
||||||
|
@ -1985,7 +1985,7 @@ test "public timeline with reply_visibility `self`", %{
|
||||||
|> Map.put("blocking_user", user)
|
|> Map.put("blocking_user", user)
|
||||||
|> Map.put("muting_user", user)
|
|> Map.put("muting_user", user)
|
||||||
|> Map.put("reply_visibility", "self")
|
|> Map.put("reply_visibility", "self")
|
||||||
|> Map.put("user", user)
|
|> Map.put("reply_filtering_user", user)
|
||||||
|> ActivityPub.fetch_public_activities()
|
|> ActivityPub.fetch_public_activities()
|
||||||
|> Enum.map(& &1.id)
|
|> Enum.map(& &1.id)
|
||||||
|
|
||||||
|
@ -2008,6 +2008,7 @@ test "home timeline", %{
|
||||||
|> Map.put("blocking_user", user)
|
|> Map.put("blocking_user", user)
|
||||||
|> Map.put("muting_user", user)
|
|> Map.put("muting_user", user)
|
||||||
|> Map.put("user", user)
|
|> Map.put("user", user)
|
||||||
|
|> Map.put("reply_filtering_user", user)
|
||||||
|
|
||||||
activities_ids =
|
activities_ids =
|
||||||
ActivityPub.fetch_activities([user.ap_id | User.following(user)], params)
|
ActivityPub.fetch_activities([user.ap_id | User.following(user)], params)
|
||||||
|
@ -2046,6 +2047,7 @@ test "home timeline with reply_visibility `following`", %{
|
||||||
|> Map.put("muting_user", user)
|
|> Map.put("muting_user", user)
|
||||||
|> Map.put("user", user)
|
|> Map.put("user", user)
|
||||||
|> Map.put("reply_visibility", "following")
|
|> Map.put("reply_visibility", "following")
|
||||||
|
|> Map.put("reply_filtering_user", user)
|
||||||
|
|
||||||
activities_ids =
|
activities_ids =
|
||||||
ActivityPub.fetch_activities([user.ap_id | User.following(user)], params)
|
ActivityPub.fetch_activities([user.ap_id | User.following(user)], params)
|
||||||
|
@ -2084,6 +2086,7 @@ test "home timeline with reply_visibility `self`", %{
|
||||||
|> Map.put("muting_user", user)
|
|> Map.put("muting_user", user)
|
||||||
|> Map.put("user", user)
|
|> Map.put("user", user)
|
||||||
|> Map.put("reply_visibility", "self")
|
|> Map.put("reply_visibility", "self")
|
||||||
|
|> Map.put("reply_filtering_user", user)
|
||||||
|
|
||||||
activities_ids =
|
activities_ids =
|
||||||
ActivityPub.fetch_activities([user.ap_id | User.following(user)], params)
|
ActivityPub.fetch_activities([user.ap_id | User.following(user)], params)
|
||||||
|
@ -2131,6 +2134,7 @@ test "public timeline with default reply_visibility `following`", %{users: %{u1:
|
||||||
|> Map.put("blocking_user", user)
|
|> Map.put("blocking_user", user)
|
||||||
|> Map.put("muting_user", user)
|
|> Map.put("muting_user", user)
|
||||||
|> Map.put("reply_visibility", "following")
|
|> Map.put("reply_visibility", "following")
|
||||||
|
|> Map.put("reply_filtering_user", user)
|
||||||
|> Map.put("user", user)
|
|> Map.put("user", user)
|
||||||
|> ActivityPub.fetch_public_activities()
|
|> ActivityPub.fetch_public_activities()
|
||||||
|> Enum.map(& &1.id)
|
|> Enum.map(& &1.id)
|
||||||
|
@ -2146,6 +2150,7 @@ test "public timeline with default reply_visibility `self`", %{users: %{u1: user
|
||||||
|> Map.put("blocking_user", user)
|
|> Map.put("blocking_user", user)
|
||||||
|> Map.put("muting_user", user)
|
|> Map.put("muting_user", user)
|
||||||
|> Map.put("reply_visibility", "self")
|
|> Map.put("reply_visibility", "self")
|
||||||
|
|> Map.put("reply_filtering_user", user)
|
||||||
|> Map.put("user", user)
|
|> Map.put("user", user)
|
||||||
|> ActivityPub.fetch_public_activities()
|
|> ActivityPub.fetch_public_activities()
|
||||||
|> Enum.map(& &1.id)
|
|> Enum.map(& &1.id)
|
||||||
|
@ -2176,6 +2181,7 @@ test "home timeline with default reply_visibility `following`", %{users: %{u1: u
|
||||||
|> Map.put("muting_user", user)
|
|> Map.put("muting_user", user)
|
||||||
|> Map.put("user", user)
|
|> Map.put("user", user)
|
||||||
|> Map.put("reply_visibility", "following")
|
|> Map.put("reply_visibility", "following")
|
||||||
|
|> Map.put("reply_filtering_user", user)
|
||||||
|
|
||||||
activities_ids =
|
activities_ids =
|
||||||
ActivityPub.fetch_activities([user.ap_id | User.following(user)], params)
|
ActivityPub.fetch_activities([user.ap_id | User.following(user)], params)
|
||||||
|
@ -2199,6 +2205,7 @@ test "home timeline with default reply_visibility `self`", %{
|
||||||
|> Map.put("muting_user", user)
|
|> Map.put("muting_user", user)
|
||||||
|> Map.put("user", user)
|
|> Map.put("user", user)
|
||||||
|> Map.put("reply_visibility", "self")
|
|> Map.put("reply_visibility", "self")
|
||||||
|
|> Map.put("reply_filtering_user", user)
|
||||||
|
|
||||||
activities_ids =
|
activities_ids =
|
||||||
ActivityPub.fetch_activities([user.ap_id | User.following(user)], params)
|
ActivityPub.fetch_activities([user.ap_id | User.following(user)], params)
|
||||||
|
|
Loading…
Reference in a new issue