defmodule Ash.Resource.Transformers.CountableActions do @moduledoc """ Ensures that countable paginated actions do not exist for resources that are not countable """ use Spark.Dsl.Transformer alias Spark.Dsl.Transformer def after_compile?, do: true # sobelow_skip ["DOS.BinToAtom"] def transform(dsl_state) do dsl_state |> Transformer.get_entities([:actions]) |> Enum.filter(fn action -> action.type == :read && action.pagination && action.pagination.countable end) |> case do [] -> {:ok, dsl_state} [action | _] -> data_layer = Transformer.get_persisted(dsl_state, :data_layer) resource = Transformer.get_persisted(dsl_state, :module) if data_layer && data_layer.can?(resource, {:query_aggregate, :count}) do {:ok, dsl_state} else {:error, Spark.Error.DslError.exception( module: resource, path: [:actions, action.name], message: "Action cannot be countable, as the datalayer does not support counting queries" )} end end end end