Packages
absinthe
1.7.4
1.11.0
1.10.2
1.10.1
1.10.0
1.9.1
1.9.0
1.8.0
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.8
1.6.7
retired
1.6.6
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.6.0-rc.1
1.6.0-rc.0
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.5.0-rc.5
1.5.0-rc.4
1.5.0-rc.3
1.5.0-rc.2
1.5.0-rc.1
1.5.0-rc.0
1.5.0-beta.2
1.5.0-beta.1
1.5.0-beta.0
1.5.0-alpha.4
1.5.0-alpha.3
1.5.0-alpha.2
1.5.0-alpha.1
1.5.0-alpha.0
1.4.16
1.4.15
1.4.14
1.4.13
1.4.12
1.4.11
1.4.10
1.4.9
1.4.8
retired
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.4.0-rc.3
1.4.0-rc.2
1.4.0-rc.1
1.4.0-rc.0
1.4.0-beta.5
1.4.0-beta.4
1.4.0-beta.3
1.4.0-beta.2
1.4.0-beta.1
1.3.2
1.3.1
1.3.0
1.3.0-rc.0
1.3.0-beta.2
1.3.0-beta.1
1.3.0-beta.0
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc.0
1.2.0-beta.0
1.2.0-alpha0
1.2.0-alpha.2
1.2.0-alpha.1
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
0.5.2
0.5.1
0.5.0
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.2.3
0.2.2
0.2.1
0.1.0
GraphQL for Elixir
Security advisory:
This version has known vulnerabilities.
View advisories
Current section
Files
Jump to
Current section
Files
lib/absinthe/phase/schema/validation/object_must_define_fields.ex
defmodule Absinthe.Phase.Schema.Validation.ObjectMustDefineFields do
@moduledoc false
use Absinthe.Phase
alias Absinthe.Blueprint
def run(bp, _) do
bp = Blueprint.prewalk(bp, &handle_schemas/1)
{:ok, bp}
end
defp handle_schemas(%Blueprint.Schema.SchemaDefinition{} = schema) do
schema = Blueprint.prewalk(schema, &validate_objects/1)
{:halt, schema}
end
defp handle_schemas(obj) do
obj
end
defp validate_objects(%Blueprint.Schema.TypeExtensionDefinition{} = node) do
{:halt, node}
end
defp validate_objects(%struct{} = node)
when struct in [
Blueprint.Schema.ObjectTypeDefinition,
Blueprint.Schema.InterfaceTypeDefinition,
Blueprint.Schema.InputObjectTypeDefinition
] do
if defines_fields?(node) do
node
else
put_error(node, error(node))
end
end
defp validate_objects(node) do
node
end
defp defines_fields?(%{fields: []}) do
false
end
defp defines_fields?(object) do
!Enum.all?(object.fields, &introspection?(&1))
end
defp introspection?(%{name: "__" <> _}), do: true
defp introspection?(_), do: false
defp error(object) do
%Absinthe.Phase.Error{
message: explanation(object),
locations: [object.__reference__.location],
phase: __MODULE__
}
end
def explanation(object) do
kind = Absinthe.Blueprint.Schema.struct_to_kind(object)
"The #{kind} type `#{object.identifier}` must define one or more fields."
end
end