Skip to content

Commit

Permalink
Extracted logic from modules
Browse files Browse the repository at this point in the history
  • Loading branch information
sheepdreamofandroids committed May 20, 2019
1 parent 4a5ab7c commit a9a71a7
Show file tree
Hide file tree
Showing 5 changed files with 728 additions and 581 deletions.
Expand Up @@ -4,12 +4,71 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.protobuf.Descriptors;
import graphql.relay.Relay;
import graphql.schema.GraphQLFieldDefinition;
import graphql.schema.GraphQLObjectType;
import graphql.schema.GraphQLSchema;

import java.util.Collection;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

import static graphql.schema.GraphQLObjectType.newObject;

@AutoValue
public abstract class SchemaBundle {

public GraphQLSchema toSchema() {
Map<String, ? extends Function<String, Object>> nodeDataFetchers =
nodeDataFetchers()
.stream()
.collect(Collectors.toMap(e -> e.getClassName(), Function.identity()));

GraphQLObjectType.Builder queryType =
newObject().name("QueryType").fields(queryFields());

ProtoRegistry protoRegistry =
ProtoRegistry.newBuilder()
.addAll(fileDescriptors())
.add(modifications())
.build();

if (protoRegistry.hasRelayNode()) {
queryType.field(
new Relay()
.nodeField(
protoRegistry.getRelayNode(),
environment -> {
String id = environment.getArgument("id");
Relay.ResolvedGlobalId resolvedGlobalId = new Relay().fromGlobalId(id);
Function<String, ?> stringFunction =
nodeDataFetchers.get(resolvedGlobalId.getType());
if (stringFunction == null) {
throw new RuntimeException(
String.format(
"Relay Node fetcher not implemented for type=%s",
resolvedGlobalId.getType()));
}
return stringFunction.apply(resolvedGlobalId.getId());
}));
}

if (mutationFields().isEmpty()) {
return GraphQLSchema.newSchema()
.query(queryType)
.additionalTypes(protoRegistry.listTypes())
.build();
}
GraphQLObjectType mutationType =
newObject().name("MutationType").fields(mutationFields()).build();
return GraphQLSchema.newSchema()
.query(queryType)
.mutation(mutationType)
.additionalTypes(protoRegistry.listTypes())
.build();
}

public abstract ImmutableList<GraphQLFieldDefinition> queryFields();

public abstract ImmutableList<GraphQLFieldDefinition> mutationFields();
Expand All @@ -27,13 +86,13 @@ public static Builder builder() {
public static SchemaBundle combine(Collection<SchemaBundle> schemaBundles) {
Builder builder = SchemaBundle.builder();
schemaBundles.forEach(
schemaBundle -> {
builder.queryFieldsBuilder().addAll(schemaBundle.queryFields());
builder.mutationFieldsBuilder().addAll(schemaBundle.mutationFields());
builder.modificationsBuilder().addAll(schemaBundle.modifications());
builder.fileDescriptorsBuilder().addAll(schemaBundle.fileDescriptors());
builder.nodeDataFetchersBuilder().addAll(schemaBundle.nodeDataFetchers());
});
schemaBundle -> {
builder.queryFieldsBuilder().addAll(schemaBundle.queryFields());
builder.mutationFieldsBuilder().addAll(schemaBundle.mutationFields());
builder.modificationsBuilder().addAll(schemaBundle.modifications());
builder.fileDescriptorsBuilder().addAll(schemaBundle.fileDescriptors());
builder.nodeDataFetchersBuilder().addAll(schemaBundle.nodeDataFetchers());
});
return builder.build();
}

Expand Down

0 comments on commit a9a71a7

Please sign in to comment.