forked from AkkomaGang/akkoma
Delete report notifs when demoting from superuser
When someone isn't a superuser any more, they shouldn't see the reporsts any more either. Here we delete the report notifications from a user when that user gets updated from being a superuser to a non-superuser.
This commit is contained in:
parent
91d7150031
commit
1048bc1bb9
4 changed files with 66 additions and 1 deletions
|
@ -341,6 +341,14 @@ def destroy_multiple(%{id: user_id} = _user, ids) do
|
||||||
|> Repo.delete_all()
|
|> Repo.delete_all()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def destroy_multiple_from_types(%{id: user_id}, types) do
|
||||||
|
from(n in Notification,
|
||||||
|
where: n.user_id == ^user_id,
|
||||||
|
where: n.type in ^types
|
||||||
|
)
|
||||||
|
|> Repo.delete_all()
|
||||||
|
end
|
||||||
|
|
||||||
def dismiss(%Pleroma.Activity{} = activity) do
|
def dismiss(%Pleroma.Activity{} = activity) do
|
||||||
Notification
|
Notification
|
||||||
|> where([n], n.activity_id == ^activity.id)
|
|> where([n], n.activity_id == ^activity.id)
|
||||||
|
|
|
@ -1089,11 +1089,28 @@ def update_and_set_cache(struct, params) do
|
||||||
|> update_and_set_cache()
|
|> update_and_set_cache()
|
||||||
end
|
end
|
||||||
|
|
||||||
def update_and_set_cache(changeset) do
|
def update_and_set_cache(%{data: %Pleroma.User{} = user} = changeset) do
|
||||||
|
was_superuser_before_update = User.superuser?(user)
|
||||||
|
|
||||||
with {:ok, user} <- Repo.update(changeset, stale_error_field: :id) do
|
with {:ok, user} <- Repo.update(changeset, stale_error_field: :id) do
|
||||||
Pleroma.Elasticsearch.maybe_put_into_elasticsearch(user)
|
Pleroma.Elasticsearch.maybe_put_into_elasticsearch(user)
|
||||||
set_cache(user)
|
set_cache(user)
|
||||||
end
|
end
|
||||||
|
|> maybe_remove_report_notifications(was_superuser_before_update)
|
||||||
|
end
|
||||||
|
|
||||||
|
defp maybe_remove_report_notifications(
|
||||||
|
{:ok, %Pleroma.User{} = user} = result,
|
||||||
|
was_superuser_before_update
|
||||||
|
) do
|
||||||
|
if was_superuser_before_update and not User.superuser?(user),
|
||||||
|
do: user |> Notification.destroy_multiple_from_types(["pleroma:report"])
|
||||||
|
|
||||||
|
result
|
||||||
|
end
|
||||||
|
|
||||||
|
defp maybe_remove_report_notifications(result, _) do
|
||||||
|
result
|
||||||
end
|
end
|
||||||
|
|
||||||
def get_user_friends_ap_ids(user) do
|
def get_user_friends_ap_ids(user) do
|
||||||
|
|
|
@ -520,6 +520,25 @@ test "it clears all notifications belonging to the user" do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "destroy_multiple_from_types/2" do
|
||||||
|
test "clears all notifications of a certain type for a given user" do
|
||||||
|
report_activity = insert(:report_activity)
|
||||||
|
user1 = insert(:user, is_moderator: true, is_admin: true)
|
||||||
|
user2 = insert(:user, is_moderator: true, is_admin: true)
|
||||||
|
{:ok, _} = Notification.create_notifications(report_activity)
|
||||||
|
|
||||||
|
{:ok, _} =
|
||||||
|
CommonAPI.post(user2, %{
|
||||||
|
status: "hey @#{user1.nickname} !"
|
||||||
|
})
|
||||||
|
|
||||||
|
Notification.destroy_multiple_from_types(user1, ["pleroma:report"])
|
||||||
|
|
||||||
|
assert [%Pleroma.Notification{type: "mention"}] = Notification.for_user(user1)
|
||||||
|
assert [%Pleroma.Notification{type: "pleroma:report"}] = Notification.for_user(user2)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "set_read_up_to()" do
|
describe "set_read_up_to()" do
|
||||||
test "it sets all notifications as read up to a specified notification ID" do
|
test "it sets all notifications as read up to a specified notification ID" do
|
||||||
user = insert(:user)
|
user = insert(:user)
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
defmodule Pleroma.UserTest do
|
defmodule Pleroma.UserTest do
|
||||||
alias Pleroma.Activity
|
alias Pleroma.Activity
|
||||||
alias Pleroma.Builders.UserBuilder
|
alias Pleroma.Builders.UserBuilder
|
||||||
|
alias Pleroma.Notification
|
||||||
alias Pleroma.Object
|
alias Pleroma.Object
|
||||||
alias Pleroma.Repo
|
alias Pleroma.Repo
|
||||||
alias Pleroma.Tests.ObanHelpers
|
alias Pleroma.Tests.ObanHelpers
|
||||||
|
@ -2153,6 +2154,26 @@ test "performs update cache if user updated" do
|
||||||
assert {:ok, user} = Cachex.get(:user_cache, "ap_id:#{user.ap_id}")
|
assert {:ok, user} = Cachex.get(:user_cache, "ap_id:#{user.ap_id}")
|
||||||
assert %User{bio: "test-bio"} = User.get_cached_by_ap_id(user.ap_id)
|
assert %User{bio: "test-bio"} = User.get_cached_by_ap_id(user.ap_id)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
test "removes report notifs when user isn't superuser any more" do
|
||||||
|
report_activity = insert(:report_activity)
|
||||||
|
user = insert(:user, is_moderator: true, is_admin: true)
|
||||||
|
{:ok, _} = Notification.create_notifications(report_activity)
|
||||||
|
|
||||||
|
assert [%Pleroma.Notification{type: "pleroma:report"}] = Notification.for_user(user)
|
||||||
|
|
||||||
|
{:ok, user} = user |> User.admin_api_update(%{is_moderator: false})
|
||||||
|
# is still superuser because still admin
|
||||||
|
assert [%Pleroma.Notification{type: "pleroma:report"}] = Notification.for_user(user)
|
||||||
|
|
||||||
|
{:ok, user} = user |> User.admin_api_update(%{is_moderator: true, is_admin: false})
|
||||||
|
# is still superuser because still moderator
|
||||||
|
assert [%Pleroma.Notification{type: "pleroma:report"}] = Notification.for_user(user)
|
||||||
|
|
||||||
|
{:ok, user} = user |> User.admin_api_update(%{is_moderator: false})
|
||||||
|
# is not a superuser any more
|
||||||
|
assert [] = Notification.for_user(user)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe "following/followers synchronization" do
|
describe "following/followers synchronization" do
|
||||||
|
|
Loading…
Reference in a new issue