defmodule Mv.Membership.JoinRequest.Changes.ConfirmRequest do @moduledoc """ Sets the join request to submitted (confirmation link clicked). Used by the confirm action after the user clicks the confirmation link. Only applies when the current status is `:pending_confirmation`, so that direct calls to the confirm action are idempotent and never overwrite :submitted, :approved, or :rejected. Token hash is kept so a second click can still find the record and return success without changing it. """ use Ash.Resource.Change @spec change(Ash.Changeset.t(), keyword(), Ash.Resource.Change.context()) :: Ash.Changeset.t() def change(changeset, _opts, _context) do current_status = Ash.Changeset.get_data(changeset, :status) if current_status == :pending_confirmation do changeset |> Ash.Changeset.force_change_attribute(:status, :submitted) |> Ash.Changeset.force_change_attribute(:submitted_at, DateTime.utc_now()) else changeset end end end