diff --git a/lib/resource/resource.ex b/lib/resource/resource.ex index 1fc0e87d..d34d1e8f 100644 --- a/lib/resource/resource.ex +++ b/lib/resource/resource.ex @@ -2454,13 +2454,24 @@ defmodule AshGraphql.Resource do identifier: name, __reference__: AshGraphql.Resource.ref(env), name: to_string(name), - type: nested_type_name + type: + if Keyword.get( + attribute, + :allow_nil?, + true + ) do + nested_type_name + else + %Absinthe.Blueprint.TypeReference.NonNull{ + of_type: nested_type_name + } + end } | fields ] } - _ -> + {type, _} -> {types, [ %Absinthe.Blueprint.Schema.FieldDefinition{ @@ -2468,7 +2479,18 @@ defmodule AshGraphql.Resource do identifier: name, __reference__: AshGraphql.Resource.ref(env), name: to_string(name), - type: do_field_type(attribute[:type], nil, nil, false) + type: + if Keyword.get( + attribute, + :allow_nil?, + true + ) do + do_field_type(type, nil, nil, false) + else + %Absinthe.Blueprint.TypeReference.NonNull{ + of_type: do_field_type(type, nil, nil, false) + } + end } | fields ]} @@ -2515,13 +2537,20 @@ defmodule AshGraphql.Resource do identifier: name, __reference__: AshGraphql.Resource.ref(env), name: to_string(name), - type: nested_type_name + type: + if Keyword.get(attribute, :allow_nil?, true) do + nested_type_name + else + %Absinthe.Blueprint.TypeReference.NonNull{ + of_type: nested_type_name + } + end } | fields ] } - _ -> + {type, _} -> {types, [ %Absinthe.Blueprint.Schema.InputValueDefinition{ @@ -2529,7 +2558,14 @@ defmodule AshGraphql.Resource do identifier: name, __reference__: AshGraphql.Resource.ref(env), name: to_string(name), - type: do_field_type(attribute[:type], nil, nil, false) + type: + if Keyword.get(attribute, :allow_nil?, true) do + do_field_type(type, nil, nil, false) + else + %Absinthe.Blueprint.TypeReference.NonNull{ + of_type: do_field_type(type, nil, nil, false) + } + end } | fields ]} diff --git a/test/attribute_test.exs b/test/attribute_test.exs index 84e84d5c..e23e667d 100644 --- a/test/attribute_test.exs +++ b/test/attribute_test.exs @@ -157,8 +157,11 @@ defmodule AshGraphql.AttributeTest do data["__type"]["inputFields"] |> Enum.find(fn field -> field["name"] == "foo" end) - assert foo_field["type"]["kind"] == "SCALAR" - assert foo_field["type"]["name"] == "String" + # non null field + assert foo_field["type"]["kind"] == "NON_NULL" + + assert foo_field["type"]["ofType"]["kind"] == "SCALAR" + assert foo_field["type"]["ofType"]["name"] == "String" bar_field = data["__type"]["inputFields"] @@ -257,7 +260,11 @@ defmodule AshGraphql.AttributeTest do }, %{ "name" => "fooBar", - "type" => %{"kind" => "SCALAR", "name" => "String", "ofType" => nil} + "type" => %{ + "kind" => "NON_NULL", + "name" => nil, + "ofType" => %{"kind" => "SCALAR", "name" => "String"} + } } ] } @@ -301,7 +308,11 @@ defmodule AshGraphql.AttributeTest do }, %{ "name" => "fooBar", - "type" => %{"kind" => "SCALAR", "name" => "String", "ofType" => nil} + "type" => %{ + "kind" => "NON_NULL", + "name" => nil, + "ofType" => %{"kind" => "SCALAR", "name" => "String"} + } } ] } diff --git a/test/support/resources/map_types.ex b/test/support/resources/map_types.ex index 361ea8d5..f11ae12c 100644 --- a/test/support/resources/map_types.ex +++ b/test/support/resources/map_types.ex @@ -11,7 +11,8 @@ defmodule AshGraphql.Test.MapTypes do constraints( fields: [ foo: [ - type: :string + type: :string, + allow_nil?: false ], bar: [ type: :integer @@ -39,7 +40,8 @@ defmodule AshGraphql.Test.MapTypes do constraints( fields: [ foo: [ - type: :string + type: :string, + allow_nil?: false ], bar: [ type: :integer