diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java index 026fe265c69cbeb794e32474ba47ebbb752cb1bd..ae84e74417b4ac863b4c82fb5b4d9ac43613013d 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/GraphQLCodegen.java @@ -279,8 +279,7 @@ public class GraphQLCodegen { for (ExtendedInterfaceTypeDefinition definition : document.getInterfaceDefinitions()) { generateFieldResolver(context, definition.getFieldDefinitions(), definition).ifPresent(generatedFiles::add); } - System.out.println(String.format("Generated %d definition classes in folder %s", - generatedFiles.size(), outputDir.getAbsolutePath())); + System.out.printf("Generated %d definition classes in folder %s%n", generatedFiles.size(), outputDir.getAbsolutePath()); return generatedFiles; } @@ -304,6 +303,13 @@ public class GraphQLCodegen { if (Boolean.TRUE.equals(mappingConfig.getGenerateClient())) { Map responseProjDataModel = RequestResponseDefinitionToDataModelMapper.mapResponseProjection(mappingContext, definition); generatedFiles.add(GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.responseProjectionTemplate, responseProjDataModel, outputDir)); + + for (ExtendedFieldDefinition fieldDefinition : definition.getFieldDefinitions()) { + if (!Utils.isEmpty(fieldDefinition.getInputValueDefinitions())) { + Map fieldProjDataModel = RequestResponseDefinitionToDataModelMapper.mapParametrizedInput(mappingContext, fieldDefinition, definition); + generatedFiles.add(GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.parametrizedInputTemplate, fieldProjDataModel, outputDir)); + } + } } return generatedFiles; } @@ -398,12 +404,14 @@ public class GraphQLCodegen { private Optional generateFieldResolver(MappingContext mappingContext, List fieldDefinitions, ExtendedDefinition parentDefinition) { - List fieldDefsWithResolvers = fieldDefinitions.stream() - .filter(fieldDef -> FieldDefinitionToParameterMapper.generateResolversForField(mappingContext, fieldDef, parentDefinition)) - .collect(toList()); - if (!fieldDefsWithResolvers.isEmpty()) { - Map dataModel = FieldDefinitionsToResolverDataModelMapper.mapToTypeResolver(mappingContext, fieldDefsWithResolvers, parentDefinition.getName()); - return Optional.of(GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.operationsTemplate, dataModel, outputDir)); + if (Boolean.TRUE.equals(mappingConfig.getGenerateApis())) { + List fieldDefsWithResolvers = fieldDefinitions.stream() + .filter(fieldDef -> FieldDefinitionToParameterMapper.generateResolversForField(mappingContext, fieldDef, parentDefinition)) + .collect(toList()); + if (!fieldDefsWithResolvers.isEmpty()) { + Map dataModel = FieldDefinitionsToResolverDataModelMapper.mapToTypeResolver(mappingContext, fieldDefsWithResolvers, parentDefinition.getName()); + return Optional.of(GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.operationsTemplate, dataModel, outputDir)); + } } return Optional.empty(); } diff --git a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/RequestResponseDefinitionToDataModelMapper.java b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/RequestResponseDefinitionToDataModelMapper.java index 6251d9b901bb153118aec539bf39c4d68e2c8ad1..a4452314f60442b136a58134dcf7530cf4b76148 100644 --- a/src/main/java/com/kobylynskyi/graphql/codegen/mapper/RequestResponseDefinitionToDataModelMapper.java +++ b/src/main/java/com/kobylynskyi/graphql/codegen/mapper/RequestResponseDefinitionToDataModelMapper.java @@ -64,7 +64,7 @@ public class RequestResponseDefinitionToDataModelMapper { */ public static Map mapParametrizedInput(MappingContext mappingContext, ExtendedFieldDefinition fieldDefinition, - ExtendedObjectTypeDefinition parentTypeDefinition) { + ExtendedDefinition parentTypeDefinition) { String className = MapperUtils.getParametrizedInputClassName(mappingContext, fieldDefinition, parentTypeDefinition); Map dataModel = new HashMap<>(); // ParametrizedInput classes are sharing the package with the model classes, so no imports are needed diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java index e75c4d86d24cbfa8933a8666a073414ce28d9d22..48add0c54fe259a702dc239be90da5e05cc61002 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenFieldsResolversTest.java @@ -50,6 +50,19 @@ class GraphQLCodegenFieldsResolversTest { getFileByName(files, "CommitResolver.java")); } + @Test + void generate_ParametrizedFieldsInInterface() throws Exception { + mappingConfig.setGenerateClient(true); + mappingConfig.setGenerateApis(false); + + new GraphQLCodegen(singletonList("src/test/resources/schemas/parametrized-input-client.graphqls"), + outputBuildDir, mappingConfig, TestUtils.getStaticGeneratedInfo()).generate(); + + File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); + assertSameTrimmedContent(new File("src/test/resources/expected-classes/request/ProductLinkCodeParametrizedInput.java.txt"), + getFileByName(files, "ProductLinkCodeParametrizedInput.java")); + } + @Test void generate_CustomFieldsResolvers() throws Exception { mappingConfig.setModelNamePrefix("Github"); diff --git a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenModelsForRootTypesTest.java b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenModelsForRootTypesTest.java index c47c877ed54ae8eb0664a1557c1134d9d6a91613..3dda53246230beecb08180d77efc39e44b05f051 100644 --- a/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenModelsForRootTypesTest.java +++ b/src/test/java/com/kobylynskyi/graphql/codegen/GraphQLCodegenModelsForRootTypesTest.java @@ -70,8 +70,8 @@ class GraphQLCodegenModelsForRootTypesTest { File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); List generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); - assertEquals(Arrays.asList("Event.java", "EventProperty.java", "EventPropertyResolver.java", "EventStatus.java", - "Mutation.java", "MutationResolver.java", "Query.java", "QueryResolver.java", "Subscription.java"), + assertEquals(Arrays.asList("Event.java", "EventProperty.java", "EventStatus.java", + "Mutation.java", "Query.java", "Subscription.java"), generatedFileNames); } diff --git a/src/test/resources/expected-classes/request/ProductLinkCodeParametrizedInput.java.txt b/src/test/resources/expected-classes/request/ProductLinkCodeParametrizedInput.java.txt new file mode 100644 index 0000000000000000000000000000000000000000..6f51a4c6930cb4f129b464725f678fea30677932 --- /dev/null +++ b/src/test/resources/expected-classes/request/ProductLinkCodeParametrizedInput.java.txt @@ -0,0 +1,41 @@ +package com.github.graphql; + +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLParametrizedInput; +import com.kobylynskyi.graphql.codegen.model.graphql.GraphQLRequestSerializer; +import java.util.StringJoiner; + +/** + * Parametrized input for field linkCode in type Product + */ +@javax.annotation.Generated( + value = "com.kobylynskyi.graphql.codegen.GraphQLCodegen", + date = "2020-12-31T23:59:59-0500" +) +public class ProductLinkCodeParametrizedInput implements GraphQLParametrizedInput { + + @javax.validation.constraints.NotNull + private String pid; + + public ProductLinkCodeParametrizedInput() { + } + + public ProductLinkCodeParametrizedInput(String pid) { + this.pid = pid; + } + + public ProductLinkCodeParametrizedInput pid(String pid) { + this.pid = pid; + return this; + } + + + @Override + public String toString() { + StringJoiner joiner = new StringJoiner(", ", "(", ")"); + if (pid != null) { + joiner.add("pid: " + GraphQLRequestSerializer.getEntry(pid)); + } + return joiner.toString(); + } + +} \ No newline at end of file diff --git a/src/test/resources/schemas/parametrized-input-client.graphqls b/src/test/resources/schemas/parametrized-input-client.graphqls new file mode 100644 index 0000000000000000000000000000000000000000..3b54aa9752628430bdc3106a8c2926f1f97ad7cb --- /dev/null +++ b/src/test/resources/schemas/parametrized-input-client.graphqls @@ -0,0 +1,15 @@ +type Query { + product( + companyId: ID! + ): Product! +} + +interface Product { + linkCode( + pid: ID! + ): LinkCode +} + +type LinkCode { + html: String +}