ash/test/support/flow/flows/cancel_parent_resource.ex
2023-07-18 14:48:26 -04:00

82 lines
1.8 KiB
Elixir

defmodule Ash.Test.Flows.CancelParentResource do
@moduledoc false
use Ash.Flow
flow do
api Ash.Test.Flow.Api
argument :record, Ash.Test.Flow.ParentResource do
allow_nil? false
end
argument :status, :atom do
allow_nil? false
end
returns :parent_resource
end
steps do
custom :record_id, fn input, _ -> {:ok, input} end do
input path(arg(:record), [:id])
end
branch :maybe_cancel_child_resource, expr(not is_nil(^result(:record_id))) do
read :child_resources, Ash.Test.Flow.ChildResource, :read do
not_found_error? false
input %{
build: %{
filter: [parent_resource_id: path(arg(:record), [:id])]
}
}
end
map :cancel_child_resources, result(:child_resources) do
update :cancel_child_resource, Ash.Test.Flow.ChildResource, :system_cancel do
record element(:cancel_child_resources)
input %{actor: arg(:actor)}
end
end
end
update :parent_resource, Ash.Test.Flow.ParentResource, :system_disable do
record arg(:record)
wait_for [result(:cancel_child_resources)]
input %{
status: arg(:status)
}
end
end
end
defmodule Ash.Test.Actions.CancelParentResource do
@moduledoc false
use Ash.Resource.ManualUpdate
alias Ash.Test.Flows.CancelParentResource
@impl true
def update(%Ash.Changeset{data: record, arguments: %{status: status}}, _opts, _) do
%Ash.Flow.Result{
result: result,
errors: errors,
valid?: valid?
} = CancelParentResource.run(record, status)
case {result, errors, valid?} do
{resource, [], true} ->
{:ok, resource}
{_, errors, _} when is_list(errors) and length(errors) > 0 ->
{:error, errors}
{_, _, false} ->
{:error, "Invalid"}
end
end
end