#spring #kotlin #spring-webflux
#весна #kotlin #spring-webflux
Вопрос:
У меня есть веб-приложение, написанное на Kotlin. Это чат, похожий на Discord. У меня есть функция, которая выполняет несколько действий. Сама функция используется для удаления учетной записи пользователя, но при этом она также удаляет сообщения, которые он когда-либо списывал из базы данных, он удаляется из всех групп в базе данных, а в группах, где он был администратором, выбирается новый администратор.
И эта функция выглядит так:
fun deleteAccount(userId: String) : Flux<Void>{
return groupRepository.findAllByAdmin(userId)
.flatMap{
if(it.users.size<1) groupRepository.deleteById(it._id)
it.admin = it.users[0]
it.users.remove(userId)
groupRepository.save(it)
}
.flatMap {
messageRepository.deleteMessageByUserId(userId)
userRepository.deleteById(userId)
}
}
Мои репозитории выглядят так:
@Repository
interface GroupRepository : ReactiveCrudRepository<GroupRequest, String> {
fun findByName(name: String): Mono<GroupRequest>
fun existsByName(name: String): Mono<Boolean>
fun findAllByAdmin(admin:String) : Flux<GroupRequest>
}
@Repository
interface MessageRepository : ReactiveCrudRepository<Message, String> {
fun findMessageByGroupId(groupId: String): Flux<Message>
fun deleteMessageByUserId(userId:String) : Mono<Void>
}
Итак, последние 2 оператора в моей функции возвращают void Mono.
Проблема в том, что не имеет значения, какой оператор выполняется первым, выполняется только один из 2 операторов, и теперь я попробовал несколько вещей, в том числе Flux.zip
он не работает полностью. Если я сначала помещаю deleteMessages, все работает, кроме той части, где пользователь удаляется из базы данных. В чем проблема в этой функции и как я могу ее исправить?
Ответ №1:
Я исправил это, заархивировав оба оператора во второй flatMap, выглядит так:
fun deleteAccount(userId: String) : Flux<Void>{
return groupRepository.findAllByAdmin(userId)
.flatMap{
if(it.users.size<1) groupRepository.deleteById(it._id)
it.admin = it.users[0]
it.users.remove(userId)
groupRepository.save(it)
}
.flatMap {
Mono.zip(messageRepository.deleteMessageByUserId(userId),userRepository.deleteById(userId)).map {
it.t1
}
}
}
Ответ №2:
Возможно, вы ищете Mono.when()
, если все, о чем вы заботитесь, — это сигнал завершения.