Ash is not triggering `before_action` hook callback function when updates are atomic

Ash is not triggering before_action hook’s callback function if the update action is atomic, but when I set require_atomic? false in the action, Ash calls thecallback function (request_approval/3) as expected. The create action works well. I am not sure why the update action is not working as expected on the atomic updates. What could I be getting wrong? Below is my change:
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
Solution:
Responded on ElixirForum: atomic actions don't support before action hooks
Jump to solution
5 Replies
Solution
ZachDaniel
ZachDaniel4w ago
Responded on ElixirForum: atomic actions don't support before action hooks
ZachDaniel
ZachDaniel4w ago
So we're skipping them because we aren't expecting any to be added It should be an error though
Kamaro
KamaroOP4w ago
It seems like even before transaction hook isn't supported by atomic updates. I hope we'll support them in the future.
ZachDaniel
ZachDaniel4w ago
We cannot 😄 It is essentially the definition of atomicity that you cannot read the record before updating it.
Kamaro
KamaroOP4w ago
shouldn't set_results prevent running underlying datalyer even on atomic update?

Did you find this page helpful?