Skip to content

Commit 93d0813

Browse files
committed
Parameterized field getters in type interface are missing parameters #859
1 parent 97fef96 commit 93d0813

File tree

8 files changed

+78
-14
lines changed

8 files changed

+78
-14
lines changed

src/main/java/com/kobylynskyi/graphql/codegen/mapper/DataModelMapperFactory.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,14 +23,14 @@ public class DataModelMapperFactory {
2323
public DataModelMapperFactory(MapperFactory mapperFactory) {
2424
this.mapperFactory = mapperFactory;
2525

26-
this.fieldDefToParamMapper = new FieldDefinitionToParameterMapper(mapperFactory);
26+
InputValueDefinitionToParameterMapper inputValueDefToParamMapper = new InputValueDefinitionToParameterMapper(
27+
mapperFactory);
28+
this.fieldDefToParamMapper = new FieldDefinitionToParameterMapper(mapperFactory, inputValueDefToParamMapper);
2729
this.enumDefToDataModelMapper = new EnumDefinitionToDataModelMapper(mapperFactory);
2830
this.unionDefToDataModelMapper = new UnionDefinitionToDataModelMapper(mapperFactory);
2931
this.typeDefToDataModelMapper = new TypeDefinitionToDataModelMapper(mapperFactory, fieldDefToParamMapper);
3032
this.interfaceDefToDataModelMapper = new InterfaceDefinitionToDataModelMapper(
3133
mapperFactory, fieldDefToParamMapper);
32-
InputValueDefinitionToParameterMapper inputValueDefToParamMapper = new InputValueDefinitionToParameterMapper(
33-
mapperFactory);
3434
this.inputDefToDataModelMapper = new InputDefinitionToDataModelMapper(
3535
mapperFactory, inputValueDefToParamMapper);
3636
this.fieldDefsToResolverDataModelMapper = new FieldDefinitionsToResolverDataModelMapper(

src/main/java/com/kobylynskyi/graphql/codegen/mapper/FieldDefinitionToParameterMapper.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,14 @@ public class FieldDefinitionToParameterMapper {
2323
private final GraphQLTypeMapper graphQLTypeMapper;
2424
private final DataModelMapper dataModelMapper;
2525
private final AnnotationsMapper annotationsMapper;
26+
private final InputValueDefinitionToParameterMapper inputValueDefinitionToParameterMapper;
2627

27-
public FieldDefinitionToParameterMapper(MapperFactory mapperFactory) {
28+
public FieldDefinitionToParameterMapper(MapperFactory mapperFactory,
29+
InputValueDefinitionToParameterMapper inputValueDefinitionToParameterMapper) {
2830
this.graphQLTypeMapper = mapperFactory.getGraphQLTypeMapper();
2931
this.dataModelMapper = mapperFactory.getDataModelMapper();
3032
this.annotationsMapper = mapperFactory.getAnnotationsMapper();
33+
this.inputValueDefinitionToParameterMapper = inputValueDefinitionToParameterMapper;
3134
}
3235

3336
/**
@@ -137,6 +140,8 @@ private ParameterDefinition mapField(MappingContext mappingContext, ExtendedFiel
137140
parameter.setDeprecated(DeprecatedDefinitionBuilder.build(mappingContext, fieldDef));
138141
parameter.setMandatory(namedDefinition.isMandatory());
139142
parameter.setSerializeUsingObjectMapper(namedDefinition.isSerializeUsingObjectMapper());
143+
parameter.setInputParameters(inputValueDefinitionToParameterMapper.map(
144+
mappingContext, fieldDef.getInputValueDefinitions(), fieldDef.getName()));
140145
return parameter;
141146
}
142147

src/main/java/com/kobylynskyi/graphql/codegen/model/ParameterDefinition.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ public class ParameterDefinition {
3131
private List<String> javaDoc = new ArrayList<>();
3232
private DeprecatedDefinition deprecated;
3333
private boolean serializeUsingObjectMapper;
34+
/**
35+
* If the type is parametrized then input parameters will be defined here
36+
*/
37+
private List<ParameterDefinition> inputParameters;
3438
/**
3539
* Definition of the same type, but defined in the parent
3640
*/
@@ -124,4 +128,12 @@ public ParameterDefinition getDefinitionInParentType() {
124128
public void setDefinitionInParentType(ParameterDefinition definitionInParentType) {
125129
this.definitionInParentType = definitionInParentType;
126130
}
131+
132+
public List<ParameterDefinition> getInputParameters() {
133+
return inputParameters;
134+
}
135+
136+
public void setInputParameters(List<ParameterDefinition> inputParameters) {
137+
this.inputParameters = inputParameters;
138+
}
127139
}

src/main/resources/templates/java-lang/interface.ftl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public interface ${className} <#if implements?has_content>extends <#list impleme
4141
<#list field.annotations as annotation>
4242
@${annotation}
4343
</#list>
44-
${field.type} get${field.name?cap_first}();
44+
${field.type} get${field.name?cap_first}(<#list field.inputParameters as param><#list param.annotations as paramAnnotation>@${paramAnnotation}<#if param.annotations?has_content> </#if></#list>${param.type} ${param.name}<#if param_has_next>, </#if></#list>);
4545

4646
</#list>
4747
</#if>

src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenTypesAsInterfacesTest.java

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88
import org.junit.jupiter.api.Test;
99

1010
import java.io.File;
11-
import java.util.Collections;
1211
import java.util.HashSet;
1312
import java.util.Objects;
1413

1514
import static com.kobylynskyi.graphql.codegen.TestUtils.assertSameTrimmedContent;
1615
import static com.kobylynskyi.graphql.codegen.TestUtils.getFileByName;
1716
import static java.util.Arrays.asList;
17+
import static java.util.Collections.singleton;
1818
import static java.util.Collections.singletonList;
1919

2020
class GraphQLCodegenTypesAsInterfacesTest {
@@ -26,7 +26,9 @@ class GraphQLCodegenTypesAsInterfacesTest {
2626
@BeforeEach
2727
void init() {
2828
mappingConfig.setPackageName("com.github.graphql");
29-
mappingConfig.setFieldsWithResolvers(Collections.singleton("@customResolver"));
29+
mappingConfig.setFieldsWithResolvers(singleton("@customResolver"));
30+
mappingConfig.setFieldsWithoutResolvers(singleton("@noResolver"));
31+
mappingConfig.setTypesAsInterfaces(new HashSet<>(singleton("@asInterface")));
3032
}
3133

3234
@AfterEach
@@ -36,7 +38,7 @@ void cleanup() {
3638

3739
@Test
3840
void generate_typesAsInterfaces() throws Exception {
39-
mappingConfig.setTypesAsInterfaces(new HashSet<>(asList("@asInterface", "Order")));
41+
mappingConfig.getTypesAsInterfaces().add("Order");
4042

4143
new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/types-as-interfaces.graphqls"),
4244
outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate();
@@ -68,16 +70,31 @@ void generate_typesAsInterfacesExtendsInterface() throws Exception {
6870
assertSameTrimmedContent(new File("src/test/resources/expected-classes/" +
6971
"types-as-interfaces-extends-interface/Node.java.txt"), getFileByName(files, "Node.java"));
7072
assertSameTrimmedContent(new File("src/test/resources/expected-classes/" +
71-
"types-as-interfaces-extends-interface/Profile.java.txt"),
73+
"types-as-interfaces-extends-interface/Profile.java.txt"),
7274
getFileByName(files, "Profile.java"));
7375
assertSameTrimmedContent(new File("src/test/resources/expected-classes/" +
74-
"types-as-interfaces-extends-interface/QueryResolver.java.txt"),
76+
"types-as-interfaces-extends-interface/QueryResolver.java.txt"),
7577
getFileByName(files, "QueryResolver.java"));
7678
assertSameTrimmedContent(new File("src/test/resources/expected-classes/" +
7779
"types-as-interfaces-extends-interface/User.java.txt"), getFileByName(files, "User.java"));
7880
assertSameTrimmedContent(new File("src/test/resources/expected-classes/" +
79-
"types-as-interfaces-extends-interface/UserCurrentQueryResolver.java.txt"),
81+
"types-as-interfaces-extends-interface/UserCurrentQueryResolver.java.txt"),
8082
getFileByName(files, "UserCurrentQueryResolver.java"));
8183
}
8284

85+
@Test
86+
void generate_typeAsInterfaceParametrized() throws Exception {
87+
mappingConfig.setGenerateParameterizedFieldsResolvers(true);
88+
89+
new JavaGraphQLCodegen(singletonList("src/test/resources/schemas/" +
90+
"types-as-interfaces-parametrized.graphqls"),
91+
outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate();
92+
93+
File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
94+
95+
assertSameTrimmedContent(new File(
96+
"src/test/resources/expected-classes/types-as-interfaces-parametrized/Foo.java.txt"),
97+
getFileByName(files, "Foo.java"));
98+
}
99+
83100
}

src/test/resources/expected-classes/ProfileOwner.java.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ package com.github.graphql;
77
)
88
public interface ProfileOwner {
99

10-
boolean getAnyPinnableItems();
10+
boolean getAnyPinnableItems(PinnableItemType type);
1111

1212
String getEmail();
1313

@@ -25,10 +25,10 @@ public interface ProfileOwner {
2525
String getName();
2626

2727
@javax.validation.constraints.NotNull
28-
PinnableItemConnection getPinnableItems();
28+
PinnableItemConnection getPinnableItems(String after, String before, Integer first, Integer last, @javax.validation.constraints.NotNull java.util.List<PinnableItemType> types);
2929

3030
@javax.validation.constraints.NotNull
31-
PinnableItemConnection getPinnedItems();
31+
PinnableItemConnection getPinnedItems(String after, String before, Integer first, Integer last, @javax.validation.constraints.NotNull java.util.List<PinnableItemType> types);
3232

3333
int getPinnedItemsRemaining();
3434

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.github.graphql;
2+
3+
4+
@javax.annotation.Generated(
5+
value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen",
6+
date = "2020-12-31T23:59:59-0500"
7+
)
8+
public interface Foo {
9+
10+
@javax.validation.constraints.NotNull
11+
String getSimpleField();
12+
13+
@javax.validation.constraints.NotNull
14+
String getParameterizedField(int count);
15+
16+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
"""
2+
used with typesAsInterfaces config
3+
"""
4+
directive @asInterface on OBJECT
5+
6+
"""
7+
used with fieldsWithResolvers config
8+
"""
9+
directive @noResolver on FIELD_DEFINITION
10+
11+
type Foo @asInterface {
12+
simpleField: String!
13+
parameterizedField(count: Int!): String! @noResolver
14+
}

0 commit comments

Comments
 (0)