mirror of
https://github.com/ash-project/ash.git
synced 2024-09-20 13:33:20 +12:00
improvement: validate aggregate paths supported
This commit is contained in:
parent
e36f8c3e59
commit
2dae8ffa44
2 changed files with 43 additions and 1 deletions
|
@ -1227,7 +1227,8 @@ defmodule Ash.Resource.Dsl do
|
|||
Ash.Resource.Transformers.SetTypes,
|
||||
Ash.Resource.Transformers.RequireUniqueFieldNames,
|
||||
Ash.Resource.Transformers.ValidateRelationshipAttributes,
|
||||
Ash.Resource.Transformers.ValidateEagerIdentities
|
||||
Ash.Resource.Transformers.ValidateEagerIdentities,
|
||||
Ash.Resource.Transformers.ValidateAggregatesSupported
|
||||
]
|
||||
|
||||
@moduledoc """
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
defmodule Ash.Resource.Transformers.ValidateAggregatesSupported do
|
||||
@moduledoc """
|
||||
Confirms that all aggregates are supported by the data layer
|
||||
"""
|
||||
use Spark.Dsl.Transformer
|
||||
|
||||
alias Spark.Dsl.Transformer
|
||||
alias Spark.Error.DslError
|
||||
|
||||
def after_compile?, do: true
|
||||
|
||||
def transform(dsl_state) do
|
||||
resource = Transformer.get_persisted(dsl_state, :module)
|
||||
|
||||
dsl_state
|
||||
|> Transformer.get_entities([:aggregates])
|
||||
|> Enum.each(fn %{relationship_path: relationship_path, name: name} ->
|
||||
check_aggregatable(resource, resource, name, relationship_path)
|
||||
end)
|
||||
|
||||
{:ok, dsl_state}
|
||||
end
|
||||
|
||||
defp check_aggregatable(_resource, _root_resource, _name, []), do: :ok
|
||||
|
||||
defp check_aggregatable(resource, root_resource, name, [relationship | rest]) do
|
||||
relationship = Ash.Resource.Info.relationship(resource, relationship)
|
||||
|
||||
if Ash.DataLayer.data_layer_can?(
|
||||
resource,
|
||||
{:aggregate_relationship, relationship}
|
||||
) do
|
||||
check_aggregatable(relationship.destination, root_resource, name, rest)
|
||||
else
|
||||
raise DslError,
|
||||
module: root_resource,
|
||||
message: "#{inspect(resource)}.#{relationship.name} is not aggregatable",
|
||||
path: [:aggregates, name]
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Reference in a new issue