未验证 提交 92e276b6 编写于 作者: B Bogdan Kobylynskyi 提交者: GitHub

Generate parametrized input class for interfaces #327 (#330)

上级 e6b9e9be
...@@ -279,8 +279,7 @@ public class GraphQLCodegen { ...@@ -279,8 +279,7 @@ public class GraphQLCodegen {
for (ExtendedInterfaceTypeDefinition definition : document.getInterfaceDefinitions()) { for (ExtendedInterfaceTypeDefinition definition : document.getInterfaceDefinitions()) {
generateFieldResolver(context, definition.getFieldDefinitions(), definition).ifPresent(generatedFiles::add); generateFieldResolver(context, definition.getFieldDefinitions(), definition).ifPresent(generatedFiles::add);
} }
System.out.println(String.format("Generated %d definition classes in folder %s", System.out.printf("Generated %d definition classes in folder %s%n", generatedFiles.size(), outputDir.getAbsolutePath());
generatedFiles.size(), outputDir.getAbsolutePath()));
return generatedFiles; return generatedFiles;
} }
...@@ -304,6 +303,13 @@ public class GraphQLCodegen { ...@@ -304,6 +303,13 @@ public class GraphQLCodegen {
if (Boolean.TRUE.equals(mappingConfig.getGenerateClient())) { if (Boolean.TRUE.equals(mappingConfig.getGenerateClient())) {
Map<String, Object> responseProjDataModel = RequestResponseDefinitionToDataModelMapper.mapResponseProjection(mappingContext, definition); Map<String, Object> responseProjDataModel = RequestResponseDefinitionToDataModelMapper.mapResponseProjection(mappingContext, definition);
generatedFiles.add(GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.responseProjectionTemplate, responseProjDataModel, outputDir)); generatedFiles.add(GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.responseProjectionTemplate, responseProjDataModel, outputDir));
for (ExtendedFieldDefinition fieldDefinition : definition.getFieldDefinitions()) {
if (!Utils.isEmpty(fieldDefinition.getInputValueDefinitions())) {
Map<String, Object> fieldProjDataModel = RequestResponseDefinitionToDataModelMapper.mapParametrizedInput(mappingContext, fieldDefinition, definition);
generatedFiles.add(GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.parametrizedInputTemplate, fieldProjDataModel, outputDir));
}
}
} }
return generatedFiles; return generatedFiles;
} }
...@@ -398,6 +404,7 @@ public class GraphQLCodegen { ...@@ -398,6 +404,7 @@ public class GraphQLCodegen {
private Optional<File> generateFieldResolver(MappingContext mappingContext, private Optional<File> generateFieldResolver(MappingContext mappingContext,
List<ExtendedFieldDefinition> fieldDefinitions, List<ExtendedFieldDefinition> fieldDefinitions,
ExtendedDefinition<?, ?> parentDefinition) { ExtendedDefinition<?, ?> parentDefinition) {
if (Boolean.TRUE.equals(mappingConfig.getGenerateApis())) {
List<ExtendedFieldDefinition> fieldDefsWithResolvers = fieldDefinitions.stream() List<ExtendedFieldDefinition> fieldDefsWithResolvers = fieldDefinitions.stream()
.filter(fieldDef -> FieldDefinitionToParameterMapper.generateResolversForField(mappingContext, fieldDef, parentDefinition)) .filter(fieldDef -> FieldDefinitionToParameterMapper.generateResolversForField(mappingContext, fieldDef, parentDefinition))
.collect(toList()); .collect(toList());
...@@ -405,6 +412,7 @@ public class GraphQLCodegen { ...@@ -405,6 +412,7 @@ public class GraphQLCodegen {
Map<String, Object> dataModel = FieldDefinitionsToResolverDataModelMapper.mapToTypeResolver(mappingContext, fieldDefsWithResolvers, parentDefinition.getName()); Map<String, Object> dataModel = FieldDefinitionsToResolverDataModelMapper.mapToTypeResolver(mappingContext, fieldDefsWithResolvers, parentDefinition.getName());
return Optional.of(GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.operationsTemplate, dataModel, outputDir)); return Optional.of(GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.operationsTemplate, dataModel, outputDir));
} }
}
return Optional.empty(); return Optional.empty();
} }
......
...@@ -64,7 +64,7 @@ public class RequestResponseDefinitionToDataModelMapper { ...@@ -64,7 +64,7 @@ public class RequestResponseDefinitionToDataModelMapper {
*/ */
public static Map<String, Object> mapParametrizedInput(MappingContext mappingContext, public static Map<String, Object> mapParametrizedInput(MappingContext mappingContext,
ExtendedFieldDefinition fieldDefinition, ExtendedFieldDefinition fieldDefinition,
ExtendedObjectTypeDefinition parentTypeDefinition) { ExtendedDefinition<?, ?> parentTypeDefinition) {
String className = MapperUtils.getParametrizedInputClassName(mappingContext, fieldDefinition, parentTypeDefinition); String className = MapperUtils.getParametrizedInputClassName(mappingContext, fieldDefinition, parentTypeDefinition);
Map<String, Object> dataModel = new HashMap<>(); Map<String, Object> dataModel = new HashMap<>();
// ParametrizedInput classes are sharing the package with the model classes, so no imports are needed // ParametrizedInput classes are sharing the package with the model classes, so no imports are needed
......
...@@ -50,6 +50,19 @@ class GraphQLCodegenFieldsResolversTest { ...@@ -50,6 +50,19 @@ class GraphQLCodegenFieldsResolversTest {
getFileByName(files, "CommitResolver.java")); 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 @Test
void generate_CustomFieldsResolvers() throws Exception { void generate_CustomFieldsResolvers() throws Exception {
mappingConfig.setModelNamePrefix("Github"); mappingConfig.setModelNamePrefix("Github");
......
...@@ -70,8 +70,8 @@ class GraphQLCodegenModelsForRootTypesTest { ...@@ -70,8 +70,8 @@ class GraphQLCodegenModelsForRootTypesTest {
File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles()); File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
List<String> generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList()); List<String> generatedFileNames = Arrays.stream(files).map(File::getName).sorted().collect(toList());
assertEquals(Arrays.asList("Event.java", "EventProperty.java", "EventPropertyResolver.java", "EventStatus.java", assertEquals(Arrays.asList("Event.java", "EventProperty.java", "EventStatus.java",
"Mutation.java", "MutationResolver.java", "Query.java", "QueryResolver.java", "Subscription.java"), "Mutation.java", "Query.java", "Subscription.java"),
generatedFileNames); generatedFileNames);
} }
......
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
type Query {
product(
companyId: ID!
): Product!
}
interface Product {
linkCode(
pid: ID!
): LinkCode
}
type LinkCode {
html: String
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册