mirror of
https://github.com/ash-project/ash.git
synced 2024-09-20 05:23:03 +12:00
fix: properly halt on action errors in before_action
hooks
This commit is contained in:
parent
28b7def5c9
commit
dbb9dd4c98
5 changed files with 38 additions and 10 deletions
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)}"
|
||||
|
|
Loading…
Reference in a new issue