Прежде всего, у вас есть логика для генерации токена, если токена нет. Например:
private Mono getToken(String token) {
return Mono
.just(token)
.switchIfEmpty(Mono.just("some token"));
}
В этом случае немного излишне использовать switchIfEmpty
для этого, но я предполагаю, что ваш процесс генерации токена немного сложнее, иначе вы могли бы работать с [ 114] вместо (например, token.orElse("some token")
).
Кроме того, у нас также есть некоторая логика, чтобы либо найти пользователя по его токену, либо создать нового пользователя, если по данному токену нет пользователя:
private Mono findUserByToken(String token) {
return userRepository
.findByToken(token)
.switchIfEmpty(userRepository.save(new User("John Doe", token)));
}
Теперь, когда у нас есть эти методы, мы можем создать PageView
и использовать эти методы по пути. Причина, по которой я начинаю с создания PageView
, заключается в том, что это первая «константа» во всем токене, независимо от того, найден ли токен / пользователь:
return Mono
.just(new PageView(uri))
.flatMap(pageViewRepository::save)
.flatMap(pageView -> getToken(token)
.flatMap(this::findUserByToken)
.doOnNext(user -> user.setFoo("foo"))
.doOnNext(user -> user.getPageView().add(pageView)))
.flatMap(userRepository::save)
.map(User::getToken);
Теперь, поскольку вам нужен токен добавить к ответу, и я понял, что токен как-то является частью объекта User
(иначе UserRepository.findByToken()
не сработает?), было бы проще просто использовать User::getToken
в конце, чтобы получить токен для передачи на ответ.
Имейте в виду, что шаблон репозитория правильно работает с Spring, но есть только реактивная поддержка для MongoDB, Cassandra, Couchbase и Redis. Кроме этого, есть также реактивная поддержка PostgreSQL через rdbc , но я не думаю, что данные Spring поддерживают это.