UserManager: fix rx logic for scheduleUserForDeletionWithId

Signed-off-by: Álvaro Brey <alvaro.brey@nextcloud.com>
This commit is contained in:
Álvaro Brey 2022-07-19 17:46:32 +02:00 committed by Andy Scherzinger
parent e7c258e2f8
commit a3b99e9010
No known key found for this signature in database
GPG Key ID: 6CADC7E3523C308B

View File

@ -40,22 +40,6 @@ class UserManager internal constructor(private val userRepository: UsersReposito
val usersScheduledForDeletion: Single<List<User>> val usersScheduledForDeletion: Single<List<User>>
get() = userRepository.getUsersScheduledForDeletion() get() = userRepository.getUsersScheduledForDeletion()
private fun getAnyUserAndSetAsActive(): Single<User> {
val results = userRepository.getUsersNotScheduledForDeletion()
// TODO needs to return Empty in case no user was found (and set active)
return results
.map { users ->
users
.firstOrNull()
?.apply {
current = true
}.also { user ->
userRepository.updateUser(user!!)
}
}
}
override val currentUser: Maybe<User> override val currentUser: Maybe<User>
get() { get() {
return userRepository.getActiveUser() return userRepository.getActiveUser()
@ -107,18 +91,40 @@ class UserManager internal constructor(private val userRepository: UsersReposito
.switchIfEmpty(Single.just(false)) .switchIfEmpty(Single.just(false))
} }
/**
* Don't ask
*
* @return `true` if the user was updated **AND** there is another user to set as active, `false` otherwise
*/
fun scheduleUserForDeletionWithId(id: Long): Single<Boolean> { fun scheduleUserForDeletionWithId(id: Long): Single<Boolean> {
// TODO needs to return false in case getAnyUserAndSetAsActive doesn't return a user
// or getUserWithId(id) doesn't return a user
return userRepository.getUserWithId(id) return userRepository.getUserWithId(id)
.map { user -> .map { user ->
user.scheduledForDeletion = true user.scheduledForDeletion = true
user.current = false user.current = false
userRepository.updateUser(user) userRepository.updateUser(user)
} }
.toSingle()
.flatMap { getAnyUserAndSetAsActive() } .flatMap { getAnyUserAndSetAsActive() }
.map { true } .map { true }
.switchIfEmpty(Single.just(false))
}
private fun getAnyUserAndSetAsActive(): Maybe<User> {
val results = userRepository.getUsersNotScheduledForDeletion()
return results
.flatMapMaybe {
if (it.isNotEmpty()) {
val user = it.first()
user.apply {
current = true
}.also { user ->
userRepository.updateUser(user)
}
Maybe.just(user)
} else {
Maybe.empty()
}
}
} }
fun updateExternalSignalingServer(id: Long, externalSignalingServer: ExternalSignalingServer): Single<Int> { fun updateExternalSignalingServer(id: Long, externalSignalingServer: ExternalSignalingServer): Single<Int> {
@ -181,9 +187,8 @@ class UserManager internal constructor(private val userRepository: UsersReposito
@Deprecated("Only available for migration, use updateExternalSignalingServer or create new methods") @Deprecated("Only available for migration, use updateExternalSignalingServer or create new methods")
fun createOrUpdateUser( fun createOrUpdateUser(
username: String?, username: String?,
userAttributes: UserAttributes, userAttributes: UserAttributes
): Maybe<User> { ): Maybe<User> {
val userMaybe: Maybe<User> = findUser(username, userAttributes) val userMaybe: Maybe<User> = findUser(username, userAttributes)
return userMaybe return userMaybe