├── .gitignore ├── src └── main │ ├── resources │ ├── application.yml │ └── schemas.graphqls │ └── java │ └── pac │ ├── services │ ├── ArticleService.java │ ├── UserService.java │ └── implementation │ │ ├── ArticleServiceImpl.java │ │ └── UserServiceImpl.java │ ├── Application.java │ ├── repositories │ ├── UserRepository.java │ └── ArticleRepository.java │ ├── models │ ├── Article.java │ └── User.java │ ├── dataFetchers │ ├── UserDataFetcher.java │ ├── ArticlesDataFetcher.java │ └── AllUsersDataFetcher.java │ ├── controllers │ └── MainController.java │ ├── graphql_utilities │ └── GraphQlUtility.java │ └── dataLoader │ └── MyDataLoader.java ├── .idea └── vcs.xml └── pom.xml /.gitignore: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | server: 2 | port: 8000 3 | spring: 4 | data: 5 | mongodb: 6 | database: graphql 7 | host: localhost 8 | port: 27017 -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/main/java/pac/services/ArticleService.java: -------------------------------------------------------------------------------- 1 | package pac.services; 2 | 3 | import pac.models.Article; 4 | 5 | import java.util.List; 6 | 7 | public interface ArticleService { 8 | 9 | List
findAllUserArticles(List userId); 10 | } 11 | -------------------------------------------------------------------------------- /src/main/java/pac/services/UserService.java: -------------------------------------------------------------------------------- 1 | package pac.services; 2 | 3 | import org.bson.types.ObjectId; 4 | import pac.models.User; 5 | 6 | import java.util.List; 7 | 8 | public interface UserService { 9 | 10 | List findAllUsers(); 11 | User findOneById(ObjectId id); 12 | List findByIdIn(Listids); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/pac/Application.java: -------------------------------------------------------------------------------- 1 | package pac; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | @SpringBootApplication 7 | public class Application { 8 | 9 | public static void main(String[] args) { 10 | SpringApplication.run(Application.class, args); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/pac/repositories/UserRepository.java: -------------------------------------------------------------------------------- 1 | package pac.repositories; 2 | import org.bson.types.ObjectId; 3 | import org.springframework.data.repository.PagingAndSortingRepository; 4 | import pac.models.User; 5 | 6 | import java.util.List; 7 | 8 | public interface UserRepository extends PagingAndSortingRepository{ 9 | 10 | List findByIdIn(List ids); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/pac/repositories/ArticleRepository.java: -------------------------------------------------------------------------------- 1 | package pac.repositories; 2 | import org.bson.types.ObjectId; 3 | import org.springframework.data.repository.PagingAndSortingRepository; 4 | import pac.models.Article; 5 | 6 | import java.util.List; 7 | 8 | public interface ArticleRepository extends PagingAndSortingRepository { 9 | 10 | List
findByIdIn(List ids); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/resources/schemas.graphqls: -------------------------------------------------------------------------------- 1 | schema { 2 | query: Query 3 | } 4 | 5 | type Query { 6 | users: [User] 7 | user(id: String): User 8 | } 9 | 10 | type User { 11 | id: String 12 | name: String 13 | age: Int 14 | nationality: String 15 | createdAt: String 16 | friends: [User] 17 | articles: [Article] 18 | } 19 | 20 | type Article { 21 | id: String 22 | title: String 23 | minutesRead: Int 24 | } -------------------------------------------------------------------------------- /src/main/java/pac/models/Article.java: -------------------------------------------------------------------------------- 1 | package pac.models; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | import org.bson.types.ObjectId; 8 | import org.springframework.data.mongodb.core.mapping.Document; 9 | 10 | @Data 11 | @AllArgsConstructor 12 | @NoArgsConstructor 13 | @Builder 14 | @Document(collection = "articles") 15 | public class Article { 16 | 17 | private ObjectId id; 18 | 19 | private String title; 20 | private Integer minutesRead; 21 | private String authorId; 22 | } -------------------------------------------------------------------------------- /src/main/java/pac/models/User.java: -------------------------------------------------------------------------------- 1 | package pac.models; 2 | import lombok.*; 3 | import org.bson.types.ObjectId; 4 | import org.springframework.data.mongodb.core.mapping.Document; 5 | 6 | import java.util.Date; 7 | import java.util.List; 8 | 9 | @Data 10 | @AllArgsConstructor 11 | @NoArgsConstructor 12 | @Builder 13 | @Document(collection = "users") 14 | public class User { 15 | 16 | private ObjectId id; 17 | 18 | private String name; 19 | private Integer age; 20 | private Date createdAt; 21 | private String nationality; 22 | private List friendsIds; 23 | private List articlesIds; 24 | } -------------------------------------------------------------------------------- /src/main/java/pac/services/implementation/ArticleServiceImpl.java: -------------------------------------------------------------------------------- 1 | package pac.services.implementation; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Service; 5 | import pac.models.Article; 6 | import pac.repositories.ArticleRepository; 7 | import pac.services.ArticleService; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | @Service 13 | public class ArticleServiceImpl implements ArticleService { 14 | 15 | private final ArticleRepository articleRepository; 16 | 17 | @Autowired 18 | ArticleServiceImpl(ArticleRepository articleRepository){ 19 | this.articleRepository = articleRepository; 20 | } 21 | 22 | @Override 23 | public List
findAllUserArticles(List ids) { 24 | return articleRepository.findByIdIn(ids); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/pac/dataFetchers/UserDataFetcher.java: -------------------------------------------------------------------------------- 1 | package pac.dataFetchers; 2 | import graphql.schema.*; 3 | import org.bson.types.ObjectId; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.stereotype.Component; 6 | import pac.models.User; 7 | import pac.services.UserService; 8 | 9 | import java.util.Map; 10 | 11 | @Component 12 | public class UserDataFetcher implements DataFetcher { 13 | 14 | private final UserService userService; 15 | 16 | @Autowired 17 | UserDataFetcher(UserService userService){ 18 | this.userService = userService; 19 | } 20 | 21 | @Override 22 | public User get(DataFetchingEnvironment env) { 23 | Map args = env.getArguments(); 24 | User user = userService.findOneById(new ObjectId(String.valueOf(args.get("id")))); 25 | return null; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/pac/dataFetchers/ArticlesDataFetcher.java: -------------------------------------------------------------------------------- 1 | package pac.dataFetchers; 2 | import graphql.schema.*; 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Component; 5 | import pac.models.Article; 6 | import pac.models.User; 7 | import pac.services.ArticleService; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | @Component 13 | public class ArticlesDataFetcher implements DataFetcher>{ 14 | 15 | private final ArticleService articleService; 16 | 17 | @Autowired 18 | ArticlesDataFetcher(ArticleService articleService){ 19 | this.articleService = articleService; 20 | } 21 | 22 | @Override 23 | public List
get(DataFetchingEnvironment env) { 24 | User user = env.getSource(); 25 | List articleIds = new ArrayList<>(); 26 | if(user!=null){ 27 | articleIds = user.getArticlesIds(); 28 | } 29 | List
articles = articleService.findAllUserArticles(articleIds); 30 | return articles; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/pac/dataFetchers/AllUsersDataFetcher.java: -------------------------------------------------------------------------------- 1 | package pac.dataFetchers; 2 | 3 | import graphql.schema.DataFetcher; 4 | import graphql.schema.DataFetchingEnvironment; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.stereotype.Component; 7 | import pac.models.User; 8 | import pac.services.UserService; 9 | 10 | import java.util.ArrayList; 11 | import java.util.List; 12 | @Component 13 | public class AllUsersDataFetcher implements DataFetcher> { 14 | 15 | private final UserService userService; 16 | 17 | @Autowired 18 | AllUsersDataFetcher(UserService userService){ 19 | this.userService = userService; 20 | } 21 | 22 | @Override 23 | public List get(DataFetchingEnvironment env) { 24 | User user = env.getSource(); 25 | List friends = new ArrayList<>(); 26 | if(user !=null){ 27 | friends = userService.findByIdIn(user.getFriendsIds()); 28 | }else { 29 | friends = userService.findAllUsers(); 30 | } 31 | return friends; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/pac/services/implementation/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package pac.services.implementation; 2 | import org.bson.types.ObjectId; 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Service; 5 | import pac.models.User; 6 | import pac.repositories.UserRepository; 7 | import pac.services.UserService; 8 | 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | 12 | @Service 13 | public class UserServiceImpl implements UserService{ 14 | 15 | private final UserRepository userRepository; 16 | 17 | @Autowired 18 | UserServiceImpl(UserRepository userRepository){ 19 | this.userRepository = userRepository; 20 | } 21 | 22 | @Override 23 | public List findAllUsers() { 24 | return (ArrayList) userRepository.findAll(); 25 | } 26 | 27 | @Override 28 | public User findOneById(ObjectId id) { 29 | return userRepository.findOne(id); 30 | } 31 | 32 | @Override 33 | public List findByIdIn(List ids) { 34 | return userRepository.findByIdIn(ids); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/pac/controllers/MainController.java: -------------------------------------------------------------------------------- 1 | package pac.controllers; 2 | 3 | import graphql.ExecutionResult; 4 | import graphql.GraphQL; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.http.ResponseEntity; 7 | import org.springframework.web.bind.annotation.PostMapping; 8 | import org.springframework.web.bind.annotation.RequestBody; 9 | import org.springframework.web.bind.annotation.RestController; 10 | import pac.graphql_utilities.GraphQlUtility; 11 | 12 | import java.io.IOException; 13 | 14 | @RestController 15 | public class MainController { 16 | 17 | private GraphQL graphQL; 18 | private GraphQlUtility graphQlUtility; 19 | @Autowired 20 | MainController(GraphQlUtility graphQlUtility) throws IOException { 21 | this.graphQlUtility = graphQlUtility; 22 | graphQL = graphQlUtility.createGraphQlObject(); 23 | } 24 | 25 | @PostMapping(value = "/query") 26 | public ResponseEntity query(@RequestBody String query){ 27 | ExecutionResult result = graphQL.execute(query); 28 | System.out.println("errors: "+result.getErrors()); 29 | return ResponseEntity.ok(result.getData()); 30 | } 31 | 32 | } 33 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | groupId 8 | spring-boot-graphql 9 | 1.0-SNAPSHOT 10 | 11 | 12 | 1.8 13 | 1.16.16 14 | 2.5 15 | 16 | 17 | 18 | 19 | org.springframework.boot 20 | spring-boot-starter-parent 21 | 1.5.8.RELEASE 22 | 23 | 24 | 25 | org.springframework.boot 26 | spring-boot-starter-web 27 | 28 | 29 | org.springframework.boot 30 | spring-boot-starter-data-mongodb 31 | 32 | 33 | org.projectlombok 34 | lombok 35 | ${lombok.version} 36 | provided 37 | 38 | 39 | commons-io 40 | commons-io 41 | ${commons-io.version} 42 | 43 | 44 | com.graphql-java 45 | graphql-spring-boot-starter 46 | 3.6.0 47 | 48 | 49 | com.graphql-java 50 | graphql-java-tools 51 | 3.2.0 52 | 53 | 54 | com.graphql-java 55 | graphiql-spring-boot-starter 56 | 3.6.0 57 | 58 | 59 | -------------------------------------------------------------------------------- /src/main/java/pac/graphql_utilities/GraphQlUtility.java: -------------------------------------------------------------------------------- 1 | package pac.graphql_utilities; 2 | 3 | import graphql.GraphQL; 4 | import graphql.schema.DataFetcher; 5 | import graphql.schema.GraphQLSchema; 6 | import graphql.schema.idl.RuntimeWiring; 7 | import graphql.schema.idl.SchemaGenerator; 8 | import graphql.schema.idl.SchemaParser; 9 | import graphql.schema.idl.TypeDefinitionRegistry; 10 | import org.springframework.beans.factory.annotation.Autowired; 11 | import org.springframework.beans.factory.annotation.Value; 12 | import org.springframework.core.io.Resource; 13 | import org.springframework.stereotype.Component; 14 | import pac.dataFetchers.AllUsersDataFetcher; 15 | import pac.dataFetchers.ArticlesDataFetcher; 16 | import pac.dataFetchers.UserDataFetcher; 17 | 18 | import javax.annotation.PostConstruct; 19 | import java.io.File; 20 | import java.io.IOException; 21 | 22 | import static graphql.GraphQL.newGraphQL; 23 | import static graphql.schema.idl.RuntimeWiring.newRuntimeWiring; 24 | 25 | @Component 26 | public class GraphQlUtility { 27 | 28 | @Value("classpath:schemas.graphqls") 29 | private Resource schemaResource; 30 | private GraphQL graphQL; 31 | private AllUsersDataFetcher allUsersDataFetcher; 32 | private UserDataFetcher userDataFetcher; 33 | private ArticlesDataFetcher articlesDataFetcher; 34 | 35 | @Autowired 36 | GraphQlUtility(AllUsersDataFetcher allUsersDataFetcher, UserDataFetcher userDataFetcher, 37 | ArticlesDataFetcher articlesDataFetcher) throws IOException { 38 | this.allUsersDataFetcher = allUsersDataFetcher; 39 | this.userDataFetcher = userDataFetcher; 40 | this.articlesDataFetcher = articlesDataFetcher; 41 | } 42 | 43 | @PostConstruct 44 | public GraphQL createGraphQlObject() throws IOException { 45 | File schemas = schemaResource.getFile(); 46 | TypeDefinitionRegistry typeRegistry = new SchemaParser().parse(schemas); 47 | RuntimeWiring wiring = buildRuntimeWiring(); 48 | GraphQLSchema schema = new SchemaGenerator().makeExecutableSchema(typeRegistry, wiring); 49 | return newGraphQL(schema).build(); 50 | } 51 | 52 | public RuntimeWiring buildRuntimeWiring(){ 53 | return newRuntimeWiring() 54 | .type("Query", typeWiring -> typeWiring 55 | .dataFetcher("users", allUsersDataFetcher) 56 | .dataFetcher("user", userDataFetcher)) 57 | .type("User", typeWiring -> typeWiring 58 | .dataFetcher("articles", articlesDataFetcher) 59 | .dataFetcher("friends", allUsersDataFetcher)) 60 | .build(); 61 | } 62 | } 63 | 64 | -------------------------------------------------------------------------------- /src/main/java/pac/dataLoader/MyDataLoader.java: -------------------------------------------------------------------------------- 1 | package pac.dataLoader; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.stereotype.Component; 5 | import pac.models.*; 6 | import pac.repositories.*; 7 | import javax.annotation.PostConstruct; 8 | import java.util.*; 9 | @Component 10 | public class MyDataLoader { 11 | private final UserRepository userRepository; 12 | private final ArticleRepository articleRepository; 13 | @Autowired 14 | MyDataLoader(UserRepository userRepository, ArticleRepository articleRepository){ 15 | this.userRepository = userRepository; 16 | this.articleRepository = articleRepository; 17 | } 18 | // @PostConstruct 19 | private void generateData(){ 20 | List users = new ArrayList<>(); 21 | users.add(User.builder().name("Igor").createdAt(new Date()).age(24).articlesIds(new ArrayList<>()).articlesIds(new ArrayList<>()).build()); 22 | users.add(User.builder().name("Ellen").createdAt(new Date()).age(24).articlesIds(new ArrayList<>()).articlesIds(new ArrayList<>()).build()); 23 | users.add(User.builder().name("John").createdAt(new Date()).age(53).articlesIds(new ArrayList<>()).articlesIds(new ArrayList<>()).build()); 24 | users.add(User.builder().name("Nazar").createdAt(new Date()).age(14).articlesIds(new ArrayList<>()).articlesIds(new ArrayList<>()).build()); 25 | users = (ArrayList) userRepository.save(users); 26 | List
articles = new ArrayList<>(); 27 | articles.add(Article.builder().title("Java 8 Lambdas").minutesRead(8).authorId(users.get(0).getId().toString()).build()); 28 | articles.add(Article.builder().title("GraphQL Getting Started").minutesRead(10).authorId(users.get(1).getId().toString()).build()); 29 | articles.add(Article.builder().title("Spring Boot + WebSockets").minutesRead(6).authorId(users.get(3).getId().toString()).build()); 30 | articles = (ArrayList) articleRepository.save(articles); 31 | User me = users.get(0); 32 | users.get(0).setArticlesIds(Arrays.asList(articles.get(0).getId().toHexString())); 33 | users.get(0).setArticlesIds(Arrays.asList(articles.get(1).getId().toHexString())); 34 | users.get(1).setArticlesIds(Arrays.asList(articles.get(2).getId().toHexString())); 35 | users.get(3).setArticlesIds(Arrays.asList(articles.get(0).getId().toHexString())); 36 | userRepository.save(users); 37 | List myFriendsIds = new ArrayList<>(); 38 | for (int i = 1; i