Hey there,
I am wondering if is this the recommended way of having errors in an Ecto.Multi in a loop?
def remove_admin_from_event(user, event, admins) do
multi =
Enum.reduce(admins, Multi.new(), fn hash_id, multi ->
admin = Accounts.get_user_by_hash_id(hash_id)
user_event = get_user_event(admin.id, event.id)
number_of_admins = Enum.count(event.users, fn user -> user.role == "admin" end)
user_event_changeset =
UserEvent.changeset(user_event, admin, event, %{
role: "participant",
status: user_event.status
})
cond do
user.id == admin.id ->
changeset =
add_error(
user_event_changeset,
:user_event,
"You can't remove your own admin rights!"
)
multi
|> Multi.error("remove_admin_#{hash_id}", changeset)
number_of_admins <= 1 ->
changeset =
add_error(
user_event_changeset,
:user_event,
"A dotoo needs at least one admin, you are the last one currently!"
)
multi
|> Multi.error("remove_admin_#{hash_id}", changeset)
true ->
multi
|> Multi.update(
"user_event_#{admin.id}_#{event.id}",
user_event_changeset
)
end
end)
Repo.transaction(multi)
end