Ash FrameworkAF
Ash Framework3mo ago
9 replies
Kamaro

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
Solution
Responded on ElixirForum: atomic actions don't support before action hooks
Was this page helpful?