defmodule AshGraphql.Resource.Verifiers.VerifyQueryMetadata do
@moduledoc "Ensures that queries for actions with metadata have a type set"
use Spark.Dsl.Verifier
alias Spark.Dsl.Transformer
def verify(dsl) do
dsl
|> AshGraphql.Resource.Info.queries()
|> Enum.each(fn query ->
action = Ash.Resource.Info.action(dsl, query.action)
show_metadata = query.show_metadata || Enum.map(Map.get(action, :metadata, []), & &1.name)
metadata =
action
|> Map.get(:metadata, [])
|> Enum.filter(&(&1.name in show_metadata))
if !Enum.empty?(metadata) && is_nil(query.type_name) do
resource = Transformer.get_persisted(dsl, :module)
raise Spark.Error.DslError,
module: resource,
message: """
Queries for actions with metadata must have a type configured on the query.
The #{query.action} action on #{inspect(resource)} has the following metadata fields:
#{Enum.map_join(action.metadata, "\n", &"* #{&1.name}")}
To generate a new type and include the metadata in that type, provide a new type
name, for example `type :user_with_token`.
To ignore the generated metadata, use the same type as the default.
"""
end
end)
:ok
end
end