I’ll start by adding my captain obvious solution to prevent accidental changes to admin flag fields: Don’t handle it through the params sent to changeset/2, but only allow them to be changed by custom functions.
def make_admin(%User{} = user) do
user
|> Ecto.Changeset.change(%{is_admin: true})
|> Repo.update()
end
def put_admin_flag(%Ecto.Changeset{} = changeset) do
Ecto.Changeset.change(changeset, %{is_admin: true})
end
This way in each places, where setting that flag should indeed be possible it has to be done explicitly, independent to any changeset/2 functions/params.






















