From fe69da70995579f024c78d726329d35ee1ee77c0 Mon Sep 17 00:00:00 2001 From: Andreas Marek Date: Wed, 4 Dec 2019 15:23:24 +1100 Subject: [PATCH 1/5] update graphql java --- book-details/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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' From 18647557db9dfd89ef796b089c0059325d70a815 Mon Sep 17 00:00:00 2001 From: Andreas Marek Date: Thu, 5 Dec 2019 12:19:00 +1100 Subject: [PATCH 2/5] add hello field add example query script --- book-details/example-request.sh | 2 ++ .../tutorial/bookdetails/GraphQLDataFetchers.java | 6 ++++++ .../graphqljava/tutorial/bookdetails/GraphQLProvider.java | 4 +++- book-details/src/main/resources/schema.graphqls | 1 + 4 files changed, 12 insertions(+), 1 deletion(-) create mode 100755 book-details/example-request.sh 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..1b66e27 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 @@ -60,4 +60,10 @@ public DataFetcher getAuthorDataFetcher() { .orElse(null); }; } + + public DataFetcher helloDataFetcher() { + return dataFetchingEnvironment -> { + return "world"; + }; + } } 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..00dd981 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,7 +45,9 @@ private GraphQLSchema buildSchema(String sdl) { private RuntimeWiring buildWiring() { return RuntimeWiring.newRuntimeWiring() .type(newTypeWiring("Query") - .dataFetcher("bookById", graphQLDataFetchers.getBookByIdDataFetcher())) + .dataFetcher("bookById", graphQLDataFetchers.getBookByIdDataFetcher()) + .dataFetcher("hello", graphQLDataFetchers.helloDataFetcher()) + ) .type(newTypeWiring("Book") .dataFetcher("author", graphQLDataFetchers.getAuthorDataFetcher())) .build(); diff --git a/book-details/src/main/resources/schema.graphqls b/book-details/src/main/resources/schema.graphqls index 85bb6ad..91c40e6 100644 --- a/book-details/src/main/resources/schema.graphqls +++ b/book-details/src/main/resources/schema.graphqls @@ -1,4 +1,5 @@ type Query { + hello: String bookById(id: ID): Book } From 6a20267e0df9609015d8b8844b936436e54a71a0 Mon Sep 17 00:00:00 2001 From: Andreas Marek Date: Thu, 5 Dec 2019 13:24:06 +1100 Subject: [PATCH 3/5] add playground --- .../src/main/resources/static/graphql.html | 1115 +++++++++++++++++ 1 file changed, 1115 insertions(+) create mode 100644 book-details/src/main/resources/static/graphql.html 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 From d33fe9db78ef8dcb3d8dd71655c092db33f2c5b0 Mon Sep 17 00:00:00 2001 From: Andreas Marek Date: Thu, 5 Dec 2019 13:24:36 +1100 Subject: [PATCH 4/5] movies and everything union --- .../bookdetails/GraphQLDataFetchers.java | 46 +++++++++++++++++++ .../tutorial/bookdetails/GraphQLProvider.java | 7 ++- .../src/main/resources/schema.graphqls | 11 ++++- 3 files changed, 62 insertions(+), 2 deletions(-) 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 1b66e27..7020644 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", @@ -61,9 +69,47 @@ public DataFetcher getAuthorDataFetcher() { }; } + 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 everythingDataFetcher() { + return env -> { + List result = new ArrayList<>(); + result.addAll(movies); + result.addAll(books); + return result; + }; + } + + public TypeResolver everythingTypeResolver = 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 00dd981..59514d7 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 @@ -46,10 +46,15 @@ private RuntimeWiring buildWiring() { return RuntimeWiring.newRuntimeWiring() .type(newTypeWiring("Query") .dataFetcher("bookById", graphQLDataFetchers.getBookByIdDataFetcher()) + .dataFetcher("movieById", graphQLDataFetchers.getMovieByIdDataFetcher()) .dataFetcher("hello", graphQLDataFetchers.helloDataFetcher()) + .dataFetcher("everything", graphQLDataFetchers.everythingDataFetcher()) ) .type(newTypeWiring("Book") - .dataFetcher("author", graphQLDataFetchers.getAuthorDataFetcher())) + .dataFetcher("author", graphQLDataFetchers.getAuthorDataFetcher()) + .dataFetcher("title", graphQLDataFetchers.getBookTitleDataFetcher())) + .type(newTypeWiring("Thing") + .typeResolver(graphQLDataFetchers.everythingTypeResolver)) .build(); } diff --git a/book-details/src/main/resources/schema.graphqls b/book-details/src/main/resources/schema.graphqls index 91c40e6..ca7b3e4 100644 --- a/book-details/src/main/resources/schema.graphqls +++ b/book-details/src/main/resources/schema.graphqls @@ -1,11 +1,20 @@ type Query { hello: String bookById(id: ID): Book + movieById(id: ID): Movie + everything: [Thing] } -type Book { +union Thing = Movie | Book + +type Movie { id: ID name: String +} + +type Book { + id: ID + title: String pageCount: Int author: Author } From 1fe9a25fcdd7e8783eac36697bbf6361dcd4942f Mon Sep 17 00:00:00 2001 From: Andreas Marek Date: Thu, 5 Dec 2019 15:59:30 +1100 Subject: [PATCH 5/5] rename to Item --- .../tutorial/bookdetails/GraphQLDataFetchers.java | 4 ++-- .../graphqljava/tutorial/bookdetails/GraphQLProvider.java | 6 +++--- book-details/src/main/resources/schema.graphqls | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) 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 7020644..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 @@ -93,7 +93,7 @@ public DataFetcher getMovieByIdDataFetcher() { }; } - public DataFetcher everythingDataFetcher() { + public DataFetcher itemsDataFetcher() { return env -> { List result = new ArrayList<>(); result.addAll(movies); @@ -102,7 +102,7 @@ public DataFetcher everythingDataFetcher() { }; } - public TypeResolver everythingTypeResolver = env -> { + public TypeResolver itemsTypeResolver = env -> { Map bookOrMovie = env.getObject(); String id = (String) bookOrMovie.get("id"); if (id.startsWith("movie")) { 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 59514d7..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 @@ -48,13 +48,13 @@ private RuntimeWiring buildWiring() { .dataFetcher("bookById", graphQLDataFetchers.getBookByIdDataFetcher()) .dataFetcher("movieById", graphQLDataFetchers.getMovieByIdDataFetcher()) .dataFetcher("hello", graphQLDataFetchers.helloDataFetcher()) - .dataFetcher("everything", graphQLDataFetchers.everythingDataFetcher()) + .dataFetcher("items", graphQLDataFetchers.itemsDataFetcher()) ) .type(newTypeWiring("Book") .dataFetcher("author", graphQLDataFetchers.getAuthorDataFetcher()) .dataFetcher("title", graphQLDataFetchers.getBookTitleDataFetcher())) - .type(newTypeWiring("Thing") - .typeResolver(graphQLDataFetchers.everythingTypeResolver)) + .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 ca7b3e4..74f1b02 100644 --- a/book-details/src/main/resources/schema.graphqls +++ b/book-details/src/main/resources/schema.graphqls @@ -2,10 +2,10 @@ type Query { hello: String bookById(id: ID): Book movieById(id: ID): Movie - everything: [Thing] + items: [Item] } -union Thing = Movie | Book +union Item = Movie | Book type Movie { id: ID