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, error}
|
{:error, Ash.Changeset.add_error(changeset, error)}
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
{:error, changeset.errors}
|
{:error, changeset}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
{:error, changeset.errors}
|
{:error, changeset}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
@ -477,6 +477,9 @@ defmodule Ash.Actions.Create do
|
||||||
authorize?: authorize?
|
authorize?: authorize?
|
||||||
)
|
)
|
||||||
|
|
||||||
|
{:error, %Ash.Changeset{} = changeset} ->
|
||||||
|
{:error, changeset.errors, %{set: %{changeset: changeset}}}
|
||||||
|
|
||||||
other ->
|
other ->
|
||||||
other
|
other
|
||||||
end
|
end
|
||||||
|
|
|
@ -312,7 +312,7 @@ defmodule Ash.Actions.Destroy do
|
||||||
})}
|
})}
|
||||||
|
|
||||||
{:error, error} ->
|
{:error, error} ->
|
||||||
{:error, error}
|
{:error, Ash.Changeset.add_error(changeset, error)}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -329,6 +329,9 @@ defmodule Ash.Actions.Destroy do
|
||||||
|
|
||||||
{:ok, Helpers.select(result, changeset), instructions}
|
{:ok, Helpers.select(result, changeset), instructions}
|
||||||
|
|
||||||
|
{:error, %Ash.Changeset{} = changeset} ->
|
||||||
|
{:error, changeset.errors, %{set: %{changeset: changeset}}}
|
||||||
|
|
||||||
{:error, error} ->
|
{:error, error} ->
|
||||||
{:error, error}
|
{:error, error}
|
||||||
end
|
end
|
||||||
|
|
|
@ -333,6 +333,9 @@ defmodule Ash.Actions.Read do
|
||||||
%{valid?: false} = query ->
|
%{valid?: false} = query ->
|
||||||
{:error, query.errors}
|
{:error, query.errors}
|
||||||
|
|
||||||
|
{:error, %Ash.Query{} = query} ->
|
||||||
|
{:error, query.errors, %{set: %{query: query}}}
|
||||||
|
|
||||||
other ->
|
other ->
|
||||||
other
|
other
|
||||||
end
|
end
|
||||||
|
@ -1241,13 +1244,19 @@ defmodule Ash.Actions.Read do
|
||||||
query = Ash.Query.put_context(query, :private, %{in_before_action?: true})
|
query = Ash.Query.put_context(query, :private, %{in_before_action?: true})
|
||||||
|
|
||||||
query.before_action
|
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
|
case before_action.(query) do
|
||||||
|
{%{valid?: false} = query, _} ->
|
||||||
|
{:halt, {query, []}}
|
||||||
|
|
||||||
|
%{valid?: false} = query ->
|
||||||
|
{:halt, {query, []}}
|
||||||
|
|
||||||
{query, new_notifications} ->
|
{query, new_notifications} ->
|
||||||
{query, notifications ++ new_notifications}
|
{:cont, {query, notifications ++ new_notifications}}
|
||||||
|
|
||||||
query ->
|
query ->
|
||||||
{query, notifications}
|
{:cont, {query, notifications}}
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
|
@ -448,10 +448,10 @@ defmodule Ash.Actions.Update do
|
||||||
)}
|
)}
|
||||||
|
|
||||||
{:error, error} ->
|
{:error, error} ->
|
||||||
{:error, error}
|
{:error, Ash.Changeset.add_error(changeset, error)}
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
{:error, changeset.errors}
|
{:error, changeset}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
@ -477,6 +477,9 @@ defmodule Ash.Actions.Update do
|
||||||
end
|
end
|
||||||
|> run_after_action(changeset, after_action)
|
|> run_after_action(changeset, after_action)
|
||||||
|
|
||||||
|
{:error, %Ash.Changeset{} = changeset} ->
|
||||||
|
{:error, changeset.errors, %{set: %{changeset: changeset}}}
|
||||||
|
|
||||||
other ->
|
other ->
|
||||||
other
|
other
|
||||||
end
|
end
|
||||||
|
|
|
@ -295,8 +295,12 @@ defmodule Ash.Engine.Request do
|
||||||
log(request, fn -> "#{key} waiting on dependencies: #{inspect(waiting_for)}" end)
|
log(request, fn -> "#{key} waiting on dependencies: #{inspect(waiting_for)}" end)
|
||||||
{:waiting, new_request, notifications, waiting_for}
|
{: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} ->
|
{:error, error} ->
|
||||||
log(request, fn -> "error fetching data: #{inspect(error)}" end)
|
log(request, fn -> "error fetching #{key}: #{inspect(error)}" end)
|
||||||
{:error, error, request}
|
{:error, error, request}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1166,6 +1170,12 @@ defmodule Ash.Engine.Request do
|
||||||
notifications
|
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} ->
|
{:error, error} ->
|
||||||
log(request, fn ->
|
log(request, fn ->
|
||||||
"error resolving #{field}:\n #{inspect(error)}"
|
"error resolving #{field}:\n #{inspect(error)}"
|
||||||
|
|
Loading…
Reference in a new issue