fix: undo regression where errors weren't wrapped in a changeset

This commit is contained in:
Zach Daniel 2023-10-13 16:51:10 -04:00
parent 7ff3a96db2
commit 5a462a3ffc
6 changed files with 22 additions and 12 deletions

View file

@ -461,7 +461,7 @@ defmodule Ash.Actions.Create do
upsert? ->
resource
|> Ash.DataLayer.upsert(changeset, upsert_keys)
|> Ash.Actions.Helpers.rollback_if_in_transaction(changeset.resource)
|> Ash.Actions.Helpers.rollback_if_in_transaction(changeset)
|> add_tenant(changeset)
|> manage_relationships(api, changeset,
actor: actor,
@ -472,7 +472,7 @@ defmodule Ash.Actions.Create do
true ->
resource
|> Ash.DataLayer.create(changeset)
|> Ash.Actions.Helpers.rollback_if_in_transaction(changeset.resource)
|> Ash.Actions.Helpers.rollback_if_in_transaction(changeset)
|> add_tenant(changeset)
|> manage_relationships(api, changeset,
actor: actor,

View file

@ -323,10 +323,10 @@ defmodule Ash.Actions.Destroy do
if result = changeset.context[:private][:action_result] do
result
else
resource
|> Ash.DataLayer.destroy(changeset)
|> Ash.Actions.Helpers.rollback_if_in_transaction(changeset.resource)
|> case do
resource
|> Ash.DataLayer.destroy(changeset)
|> Ash.Actions.Helpers.rollback_if_in_transaction(changeset)
|> case do
:ok ->
{:ok,
Ash.Resource.set_meta(record, %Ecto.Schema.Metadata{

View file

@ -2,9 +2,9 @@ defmodule Ash.Actions.Helpers do
@moduledoc false
require Logger
def rollback_if_in_transaction({:error, error}, resource) do
if Ash.DataLayer.in_transaction?(resource) do
Ash.DataLayer.rollback(resource, error)
def rollback_if_in_transaction({:error, error}, changeset) do
if Ash.DataLayer.in_transaction?(changeset.resource) do
Ash.DataLayer.rollback(changeset.resource, Ash.Changeset.add_error(changeset, error))
else
{:error, error}
end

View file

@ -453,7 +453,7 @@ defmodule Ash.Actions.Update do
resource
|> Ash.DataLayer.update(changeset)
|> Ash.Actions.Helpers.rollback_if_in_transaction(changeset.resource)
|> Ash.Actions.Helpers.rollback_if_in_transaction(changeset)
|> add_tenant(changeset)
|> manage_relationships(api, changeset,
actor: actor,

View file

@ -1814,8 +1814,12 @@ defmodule Ash.Changeset do
case resources do
[] ->
{:error, error}
_ ->
Ash.DataLayer.rollback(changeset.resource, error)
Ash.DataLayer.rollback(
changeset.resource,
Ash.Changeset.add_error(changeset, error)
)
end
other ->
@ -1842,6 +1846,7 @@ defmodule Ash.Changeset do
end
{:ok, value, changeset, Map.put(instructions, :notifications, notifications)}
{:ok, {:error, error}} ->
{:error, error}
@ -3987,6 +3992,10 @@ defmodule Ash.Changeset do
)
end
def add_error(changeset, %__MODULE__{errors: errors}, path) do
add_error(changeset, errors, path)
end
def add_error(changeset, error, path) do
error
|> Ash.Error.set_path(path)

View file

@ -259,7 +259,8 @@ defmodule Ash.Type.NewType do
@impl Ash.Type
def storage_type(constraints) do
unquote(subtype_of).storage_type(
type_constraints(constraints, unquote(subtype_constraints)))
type_constraints(constraints, unquote(subtype_constraints))
)
end
@impl Ash.Type