Реактор проекта проверка условий - PullRequest
0 голосов
/ 06 марта 2020

подскажите, как работать с условиями в Reactive.

У меня есть простой метод DTO SignInRequest и signIn .

public class SignInRequest {

  private String userName;
  private String password;
}

public Mono<SignInResponse> signIn(SignInRequest signInRequest) {
    boolean isValid = StringUtils.isEmailValid(signInRequest.getUserName());
    return userService.findByEmail(signInRequest.getUserName())
        .switchIfEmpty(Mono.error(new NotFoundException("User not found [email: " + signInRequest.getEmail() + "]")))
        .filter(user -> passwordService.validatePassword(user.getPassword(), signInRequest.getPassword()))
        .switchIfEmpty(Mono.error(new BadRequestException("Wrong email or password")))
        .flatMap(this::generateTokens);
}

Как правильно реализовать следующую логику c.

Если isValid == true, то вызвать метод findByEmail . В противном случае вызовите findByUsername

Ответы [ 2 ]

2 голосов
/ 06 марта 2020

Лично я думаю, что наиболее читаемой реализацией будет следующее:

public Mono<SignInResponse> signIn(SignInRequest signInRequest) {
    return Mono
            .fromSupplier(() -> StringUtils.isEmailValid(signInRequest.getUserName()))
            .flatMap(isValid ->
                    isValid ? userService.findByEmail(signInRequest.getUserName())
                            : userService.findByUsername(signInRequest.getUserName())
            )
            .switchIfEmpty(Mono.error(new BadRequestException("Wrong email or password")))
            .flatMap(this::generateTokens);
}
1 голос
/ 06 марта 2020

В цепи реактора нет if-else, но мы могли бы заставить его работать так.

Mono.fromSupplier(() -> StringUtils.isEmailValid(signInRequest.getUserName()))
    .filter(o -> o)
    .flatMap(o -> userService.findByEmail(signInRequest.getUserName()))
    .switchIfEmpty(userService.findByUsername(signInRequest.getUserName()))
    ...
...