defmodule MyApp.Changes.SubmitForApproval do
use Ash.Resource.Change
@impl Ash.Resource.Change
def change(%{context: %{changes_approved?: true}} = changeset, _opts, _context) do
# Changes have been approved, proceed to persist in the datalayer as expected.
changeset
end
def change(changeset, opts, context) do
# Changes are yet to be approved, seek approval before persisting them in the database
# !!! ==============================================!!!
# ON ATOMIC UPDATE request_approval/3 ISN'T CALLED.
# !!! ==============================================!!!
Ash.Changeset.before_action(changeset, &request_approval(&1, opts, context))
end
@impl Ash.Resource.Change
def atomic(changeset, opts, context) do
{:ok, change(changeset, opts, context)}
end
defp request_approval(changeset, opts, context) do
# ================================================
# !!! THIS IS NOT REACHED WHEN UPDATES ARE ATOMIC !!!
# ================================================
# 1. Serialize the changeset
# 2. Store the change request for approval
# 2. Prevent submitting to underlying datalayer until approved
changeset
end
end
defmodule MyApp.Changes.SubmitForApproval do
use Ash.Resource.Change
@impl Ash.Resource.Change
def change(%{context: %{changes_approved?: true}} = changeset, _opts, _context) do
# Changes have been approved, proceed to persist in the datalayer as expected.
changeset
end
def change(changeset, opts, context) do
# Changes are yet to be approved, seek approval before persisting them in the database
# !!! ==============================================!!!
# ON ATOMIC UPDATE request_approval/3 ISN'T CALLED.
# !!! ==============================================!!!
Ash.Changeset.before_action(changeset, &request_approval(&1, opts, context))
end
@impl Ash.Resource.Change
def atomic(changeset, opts, context) do
{:ok, change(changeset, opts, context)}
end
defp request_approval(changeset, opts, context) do
# ================================================
# !!! THIS IS NOT REACHED WHEN UPDATES ARE ATOMIC !!!
# ================================================
# 1. Serialize the changeset
# 2. Store the change request for approval
# 2. Prevent submitting to underlying datalayer until approved
changeset
end
end