Merge branch 'remove-user-activities' into 'develop'

[#757] Add mix task to delete user's activities

See merge request pleroma/pleroma!1008
This commit is contained in:
lambda 2019-04-02 12:45:29 +00:00
commit ce9284b36f
4 changed files with 51 additions and 16 deletions

View file

@ -32,6 +32,10 @@ defmodule Mix.Tasks.Pleroma.User do
mix pleroma.user rm NICKNAME mix pleroma.user rm NICKNAME
## Delete the user's activities.
mix pleroma.user delete_activities NICKNAME
## Deactivate or activate the user's account. ## Deactivate or activate the user's account.
mix pleroma.user toggle_activated NICKNAME mix pleroma.user toggle_activated NICKNAME
@ -303,6 +307,18 @@ defmodule Mix.Tasks.Pleroma.User do
end end
end end
def run(["delete_activities", nickname]) do
Common.start_pleroma()
with %User{local: true} = user <- User.get_by_nickname(nickname) do
User.delete_user_activities(user)
Mix.shell().info("User #{nickname} statuses deleted.")
else
_ ->
Mix.shell().error("No local user #{nickname}")
end
end
defp set_moderator(user, value) do defp set_moderator(user, value) do
info_cng = User.Info.admin_api_update(user.info, %{is_moderator: value}) info_cng = User.Info.admin_api_update(user.info, %{is_moderator: value})

View file

@ -1088,28 +1088,27 @@ defmodule Pleroma.User do
# Remove all relationships # Remove all relationships
{:ok, followers} = User.get_followers(user) {:ok, followers} = User.get_followers(user)
followers Enum.each(followers, fn follower -> User.unfollow(follower, user) end)
|> Enum.each(fn follower -> User.unfollow(follower, user) end)
{:ok, friends} = User.get_friends(user) {:ok, friends} = User.get_friends(user)
friends Enum.each(friends, fn followed -> User.unfollow(user, followed) end)
|> Enum.each(fn followed -> User.unfollow(user, followed) end)
query = delete_user_activities(user)
from(a in Activity, where: a.actor == ^user.ap_id) end
|> Activity.with_preloaded_object()
Repo.all(query) def delete_user_activities(%User{ap_id: ap_id} = user) do
|> Enum.each(fn activity -> Activity
case activity.data["type"] do |> where(actor: ^ap_id)
"Create" -> |> Activity.with_preloaded_object()
ActivityPub.delete(Object.normalize(activity)) |> Repo.all()
|> Enum.each(fn
%{data: %{"type" => "Create"}} = activity ->
activity |> Object.normalize() |> ActivityPub.delete()
# TODO: Do something with likes, follows, repeats. # TODO: Do something with likes, follows, repeats.
_ -> _ ->
"Doing nothing" "Doing nothing"
end
end) end)
{:ok, user} {:ok, user}

View file

@ -248,4 +248,14 @@ defmodule Mix.Tasks.Pleroma.UserTest do
assert message =~ "Generated" assert message =~ "Generated"
end end
end end
describe "running delete_activities" do
test "activities are deleted" do
%{nickname: nickname} = insert(:user)
assert :ok == Mix.Tasks.Pleroma.User.run(["delete_activities", nickname])
assert_received {:mix_shell, :info, [message]}
assert message == "User #{nickname} statuses deleted."
end
end
end end

View file

@ -799,6 +799,16 @@ defmodule Pleroma.UserTest do
assert false == user.info.deactivated assert false == user.info.deactivated
end end
test ".delete_user_activities deletes all create activities" do
user = insert(:user)
{:ok, activity} = CommonAPI.post(user, %{"status" => "2hu"})
{:ok, _} = User.delete_user_activities(user)
# TODO: Remove favorites, repeats, delete activities.
refute Activity.get_by_id(activity.id)
end
test ".delete deactivates a user, all follow relationships and all create activities" do test ".delete deactivates a user, all follow relationships and all create activities" do
user = insert(:user) user = insert(:user)
followed = insert(:user) followed = insert(:user)