Прежде всего, у вас есть логика для генерации токена, если токена нет. Например:
private Mono<String> getToken(String token) {
return Mono
.just(token)
.switchIfEmpty(Mono.just("some token"));
}
В этом случае немного излишне использовать switchIfEmpty
для этого, но я предполагаю, что ваш процесс генерации токена немного сложнее, в противном случае вы могли бы работать с Optional<String>
вместо (например, * 1006). *).
Кроме того, у нас также есть некоторая логика, чтобы либо найти пользователя по его токену, либо создать нового пользователя, если по данному токену нет пользователя:
private Mono<User> 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 есть поддержка.