defmodule AshGraphql.Resource.Query do @moduledoc "Represents a configured query on a resource" defstruct [ :name, :action, :type, :identity, :allow_nil?, :modify_resolution, as_mutation?: false, metadata_names: [], metadata_types: [], show_metadata: nil, type_name: nil, relay?: false ] @query_schema [ name: [ type: :atom, doc: "The name to use for the query.", default: :get ], action: [ type: :atom, doc: "The action to use for the query.", required: true ], type_name: [ type: :atom, doc: """ Override the type name returned by this query. Must be set if the read action has `metadata` that is not hidden via the `show_metadata` key. """ ], metadata_names: [ type: :keyword_list, default: [], doc: "Name overrides for metadata fields on the read action." ], metadata_types: [ type: :keyword_list, default: [], doc: "Type overrides for metadata fields on the read action." ], show_metadata: [ type: {:list, :atom}, doc: "The metadata attributes to show. Defaults to all." ], as_mutation?: [ type: :boolean, default: false, doc: """ Places the query in the `mutations` key instead. Not typically necessary, but is often paired with `as_mutation?`. See the [the guide](/documentation/topics/modifying-the-resolution.html) for more. """ ] ] @get_schema [ identity: [ type: :atom, doc: "The identity to use for looking up the record. Pass `false` to not use an identity.", required: false ], allow_nil?: [ type: :boolean, default: true, doc: "Whether or not the action can return nil." ], modify_resolution: [ type: :mfa, doc: """ An MFA that will be called with the resolution, the query, and the result of the action as the first three arguments. See the [the guide](/documentation/topics/modifying-the-resolution.html) for more. """ ] ] |> Spark.OptionsHelpers.merge_schemas(@query_schema, "Shared Query Options") @read_one_schema [ allow_nil?: [ type: :boolean, default: true, doc: "Whether or not the action can return nil." ] ] |> Spark.OptionsHelpers.merge_schemas(@query_schema, "Shared Query Options") @list_schema [ relay?: [ type: :boolean, default: false, doc: """ If true, the graphql queries/resolvers for this resource will be built to honor the relay specification. See [the relay guide](/documentation/topics/relay.html) for more. """ ] ] |> Spark.OptionsHelpers.merge_schemas(@query_schema, "Shared Query Options") def get_schema, do: @get_schema def read_one_schema, do: @read_one_schema def list_schema, do: @list_schema end