improvement: set confirmed field to nil, for reconfirmation (#136)

* improvement: set confirmed field to `nil`, for reconfirmation

* chore: format

* improvement: only change `confirmed_at_field` if its not changing, and only on updates
This commit is contained in:
Zach Daniel 2023-01-15 02:28:13 -05:00 committed by GitHub
parent 161c8ab7e8
commit ec8e1eb979
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -72,6 +72,7 @@ defmodule AshAuthentication.AddOn.Confirmation.ConfirmationHookChange do
defp maybe_perform_confirmation(%Changeset{} = changeset, strategy, original_changeset) do defp maybe_perform_confirmation(%Changeset{} = changeset, strategy, original_changeset) do
changeset changeset
|> nil_confirmed_at_field(strategy)
|> Changeset.after_action(fn _changeset, user -> |> Changeset.after_action(fn _changeset, user ->
strategy strategy
|> Confirmation.confirmation_token(original_changeset, user) |> Confirmation.confirmation_token(original_changeset, user)
@ -94,4 +95,17 @@ defmodule AshAuthentication.AddOn.Confirmation.ConfirmationHookChange do
defp maybe_perform_confirmation(_changeset, _strategy, original_changeset), defp maybe_perform_confirmation(_changeset, _strategy, original_changeset),
do: original_changeset do: original_changeset
defp nil_confirmed_at_field(changeset, strategy) do
# If we're updating values, and we are inhibiting values on the changes (enforced at the call site)
# then we want to reset the confirmed_at_field to `nil`
# However, we do it `lazily` in case something they've done is already changing
# the `confirmed_at`. This might happen in a social sign up where the email has
# already been verified
if changeset.action.type == :update do
Changeset.force_change_new_attribute(changeset, strategy.confirmed_at_field, nil)
else
changeset
end
end
end end