32 lines
1.2 KiB
Elixir
32 lines
1.2 KiB
Elixir
defmodule Mv.Membership.JoinRequest.Changes.SetConfirmationToken do
|
|
@moduledoc """
|
|
Hashes the confirmation token and sets expiry for the join request (submit flow).
|
|
|
|
Uses `JoinRequest.hash_confirmation_token/1` so hashing logic lives in one place.
|
|
|
|
Reads the :confirmation_token argument, stores only its SHA256 hash and sets
|
|
confirmation_token_expires_at (e.g. 24h). Raw token is never persisted.
|
|
"""
|
|
use Ash.Resource.Change
|
|
|
|
alias Mv.Membership.JoinRequest
|
|
|
|
@confirmation_validity_hours 24
|
|
|
|
@spec change(Ash.Changeset.t(), keyword(), Ash.Resource.Change.context()) :: Ash.Changeset.t()
|
|
def change(changeset, _opts, _context) do
|
|
token = Ash.Changeset.get_argument(changeset, :confirmation_token)
|
|
|
|
if is_binary(token) and token != "" do
|
|
hash = JoinRequest.hash_confirmation_token(token)
|
|
expires_at = DateTime.utc_now() |> DateTime.add(@confirmation_validity_hours, :hour)
|
|
|
|
changeset
|
|
|> Ash.Changeset.force_change_attribute(:confirmation_token_hash, hash)
|
|
|> Ash.Changeset.force_change_attribute(:confirmation_token_expires_at, expires_at)
|
|
|> Ash.Changeset.force_change_attribute(:status, :pending_confirmation)
|
|
else
|
|
changeset
|
|
end
|
|
end
|
|
end
|