Skip to content

Commit 367d1c6

Browse files
authored
Merge pull request #9 from piomin/new-graphql
adding new module showing Spring for GraphQL
2 parents 85838b1 + 22261c4 commit 367d1c6

25 files changed

+838
-1
lines changed

pom.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@
1717
<modules>
1818
<module>sample-app-netflix-dgs</module>
1919
<module>sample-app-kickstart</module>
20-
</modules>
20+
<module>sample-app-spring-graphql</module>
21+
</modules>
2122

2223
<properties>
2324
<java.version>11</java.version>

sample-app-spring-graphql/pom.xml

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns="http://maven.apache.org/POM/4.0.0"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5+
<parent>
6+
<groupId>org.springframework.boot</groupId>
7+
<artifactId>spring-boot-starter-parent</artifactId>
8+
<version>2.7.7</version>
9+
<relativePath/>
10+
</parent>
11+
<modelVersion>4.0.0</modelVersion>
12+
13+
<artifactId>sample-app-spring-graphql</artifactId>
14+
15+
<properties>
16+
<java.version>11</java.version>
17+
</properties>
18+
19+
<dependencies>
20+
<dependency>
21+
<groupId>org.springframework.boot</groupId>
22+
<artifactId>spring-boot-starter-web</artifactId>
23+
</dependency>
24+
<dependency>
25+
<groupId>org.springframework.boot</groupId>
26+
<artifactId>spring-boot-starter-graphql</artifactId>
27+
</dependency>
28+
<dependency>
29+
<groupId>org.springframework.boot</groupId>
30+
<artifactId>spring-boot-starter-data-jpa</artifactId>
31+
</dependency>
32+
<dependency>
33+
<groupId>com.h2database</groupId>
34+
<artifactId>h2</artifactId>
35+
<scope>runtime</scope>
36+
</dependency>
37+
<dependency>
38+
<groupId>org.projectlombok</groupId>
39+
<artifactId>lombok</artifactId>
40+
</dependency>
41+
<dependency>
42+
<groupId>org.springframework.boot</groupId>
43+
<artifactId>spring-boot-starter-test</artifactId>
44+
<scope>test</scope>
45+
</dependency>
46+
<dependency>
47+
<groupId>org.springframework.graphql</groupId>
48+
<artifactId>spring-graphql-test</artifactId>
49+
<scope>test</scope>
50+
</dependency>
51+
</dependencies>
52+
53+
<build>
54+
<plugins>
55+
<plugin>
56+
<groupId>org.springframework.boot</groupId>
57+
<artifactId>spring-boot-maven-plugin</artifactId>
58+
</plugin>
59+
<plugin>
60+
<groupId>org.jacoco</groupId>
61+
<artifactId>jacoco-maven-plugin</artifactId>
62+
<version>0.8.8</version>
63+
<executions>
64+
<execution>
65+
<goals>
66+
<goal>prepare-agent</goal>
67+
</goals>
68+
</execution>
69+
<execution>
70+
<id>report</id>
71+
<phase>test</phase>
72+
<goals>
73+
<goal>report</goal>
74+
</goals>
75+
</execution>
76+
</executions>
77+
</plugin>
78+
</plugins>
79+
</build>
80+
81+
</project>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package pl.piomin.sample.spring.graphql;
2+
3+
import org.springframework.boot.SpringApplication;
4+
import org.springframework.boot.autoconfigure.SpringBootApplication;
5+
6+
@SpringBootApplication
7+
public class SampleSpringBootGraphQL {
8+
9+
public static void main(String[] args) {
10+
SpringApplication.run(SampleSpringBootGraphQL.class, args);
11+
}
12+
13+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package pl.piomin.sample.spring.graphql.domain;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.EqualsAndHashCode;
6+
import lombok.NoArgsConstructor;
7+
8+
import javax.persistence.*;
9+
import java.util.Set;
10+
11+
@Entity
12+
@Data
13+
@AllArgsConstructor
14+
@NoArgsConstructor
15+
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
16+
public class Department {
17+
@Id
18+
@GeneratedValue(strategy = GenerationType.IDENTITY)
19+
@EqualsAndHashCode.Include
20+
private Integer id;
21+
private String name;
22+
@OneToMany(mappedBy = "department")
23+
private Set<Employee> employees;
24+
@ManyToOne(fetch = FetchType.LAZY)
25+
private Organization organization;
26+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package pl.piomin.sample.spring.graphql.domain;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
@Data
8+
@AllArgsConstructor
9+
@NoArgsConstructor
10+
public class DepartmentInput {
11+
private String name;
12+
private Integer organizationId;
13+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package pl.piomin.sample.spring.graphql.domain;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.EqualsAndHashCode;
6+
import lombok.NoArgsConstructor;
7+
8+
import javax.persistence.*;
9+
10+
@Entity
11+
@Data
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
15+
public class Employee {
16+
@Id
17+
@GeneratedValue(strategy = GenerationType.IDENTITY)
18+
@EqualsAndHashCode.Include
19+
private Integer id;
20+
private String firstName;
21+
private String lastName;
22+
private String position;
23+
private int salary;
24+
private int age;
25+
@ManyToOne(fetch = FetchType.LAZY)
26+
private Department department;
27+
@ManyToOne(fetch = FetchType.LAZY)
28+
private Organization organization;
29+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package pl.piomin.sample.spring.graphql.domain;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
@Data
8+
@NoArgsConstructor
9+
@AllArgsConstructor
10+
public class EmployeeInput {
11+
private String firstName;
12+
private String lastName;
13+
private String position;
14+
private int salary;
15+
private int age;
16+
private Integer departmentId;
17+
private Integer organizationId;
18+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package pl.piomin.sample.spring.graphql.domain;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.EqualsAndHashCode;
6+
import lombok.NoArgsConstructor;
7+
8+
import javax.persistence.*;
9+
import java.util.Set;
10+
11+
@Entity
12+
@Data
13+
@AllArgsConstructor
14+
@NoArgsConstructor
15+
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
16+
public class Organization {
17+
@Id
18+
@GeneratedValue(strategy = GenerationType.IDENTITY)
19+
@EqualsAndHashCode.Include
20+
private Integer id;
21+
private String name;
22+
@OneToMany(mappedBy = "organization")
23+
private Set<Department> departments;
24+
@OneToMany(mappedBy = "organization")
25+
private Set<Employee> employees;
26+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package pl.piomin.sample.spring.graphql.domain;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
@Data
8+
@NoArgsConstructor
9+
@AllArgsConstructor
10+
public class OrganizationInput {
11+
private String name;
12+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package pl.piomin.sample.spring.graphql.filter;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class EmployeeFilter {
7+
private FilterField salary;
8+
private FilterField age;
9+
private FilterField position;
10+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package pl.piomin.sample.spring.graphql.filter;
2+
3+
import lombok.Data;
4+
5+
import javax.persistence.criteria.CriteriaBuilder;
6+
import javax.persistence.criteria.Path;
7+
import javax.persistence.criteria.Predicate;
8+
9+
@Data
10+
public class FilterField {
11+
private String operator;
12+
private String value;
13+
14+
public Predicate generateCriteria(CriteriaBuilder builder, Path field) {
15+
try {
16+
int v = Integer.parseInt(value);
17+
switch (operator) {
18+
case "lt": return builder.lt(field, v);
19+
case "le": return builder.le(field, v);
20+
case "gt": return builder.gt(field, v);
21+
case "ge": return builder.ge(field, v);
22+
case "eq": return builder.equal(field, v);
23+
}
24+
} catch (NumberFormatException e) {
25+
switch (operator) {
26+
case "endsWith": return builder.like(field, "%" + value);
27+
case "startsWith": return builder.like(field, value + "%");
28+
case "contains": return builder.like(field, "%" + value + "%");
29+
case "eq": return builder.equal(field, value);
30+
}
31+
}
32+
33+
return null;
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package pl.piomin.sample.spring.graphql.repository;
2+
3+
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
4+
import org.springframework.data.repository.CrudRepository;
5+
import pl.piomin.sample.spring.graphql.domain.Department;
6+
7+
public interface DepartmentRepository extends CrudRepository<Department, Integer>,
8+
JpaSpecificationExecutor<Department> {
9+
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package pl.piomin.sample.spring.graphql.repository;
2+
3+
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
4+
import org.springframework.data.repository.CrudRepository;
5+
import pl.piomin.sample.spring.graphql.domain.Employee;
6+
7+
public interface EmployeeRepository extends CrudRepository<Employee, Integer>,
8+
JpaSpecificationExecutor<Employee> {
9+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package pl.piomin.sample.spring.graphql.repository;
2+
3+
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
4+
import org.springframework.data.repository.CrudRepository;
5+
import pl.piomin.sample.spring.graphql.domain.Department;
6+
import pl.piomin.sample.spring.graphql.domain.Organization;
7+
8+
public interface OrganizationRepository extends CrudRepository<Organization, Integer>,
9+
JpaSpecificationExecutor<Organization> {
10+
}

0 commit comments

Comments
 (0)