fix: properly halt on action errors in before_action hooks

This commit is contained in:
Zach Daniel 2023-01-30 11:52:35 -05:00
parent 28b7def5c9
commit dbb9dd4c98
5 changed files with 38 additions and 10 deletions

View file

@ -430,14 +430,14 @@ defmodule Ash.Actions.Create do
)}
{:error, error} ->
{:error, error}
{:error, Ash.Changeset.add_error(changeset, error)}
end
else
{:error, changeset.errors}
{:error, changeset}
end
end
else
{:error, changeset.errors}
{:error, changeset}
end
end
end)
@ -477,6 +477,9 @@ defmodule Ash.Actions.Create do
authorize?: authorize?
)
{:error, %Ash.Changeset{} = changeset} ->
{:error, changeset.errors, %{set: %{changeset: changeset}}}
other ->
other
end

View file

@ -312,7 +312,7 @@ defmodule Ash.Actions.Destroy do
})}
{:error, error} ->
{:error, error}
{:error, Ash.Changeset.add_error(changeset, error)}
end
end
end
@ -329,6 +329,9 @@ defmodule Ash.Actions.Destroy do
{:ok, Helpers.select(result, changeset), instructions}
{:error, %Ash.Changeset{} = changeset} ->
{:error, changeset.errors, %{set: %{changeset: changeset}}}
{:error, error} ->
{:error, error}
end

View file

@ -333,6 +333,9 @@ defmodule Ash.Actions.Read do
%{valid?: false} = query ->
{:error, query.errors}
{:error, %Ash.Query{} = query} ->
{:error, query.errors, %{set: %{query: query}}}
other ->
other
end
@ -1241,13 +1244,19 @@ defmodule Ash.Actions.Read do
query = Ash.Query.put_context(query, :private, %{in_before_action?: true})
query.before_action
|> Enum.reduce({query, []}, fn before_action, {query, notifications} ->
|> Enum.reduce_while({query, []}, fn before_action, {query, notifications} ->
case before_action.(query) do
{%{valid?: false} = query, _} ->
{:halt, {query, []}}
%{valid?: false} = query ->
{:halt, {query, []}}
{query, new_notifications} ->
{query, notifications ++ new_notifications}
{:cont, {query, notifications ++ new_notifications}}
query ->
{query, notifications}
{:cont, {query, notifications}}
end
end)
end

View file

@ -448,10 +448,10 @@ defmodule Ash.Actions.Update do
)}
{:error, error} ->
{:error, error}
{:error, Ash.Changeset.add_error(changeset, error)}
end
else
{:error, changeset.errors}
{:error, changeset}
end
end
end)
@ -477,6 +477,9 @@ defmodule Ash.Actions.Update do
end
|> run_after_action(changeset, after_action)
{:error, %Ash.Changeset{} = changeset} ->
{:error, changeset.errors, %{set: %{changeset: changeset}}}
other ->
other
end

View file

@ -295,8 +295,12 @@ defmodule Ash.Engine.Request do
log(request, fn -> "#{key} waiting on dependencies: #{inspect(waiting_for)}" end)
{:waiting, new_request, notifications, waiting_for}
{:error, error, new_request} ->
log(request, fn -> "error fetching #{key}: #{inspect(error)}" end)
{:error, error, new_request}
{:error, error} ->
log(request, fn -> "error fetching data: #{inspect(error)}" end)
log(request, fn -> "error fetching #{key}: #{inspect(error)}" end)
{:error, error, request}
end
end
@ -1166,6 +1170,12 @@ defmodule Ash.Engine.Request do
notifications
)
{:error, error, %{set: %{changeset: new_changeset}}} ->
{:error, error, %{request | changeset: new_changeset}}
{:error, error, %{set: %{query: new_query}}} ->
{:error, error, %{request | query: new_query}}
{:error, error} ->
log(request, fn ->
"error resolving #{field}:\n #{inspect(error)}"