├── .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