defmodule Mv.Membership.JoinRequest.Changes.RejectRequest do @moduledoc """ Sets the join request to rejected and records the reviewer. Only transitions from :submitted status. Returns an error for any other status. No reason field in MVP; audit fields (rejected_at, reviewed_by_user_id) are set. """ use Ash.Resource.Change alias Mv.Membership.JoinRequest.Changes.Helpers @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 == :submitted do reviewed_by_id = Helpers.actor_id(context.actor) changeset |> Ash.Changeset.force_change_attribute(:status, :rejected) |> Ash.Changeset.force_change_attribute(:rejected_at, DateTime.utc_now()) |> Ash.Changeset.force_change_attribute(:reviewed_by_user_id, reviewed_by_id) else Ash.Changeset.add_error(changeset, field: :status, message: "can only reject a submitted join request (current status: #{current_status})" ) end end end