diff --git a/book-details/build.gradle b/book-details/build.gradle index c1111b5..43d32f8 100644 --- a/book-details/build.gradle +++ b/book-details/build.gradle @@ -23,7 +23,7 @@ repositories { } dependencies { - implementation 'com.graphql-java:graphql-java:11.0' + implementation 'com.graphql-java:graphql-java:13.0' implementation 'com.graphql-java:graphql-java-spring-boot-starter-webmvc:1.0' implementation 'com.google.guava:guava:26.0-jre' implementation 'org.springframework.boot:spring-boot-starter-web' diff --git a/book-details/example-request.sh b/book-details/example-request.sh new file mode 100755 index 0000000..189c0bc --- /dev/null +++ b/book-details/example-request.sh @@ -0,0 +1,2 @@ +curl -vvv -X POST -H "Content-Type: application/json" -d '{"query":"{hello}"}' http://localhost:8080/graphql +echo diff --git a/book-details/src/main/java/com/graphqljava/tutorial/bookdetails/GraphQLDataFetchers.java b/book-details/src/main/java/com/graphqljava/tutorial/bookdetails/GraphQLDataFetchers.java index 435794b..c74dbfa 100644 --- a/book-details/src/main/java/com/graphqljava/tutorial/bookdetails/GraphQLDataFetchers.java +++ b/book-details/src/main/java/com/graphqljava/tutorial/bookdetails/GraphQLDataFetchers.java @@ -2,8 +2,11 @@ import com.google.common.collect.ImmutableMap; import graphql.schema.DataFetcher; +import graphql.schema.GraphQLObjectType; +import graphql.schema.TypeResolver; import org.springframework.stereotype.Component; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -26,6 +29,11 @@ public class GraphQLDataFetchers { "authorId", "author-3") ); + private static List> movies = Arrays.asList( + ImmutableMap.of("id", "movie-1", + "name", "Lost in translation" + )); + private static List> authors = Arrays.asList( ImmutableMap.of("id", "author-1", "firstName", "Joanne", @@ -60,4 +68,48 @@ public DataFetcher getAuthorDataFetcher() { .orElse(null); }; } + + public DataFetcher getBookTitleDataFetcher() { + return dataFetchingEnvironment -> { + Map book = dataFetchingEnvironment.getSource(); + return book.get("name"); + }; + } + + public DataFetcher helloDataFetcher() { + return dataFetchingEnvironment -> { + return "world"; + }; + } + + public DataFetcher getMovieByIdDataFetcher() { + return dataFetchingEnvironment -> { + String movieId = dataFetchingEnvironment.getArgument("id"); + return movies + .stream() + .filter(book -> book.get("id").equals(movieId)) + .findFirst() + .orElse(null); + }; + } + + public DataFetcher itemsDataFetcher() { + return env -> { + List result = new ArrayList<>(); + result.addAll(movies); + result.addAll(books); + return result; + }; + } + + public TypeResolver itemsTypeResolver = env -> { + Map bookOrMovie = env.getObject(); + String id = (String) bookOrMovie.get("id"); + if (id.startsWith("movie")) { + return (GraphQLObjectType) env.getSchema().getType("Movie"); + } else { + return (GraphQLObjectType) env.getSchema().getType("Book"); + } + + }; } diff --git a/book-details/src/main/java/com/graphqljava/tutorial/bookdetails/GraphQLProvider.java b/book-details/src/main/java/com/graphqljava/tutorial/bookdetails/GraphQLProvider.java index 578e62f..62ce9bb 100644 --- a/book-details/src/main/java/com/graphqljava/tutorial/bookdetails/GraphQLProvider.java +++ b/book-details/src/main/java/com/graphqljava/tutorial/bookdetails/GraphQLProvider.java @@ -45,9 +45,16 @@ private GraphQLSchema buildSchema(String sdl) { private RuntimeWiring buildWiring() { return RuntimeWiring.newRuntimeWiring() .type(newTypeWiring("Query") - .dataFetcher("bookById", graphQLDataFetchers.getBookByIdDataFetcher())) + .dataFetcher("bookById", graphQLDataFetchers.getBookByIdDataFetcher()) + .dataFetcher("movieById", graphQLDataFetchers.getMovieByIdDataFetcher()) + .dataFetcher("hello", graphQLDataFetchers.helloDataFetcher()) + .dataFetcher("items", graphQLDataFetchers.itemsDataFetcher()) + ) .type(newTypeWiring("Book") - .dataFetcher("author", graphQLDataFetchers.getAuthorDataFetcher())) + .dataFetcher("author", graphQLDataFetchers.getAuthorDataFetcher()) + .dataFetcher("title", graphQLDataFetchers.getBookTitleDataFetcher())) + .type(newTypeWiring("Item") + .typeResolver(graphQLDataFetchers.itemsTypeResolver)) .build(); } diff --git a/book-details/src/main/resources/schema.graphqls b/book-details/src/main/resources/schema.graphqls index 85bb6ad..74f1b02 100644 --- a/book-details/src/main/resources/schema.graphqls +++ b/book-details/src/main/resources/schema.graphqls @@ -1,10 +1,20 @@ type Query { + hello: String bookById(id: ID): Book + movieById(id: ID): Movie + items: [Item] } -type Book { +union Item = Movie | Book + +type Movie { id: ID name: String +} + +type Book { + id: ID + title: String pageCount: Int author: Author } diff --git a/book-details/src/main/resources/static/graphql.html b/book-details/src/main/resources/static/graphql.html new file mode 100644 index 0000000..f5340b8 --- /dev/null +++ b/book-details/src/main/resources/static/graphql.html @@ -0,0 +1,1115 @@ + + + + + + + + GraphQL Playground + + + + + + + + + + +
+ +
Loading + GraphQL Playground +
+
+ +
+ + + + + + + + + + GraphQL Playground + + + + + + + + + + +
+ +
Loading + GraphQL Playground +
+
+ +
+ + + \ No newline at end of file