Packages
absinthe
1.7.10
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/unique_field_names.ex
defmodule Absinthe.Phase.Schema.Validation.UniqueFieldNames do
@moduledoc false
@behaviour Absinthe.Phase
alias Absinthe.Blueprint
def run(bp, _) do
bp =
bp
|> Blueprint.prewalk(&handle_schemas(&1, :name))
|> Blueprint.prewalk(&handle_schemas(&1, :identifier))
{:ok, bp}
end
defp handle_schemas(%Blueprint.Schema.SchemaDefinition{} = schema, key) do
schema = Blueprint.prewalk(schema, &validate_types(&1, key))
{:halt, schema}
end
defp handle_schemas(obj, _) do
obj
end
defp validate_types(%type{} = object, key)
when type in [
Blueprint.Schema.InputObjectTypeDefinition,
Blueprint.Schema.InterfaceTypeDefinition,
Blueprint.Schema.ObjectTypeDefinition
] do
fields =
for field <- object.fields do
name_counts = Enum.frequencies_by(object.fields, &Map.get(&1, key))
if duplicate?(name_counts, field, key) do
Absinthe.Phase.put_error(field, error(field, object, key))
else
field
end
end
%{object | fields: fields}
end
defp validate_types(type, _) do
type
end
defp duplicate?(name_counts, field, key) do
field_identifier = Map.get(field, key)
Map.get(name_counts, field_identifier, 0) > 1
end
defp error(field, object, key) do
%Absinthe.Phase.Error{
message: explanation(field, object, key),
locations: [field.__reference__.location],
phase: __MODULE__,
extra: field
}
end
def explanation(field, object, :name) do
"""
The field #{inspect(field.name)} is not unique in type #{inspect(object.name)}.
The field must have a unique name within that Object type; no two fields may share the same name.
"""
end
def explanation(field, object, :identifier) do
"""
The field identifier #{inspect(field.identifier)} is not unique in type #{inspect(object.name)}.
The field must have a unique identifier within that Object type; no two fields may share the same identifier.
"""
end
end