Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@

@SpringBootApplication
public class ReactiveSpringBootApplication {
public static void main(String[] args){
SpringApplication.run(ReactiveSpringBootApplication.class,args);
public static void main(String[] args) {
SpringApplication.run(ReactiveSpringBootApplication.class, args);

}
}
13 changes: 7 additions & 6 deletions src/main/java/com/reactive/examples/client/UserClient.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,24 +11,25 @@
@Component
@Slf4j
public class UserClient {
private WebClient client = WebClient.create("http://localhost:8080");
public Mono<User> getUser(String userId){
return client.get()
private final WebClient client = WebClient.create("http://localhost:8080");

public Mono<User> getUser(String userId) {
return client.get()
.uri("/users/{userId}", userId)
.retrieve()
.bodyToMono(User.class).log(" User fetched ");
}

public Flux<User> getAllUsers(){
public Flux<User> getAllUsers() {
return client.get()
.uri("/users")
.exchange().flatMapMany(clientResponse -> clientResponse.bodyToFlux(User.class)).log("Users Fetched : ");
}

public Mono<User> createUser(User user){
public Mono<User> createUser(User user) {
Mono<User> userMono = Mono.just(user);
return client.post().uri("/users").contentType(MediaType.APPLICATION_JSON)
.body(userMono,User.class).retrieve().bodyToMono(User.class).log("Created User : ");
.body(userMono, User.class).retrieve().bodyToMono(User.class).log("Created User : ");

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,24 +13,27 @@
@RequestMapping("/client/users")
public class UserClientController {

@Autowired
private UserClient userClient;
private final UserClient userClient;

public UserClientController(UserClient userClient) {
this.userClient = userClient;
}

@GetMapping("/{userId}")
public Mono<ResponseEntity<User>> getUserById(@PathVariable String userId){
public Mono<ResponseEntity<User>> getUserById(@PathVariable String userId) {
Mono<User> user = userClient.getUser(userId);
return user.map( u -> ResponseEntity.ok(u))
return user.map(u -> ResponseEntity.ok(u))
.defaultIfEmpty(ResponseEntity.notFound().build());
}

@GetMapping
public Flux<User> getAllUsers(){
public Flux<User> getAllUsers() {
return userClient.getAllUsers();
}

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public Mono<User> create(@RequestBody User user){
public Mono<User> create(@RequestBody User user) {
return userClient.createUser(user);
}

Expand Down
25 changes: 14 additions & 11 deletions src/main/java/com/reactive/examples/controller/UserController.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,38 +15,41 @@
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
private final UserService userService;

public UserController(UserService userService) {
this.userService = userService;
}

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
public Mono<User> create(@RequestBody User user){
public Mono<User> create(@RequestBody User user) {
return userService.createUser(user);
}

@GetMapping
public Flux<User> getAllUsers(){
public Flux<User> getAllUsers() {
return userService.getAllUsers();
}

@GetMapping("/{userId}")
public Mono<ResponseEntity<User>> getUserById(@PathVariable Integer userId){
public Mono<ResponseEntity<User>> getUserById(@PathVariable Integer userId) {
Mono<User> user = userService.findById(userId);
return user.map( u -> ResponseEntity.ok(u))
return user.map(u -> ResponseEntity.ok(u))
.defaultIfEmpty(ResponseEntity.notFound().build());
}

@PutMapping("/{userId}")
public Mono<ResponseEntity<User>> updateUserById(@PathVariable Integer userId, @RequestBody User user){
return userService.updateUser(userId,user)
public Mono<ResponseEntity<User>> updateUserById(@PathVariable Integer userId, @RequestBody User user) {
return userService.updateUser(userId, user)
.map(updatedUser -> ResponseEntity.ok(updatedUser))
.defaultIfEmpty(ResponseEntity.badRequest().build());
}

@DeleteMapping("/{userId}")
public Mono<ResponseEntity<Void>> deleteUserById(@PathVariable Integer userId){
public Mono<ResponseEntity<Void>> deleteUserById(@PathVariable Integer userId) {
return userService.deleteUser(userId)
.map( r -> ResponseEntity.ok().<Void>build())
.map(r -> ResponseEntity.ok().<Void>build())
.defaultIfEmpty(ResponseEntity.notFound().build());
}

Expand All @@ -61,7 +64,7 @@ public Flux<User> fetchUsersByIds(@RequestBody List<Integer> ids) {
}

@GetMapping("/{userId}/department")
public Mono<UserDepartmentDTO> fetchUserAndDepartment(@PathVariable Integer userId){
public Mono<UserDepartmentDTO> fetchUserAndDepartment(@PathVariable Integer userId) {
return userService.fetchUserAndDepartment(userId);
}

Expand Down
29 changes: 16 additions & 13 deletions src/main/java/com/reactive/examples/initialize/UserInitializer.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,26 +19,29 @@
@Slf4j
public class UserInitializer implements CommandLineRunner {

@Autowired
private UserRepository userRepository;
private final UserRepository userRepository;

private final DepartmentRepository departmentRepository;

public UserInitializer(UserRepository userRepository, DepartmentRepository departmentRepository) {
this.userRepository = userRepository;
this.departmentRepository = departmentRepository;
}

@Autowired
private DepartmentRepository departmentRepository;

@Override
public void run(String... args) {
initialDataSetup();
initialDataSetup();
}

private List<User> getData(){
return Arrays.asList(new User(null,"Suman Das",30,10000),
new User(null,"Arjun Das",5,1000),
new User(null,"Saurabh Ganguly",40,1000000));
private List<User> getData() {
return Arrays.asList(new User(null, "Suman Das", 30, 10000),
new User(null, "Arjun Das", 5, 1000),
new User(null, "Saurabh Ganguly", 40, 1000000));
}

private List<Department> getDepartments(){
return Arrays.asList(new Department(null,"Mechanical",1,"Mumbai"),
new Department(null,"Computer",2,"Bangalore"));
private List<Department> getDepartments() {
return Arrays.asList(new Department(null, "Mechanical", 1, "Mumbai"),
new Department(null, "Computer", 2, "Bangalore"));
}

private void initialDataSetup() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import reactor.core.publisher.Mono;

public interface DepartmentRepository extends ReactiveCrudRepository<Department,Integer> {
public interface DepartmentRepository extends ReactiveCrudRepository<Department, Integer> {
Mono<Department> findByUserId(Integer userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import org.springframework.data.repository.reactive.ReactiveCrudRepository;
import reactor.core.publisher.Flux;

public interface UserRepository extends ReactiveCrudRepository<User,Integer> {
public interface UserRepository extends ReactiveCrudRepository<User, Integer> {
@Query("select * from users where age >= $1")
Flux<User> findByAge(int age);
}
29 changes: 16 additions & 13 deletions src/main/java/com/reactive/examples/service/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,25 +21,28 @@
@Transactional
public class UserService {

@Autowired
private UserRepository userRepository;
private final UserRepository userRepository;

@Autowired
private DepartmentRepository departmentRepository;
private final DepartmentRepository departmentRepository;

public Mono<User> createUser(User user){
public UserService(UserRepository userRepository, DepartmentRepository departmentRepository) {
this.userRepository = userRepository;
this.departmentRepository = departmentRepository;
}

public Mono<User> createUser(User user) {
return userRepository.save(user);
}

public Flux<User> getAllUsers(){
public Flux<User> getAllUsers() {
return userRepository.findAll();
}

public Mono<User> findById(Integer userId){
public Mono<User> findById(Integer userId) {
return userRepository.findById(userId);
}

public Mono<User> updateUser(Integer userId, User user){
public Mono<User> updateUser(Integer userId, User user) {
return userRepository.findById(userId)
.flatMap(dbUser -> {
dbUser.setAge(user.getAge());
Expand All @@ -48,13 +51,13 @@ public Mono<User> updateUser(Integer userId, User user){
});
}

public Mono<User> deleteUser(Integer userId){
public Mono<User> deleteUser(Integer userId) {
return userRepository.findById(userId)
.flatMap(existingUser -> userRepository.delete(existingUser)
.then(Mono.just(existingUser)));
.then(Mono.just(existingUser)));
}

public Flux<User> findUsersByAge(int age){
public Flux<User> findUsersByAge(int age) {
return userRepository.findByAge(age);
}

Expand All @@ -66,11 +69,11 @@ public Flux<User> fetchUsers(List<Integer> userIds) {
.ordered((u1, u2) -> u2.getId() - u1.getId());
}

private Mono<Department> getDepartmentByUserId(Integer userId){
private Mono<Department> getDepartmentByUserId(Integer userId) {
return departmentRepository.findByUserId(userId);
}

public Mono<UserDepartmentDTO> fetchUserAndDepartment(Integer userId){
public Mono<UserDepartmentDTO> fetchUserAndDepartment(Integer userId) {
Mono<User> user = findById(userId).subscribeOn(Schedulers.elastic());
Mono<Department> department = getDepartmentByUserId(userId).subscribeOn(Schedulers.elastic());
return Mono.zip(user, department, userDepartmentDTOBiFunction);
Expand Down