From 3b8a15fd3473c34cd15a521f78b28fe247fc9210 Mon Sep 17 00:00:00 2001 From: Zach Daniel Date: Tue, 16 Apr 2024 20:24:06 +0100 Subject: [PATCH] fix: ensure changeset filters are applied on bulk destroy/update --- lib/ash/actions/destroy/bulk.ex | 5 +++++ lib/ash/actions/update/bulk.ex | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/lib/ash/actions/destroy/bulk.ex b/lib/ash/actions/destroy/bulk.ex index 14ba90cf2..6dda08f0b 100644 --- a/lib/ash/actions/destroy/bulk.ex +++ b/lib/ash/actions/destroy/bulk.ex @@ -369,6 +369,7 @@ defmodule Ash.Actions.Destroy.Bulk do with {:ok, query} <- authorize_bulk_query(query, atomic_changeset, opts), {:ok, atomic_changeset, query} <- authorize_atomic_changeset(query, atomic_changeset, opts), + {query, atomic_changeset} <- add_changeset_filters(query, atomic_changeset), {:ok, data_layer_query} <- Ash.Query.data_layer_query(query) do case Ash.DataLayer.destroy_query( data_layer_query, @@ -530,6 +531,10 @@ defmodule Ash.Actions.Destroy.Bulk do end end + defp add_changeset_filters(query, changeset) do + {Ash.Query.filter(query, changeset.filter), %{changeset | filter: nil}} + end + defp do_run(domain, stream, action, input, opts, not_atomic_reason) do resource = opts[:resource] opts = Ash.Actions.Helpers.set_opts(opts, domain) diff --git a/lib/ash/actions/update/bulk.ex b/lib/ash/actions/update/bulk.ex index 67063a5c3..3c023727a 100644 --- a/lib/ash/actions/update/bulk.ex +++ b/lib/ash/actions/update/bulk.ex @@ -337,6 +337,7 @@ defmodule Ash.Actions.Update.Bulk do authorize_bulk_query(query, atomic_changeset, opts), {:ok, atomic_changeset, query} <- authorize_atomic_changeset(query, atomic_changeset, opts), + {query, atomic_changeset} <- add_changeset_filters(query, atomic_changeset), {:ok, data_layer_query} <- Ash.Query.data_layer_query(query) do case Ash.DataLayer.update_query( data_layer_query, @@ -955,6 +956,10 @@ defmodule Ash.Actions.Update.Bulk do |> Enum.with_index() end + defp add_changeset_filters(query, changeset) do + {Ash.Query.filter(query, changeset.filter), %{changeset | filter: nil}} + end + defp pre_template(opts, changeset, actor) do if Ash.Expr.template_references_context?(opts) do opts