Refactor to store user ap_id, add tests

This commit is contained in:
Karen Konou 2019-03-15 14:06:58 +01:00
parent be465c762b
commit da53c079db
8 changed files with 88 additions and 17 deletions

View File

@ -1387,6 +1387,6 @@ defp paginate(query, page, page_size) do
end end
def showing_reblogs?(%User{} = user, %User{} = target) do def showing_reblogs?(%User{} = user, %User{} = target) do
target.id not in user.info.muted_reblogs target.ap_id not in user.info.muted_reblogs
end end
end end

View File

@ -261,14 +261,14 @@ def roles(%Info{is_moderator: is_moderator, is_admin: is_admin}) do
} }
end end
def add_reblog_mute(info, id) do def add_reblog_mute(info, ap_id) do
params = %{muted_reblogs: info.muted_reblogs ++ [id]} params = %{muted_reblogs: info.muted_reblogs ++ [ap_id]}
cast(info, params, [:muted_reblogs]) cast(info, params, [:muted_reblogs])
end end
def remove_reblog_mute(info, id) do def remove_reblog_mute(info, ap_id) do
params = %{muted_reblogs: List.delete(info.muted_reblogs, id)} params = %{muted_reblogs: List.delete(info.muted_reblogs, ap_id)}
cast(info, params, [:muted_reblogs]) cast(info, params, [:muted_reblogs])
end end

View File

@ -300,17 +300,21 @@ def report(user, data) do
end end
end end
def hide_reblogs(user, id) do def hide_reblogs(user, muted) do
if id not in user.info.muted_reblogs do ap_id = muted.ap_id
info_changeset = User.Info.add_reblog_mute(user.info, id)
if ap_id not in user.info.muted_reblogs do
info_changeset = User.Info.add_reblog_mute(user.info, ap_id)
changeset = Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_changeset) changeset = Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_changeset)
User.update_and_set_cache(changeset) User.update_and_set_cache(changeset)
end end
end end
def show_reblogs(user, id) do def show_reblogs(user, muted) do
if id in user.info.muted_reblogs do ap_id = muted.ap_id
info_changeset = User.Info.remove_reblog_mute(user.info, id)
if ap_id in user.info.muted_reblogs do
info_changeset = User.Info.remove_reblog_mute(user.info, ap_id)
changeset = Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_changeset) changeset = Ecto.Changeset.change(user) |> Ecto.Changeset.put_embed(:info, info_changeset)
User.update_and_set_cache(changeset) User.update_and_set_cache(changeset)
end end

View File

@ -730,13 +730,14 @@ def follow(%{assigns: %{user: follower}} = conn, %{"id" => id}) do
|> render("relationship.json", %{user: follower, target: followed}) |> render("relationship.json", %{user: follower, target: followed})
else else
true -> true ->
case conn.params["reblogs"] do
true -> CommonAPI.show_reblogs(follower, id)
false -> CommonAPI.hide_reblogs(follower, id)
end
followed = User.get_cached_by_id(id) followed = User.get_cached_by_id(id)
{:ok, follower} =
case conn.params["reblogs"] do
true -> CommonAPI.show_reblogs(follower, followed)
false -> CommonAPI.hide_reblogs(follower, followed)
end
conn conn
|> put_view(AccountView) |> put_view(AccountView)
|> render("relationship.json", %{user: follower, target: followed}) |> render("relationship.json", %{user: follower, target: followed})

View File

@ -200,7 +200,7 @@ def push_to_socket(topics, topic, %Activity{data: %{"type" => "Announce"}} = ite
user = User.get_cached_by_ap_id(socket.assigns[:user].ap_id) user = User.get_cached_by_ap_id(socket.assigns[:user].ap_id)
blocks = user.info.blocks || [] blocks = user.info.blocks || []
mutes = user.info.mutes || [] mutes = user.info.mutes || []
reblog_mutes = user.info.reblog_mutes || [] reblog_mutes = user.info.muted_reblogs || []
parent = Object.normalize(item.data["object"]) parent = Object.normalize(item.data["object"])

View File

@ -424,6 +424,19 @@ test "retrieves ids up to max_id" do
assert length(activities) == 20 assert length(activities) == 20
assert last == last_expected assert last == last_expected
end end
test "doesn't return reblogs for users for whom reblogs have been muted" do
activity = insert(:note_activity)
user = insert(:user)
booster = insert(:user)
{:ok, user} = CommonAPI.hide_reblogs(user, booster)
{:ok, activity, _} = CommonAPI.repeat(activity.id, booster)
activities = ActivityPub.fetch_activities([], %{"muting_user" => user})
refute Enum.member?(activities, activity)
end
end end
describe "like an object" do describe "like an object" do

View File

@ -221,4 +221,27 @@ test "creates a report" do
} = flag_activity } = flag_activity
end end
end end
describe "reblog muting" do
setup do
muter = insert(:user)
muted = insert(:user)
[muter: muter, muted: muted]
end
test "add a reblog mute", %{muter: muter, muted: muted} do
{:ok, muter} = CommonAPI.hide_reblogs(muter, muted)
assert Pleroma.User.showing_reblogs?(muter, muted) == false
end
test "remove a reblog mute", %{muter: muter, muted: muted} do
{:ok, muter} = CommonAPI.hide_reblogs(muter, muted)
{:ok, muter} = CommonAPI.show_reblogs(muter, muted)
assert Pleroma.User.showing_reblogs?(muter, muted) == true
end
end
end end

View File

@ -202,4 +202,34 @@ test "it send wanted private posts to list" do
Task.await(task) Task.await(task)
end end
test "it doesn't send muted reblogs" do
user1 = insert(:user)
user2 = insert(:user)
user3 = insert(:user)
CommonAPI.hide_reblogs(user1, user2.ap_id)
task =
Task.async(fn ->
refute_receive {:text, _}, 1_000
end)
fake_socket = %{
transport_pid: task.pid,
assigns: %{
user: user1
}
}
{:ok, create_activity} = CommonAPI.post(user3, %{"status" => "I'm kawen"})
{:ok, announce_activity, _} = CommonAPI.repeat(create_activity.id, user2)
topics = %{
"public" => [fake_socket]
}
Streamer.push_to_socket(topics, "public", announce_activity)
Task.await(task)
end
end end