defmodule Item do
actions do
defaults [:read, :destroy]
update :update_order do
accept [:order]
end
end
end
defmodule List do
actions do
update :destroy_item_and_update_item_orders do
require_atomic? false
argument :item, :map, allow_nil?: false, description: "The item to destroy"
argument :items, {:array, :map}, allow_nil?: false
change before_action(fn changeset, context ->
Ash.Changeset.get_argument(changeset, :item)
|> Ash.Changeset.for_destroy(:destroy)
|> Ash.destroy!(authorize?: false)
changeset
end)
change before_action(fn changeset, context ->
destroyed_item = Ash.Changeset.get_argument(changeset, :item)
updated_items =
Ash.Changeset.get_argument(changeset, :items)
|> Enum.reject(&(&1.id == destroyed_item.id))
|> Enum.sort_by(& &1.order)
|> Enum.with_index(1)
|> Enum.map(fn {item, index} -> %{item | order: index} end)
Ash.Changeset.manage_relationship(changeset, :items, updated_items,
on_match: {:update, :update_order}
)
end)
end
end
end
defmodule Item do
actions do
defaults [:read, :destroy]
update :update_order do
accept [:order]
end
end
end
defmodule List do
actions do
update :destroy_item_and_update_item_orders do
require_atomic? false
argument :item, :map, allow_nil?: false, description: "The item to destroy"
argument :items, {:array, :map}, allow_nil?: false
change before_action(fn changeset, context ->
Ash.Changeset.get_argument(changeset, :item)
|> Ash.Changeset.for_destroy(:destroy)
|> Ash.destroy!(authorize?: false)
changeset
end)
change before_action(fn changeset, context ->
destroyed_item = Ash.Changeset.get_argument(changeset, :item)
updated_items =
Ash.Changeset.get_argument(changeset, :items)
|> Enum.reject(&(&1.id == destroyed_item.id))
|> Enum.sort_by(& &1.order)
|> Enum.with_index(1)
|> Enum.map(fn {item, index} -> %{item | order: index} end)
Ash.Changeset.manage_relationship(changeset, :items, updated_items,
on_match: {:update, :update_order}
)
end)
end
end
end