Reset default actor id for an user when a profile is deleted

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel 2021-04-27 11:28:25 +02:00
parent e1cf7a817f
commit 493808a3c8
No known key found for this signature in database
GPG Key ID: A061B9DDE0CA0773

View File

@ -333,7 +333,8 @@ defmodule Mobilizon.Actors do
|> Multi.run(:remove_avatar, fn _, _ -> remove_avatar(actor) end) |> Multi.run(:remove_avatar, fn _, _ -> remove_avatar(actor) end)
multi = multi =
if type == :Group do case type do
:Group ->
multi multi
|> Multi.run(:delete_remote_members, fn _, _ -> |> Multi.run(:delete_remote_members, fn _, _ ->
delete_group_elements(actor, :remote_members) delete_group_elements(actor, :remote_members)
@ -353,8 +354,12 @@ defmodule Mobilizon.Actors do
|> Multi.run(:delete_group_discussions, fn _, _ -> |> Multi.run(:delete_group_discussions, fn _, _ ->
delete_group_elements(actor, :discussions) delete_group_elements(actor, :discussions)
end) end)
else
multi :Person ->
# When deleting a profile, reset default_actor_id
Multi.run(multi, :reset_default_actor_id, fn _, _ ->
reset_default_actor_id(actor)
end)
end end
multi = multi =
@ -1825,6 +1830,24 @@ defmodule Mobilizon.Actors do
end end
end end
@spec reset_default_actor_id(Actor.t()) :: {:ok, User.t()} | {:error, :user_not_found}
defp reset_default_actor_id(%Actor{type: :Person, user: %User{id: user_id} = user, id: actor_id}) do
Logger.debug("reset_default_actor_id")
new_actor_id =
user
|> Users.get_actors_for_user()
|> Enum.map(& &1.id)
|> Enum.find(&(&1 !== actor_id))
{:ok, Users.update_user_default_actor(user_id, new_actor_id)}
rescue
_e in Ecto.NoResultsError ->
{:error, :user_not_found}
end
defp reset_default_actor_id(%Actor{type: :Person, user: nil}), do: {:ok, nil}
defp accumulate_paginated_elements( defp accumulate_paginated_elements(
%Actor{} = actor, %Actor{} = actor,
method, method,