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

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

上级 e6b9e9be
......@@ -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<String, Object> responseProjDataModel = RequestResponseDefinitionToDataModelMapper.mapResponseProjection(mappingContext, definition);
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;
}
......@@ -398,12 +404,14 @@ public class GraphQLCodegen {
private Optional<File> generateFieldResolver(MappingContext mappingContext,
List<ExtendedFieldDefinition> fieldDefinitions,
ExtendedDefinition<?, ?> parentDefinition) {
List<ExtendedFieldDefinition> fieldDefsWithResolvers = fieldDefinitions.stream()
.filter(fieldDef -> FieldDefinitionToParameterMapper.generateResolversForField(mappingContext, fieldDef, parentDefinition))
.collect(toList());
if (!fieldDefsWithResolvers.isEmpty()) {
Map<String, Object> dataModel = FieldDefinitionsToResolverDataModelMapper.mapToTypeResolver(mappingContext, fieldDefsWithResolvers, parentDefinition.getName());
return Optional.of(GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.operationsTemplate, dataModel, outputDir));
if (Boolean.TRUE.equals(mappingConfig.getGenerateApis())) {
List<ExtendedFieldDefinition> fieldDefsWithResolvers = fieldDefinitions.stream()
.filter(fieldDef -> FieldDefinitionToParameterMapper.generateResolversForField(mappingContext, fieldDef, parentDefinition))
.collect(toList());
if (!fieldDefsWithResolvers.isEmpty()) {
Map<String, Object> dataModel = FieldDefinitionsToResolverDataModelMapper.mapToTypeResolver(mappingContext, fieldDefsWithResolvers, parentDefinition.getName());
return Optional.of(GraphQLCodegenFileCreator.generateFile(FreeMarkerTemplatesRegistry.operationsTemplate, dataModel, outputDir));
}
}
return Optional.empty();
}
......
......@@ -64,7 +64,7 @@ public class RequestResponseDefinitionToDataModelMapper {
*/
public static Map<String, Object> mapParametrizedInput(MappingContext mappingContext,
ExtendedFieldDefinition fieldDefinition,
ExtendedObjectTypeDefinition parentTypeDefinition) {
ExtendedDefinition<?, ?> parentTypeDefinition) {
String className = MapperUtils.getParametrizedInputClassName(mappingContext, fieldDefinition, parentTypeDefinition);
Map<String, Object> dataModel = new HashMap<>();
// ParametrizedInput classes are sharing the package with the model classes, so no imports are needed
......
......@@ -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");
......
......@@ -70,8 +70,8 @@ class GraphQLCodegenModelsForRootTypesTest {
File[] files = Objects.requireNonNull(outputJavaClassesDir.listFiles());
List<String> 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);
}
......
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.
先完成此消息的编辑!
想要评论请 注册