[BAEL-6689] code for zipwhen

This commit is contained in:
uzma 2023-07-12 01:23:19 +01:00
parent 1db057ebc8
commit 4ce1835f93
6 changed files with 189 additions and 0 deletions

View File

@ -0,0 +1,22 @@
package com.baeldung.webflux.zipwhen.model;
public class User {
private final String id;
private final String email;
public User(String id, String email) {
this.id = id;
this.email = email;
}
public String getId() {
return id;
}
public String getEmail() {
return email;
}
}

View File

@ -0,0 +1,37 @@
package com.baeldung.webflux.zipwhen.service;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import com.baeldung.webflux.zipwhen.model.User;
import reactor.core.publisher.Mono;
public class DatabaseService {
private Map<String, User> dataStore = new ConcurrentHashMap<>();
// public Mono<Boolean> saveUserData(User user) {
//
//
// return Mono.fromRunnable(() -> {
// // Simulate saving the user data to a database or data store
// dataStore.put(user.getId(), user);
//
//
// });
// }
//}
public Mono<Boolean> saveUserData(User user) {
return Mono.create(sink -> {
// Simulate saving the user data to a database or data store
try {
dataStore.put(user.getId(), user);
sink.success(true); // Database save operation successful
} catch (Exception e) {
sink.success(false); // Database save operation failed
}
});
}
}

View File

@ -0,0 +1,29 @@
package com.baeldung.webflux.zipwhen.service;
import reactor.core.publisher.Mono;
//public class EmailService {
// public Mono<Boolean> sendEmail(String userId) {
// //code to send the email
// return Mono.just(true);
// }
//}
public class EmailService {
private final UserService userService;
public EmailService(UserService userService) {
this.userService = userService;
}
public Mono<Boolean> sendEmail(String userId) {
return userService.getUser(userId)
.flatMap(user -> {
// Code to send the email using the user's information
System.out.println("Sending email to: " + user.getEmail());
return Mono.just(true);
})
.defaultIfEmpty(false);
}
}

View File

@ -0,0 +1,15 @@
package com.baeldung.webflux.zipwhen.service;
import com.baeldung.webflux.zipwhen.model.User;
import reactor.core.publisher.Mono;
public class UserService {
public Mono<User> getUser(String userId) {
// Replace with your implementation to validate the user
// and return a Mono<User> with the validated user data
// For example:
return Mono.just(new User(userId, "John Doe"));
}
}

View File

@ -0,0 +1,44 @@
package com.baeldung.webflux.zipwhen.web;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import com.baeldung.webflux.zipwhen.model.User;
import com.baeldung.webflux.zipwhen.service.DatabaseService;
import com.baeldung.webflux.zipwhen.service.EmailService;
import com.baeldung.webflux.zipwhen.service.UserService;
import reactor.core.publisher.Mono;
import reactor.core.scheduler.Schedulers;
import reactor.util.function.Tuples;
public class UserController {
private final UserService userService;
private final EmailService emailService;
private final DatabaseService databaseService;
public UserController(UserService userService,
EmailService emailService,
DatabaseService databaseService) {
this.userService = userService;
this.emailService = emailService;
this.databaseService = databaseService;
}
@GetMapping("/example/{userId}")
public Mono<ResponseEntity<String>> combineAllDataFor(@PathVariable String userId) {
Mono<User> userMono = userService.getUser(userId);
Mono<Boolean> emailSentMono = emailService.sendEmail(userId)
.subscribeOn(Schedulers.parallel());
Mono<String> databaseResultMono = userMono.flatMap(user -> databaseService.saveUserData(user)
.map(Object::toString));
return userMono.zipWhen(user -> emailSentMono, Tuples::of)
.zipWhen(tuple -> databaseResultMono, (tuple, databaseResult) -> {
User user = tuple.getT1();
Boolean emailSent = tuple.getT2();
return ResponseEntity.ok()
.body("Response: " + user + ", Email Sent: " + emailSent + ", Database Result: " + databaseResult);
});
}
}

View File

@ -0,0 +1,42 @@
package com.baeldung.webflux.zipwhen;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import com.baeldung.webflux.zipwhen.model.User;
import com.baeldung.webflux.zipwhen.service.DatabaseService;
import com.baeldung.webflux.zipwhen.service.EmailService;
import com.baeldung.webflux.zipwhen.service.UserService;
import com.baeldung.webflux.zipwhen.web.UserController;
import reactor.core.publisher.Mono;
import reactor.test.StepVerifier;
public class UserControllerTest {
@Test
public void givenUserId_whenCombineAllData_thenReturnsMonoWithCombinedData() {
UserService userService = Mockito.mock(UserService.class);
EmailService emailService = Mockito.mock(EmailService.class);
DatabaseService databaseService = Mockito.mock(DatabaseService.class);
String userId = "123";
User user = new User(userId, "John Doe");
Mockito.when(userService.getUser(userId)).thenReturn(Mono.just(user));
Mockito.when(emailService.sendEmail(userId)).thenReturn(Mono.just(true));
Mockito.when(databaseService.saveUserData(user)).thenReturn(Mono.just(true));
UserController userController = new UserController(userService, emailService, databaseService);
Mono<ResponseEntity<String>> responseMono = userController.combineAllDataFor(userId);
StepVerifier.create(responseMono)
.expectNextMatches(responseEntity ->
responseEntity.getStatusCode() == HttpStatus.OK &&
responseEntity.getBody().equals("Response: " + user + ", Email Sent: true, Database Result: " + true)
)
.verifyComplete();
}
}