jean
02/24/2022, 8:31 AM// create a hash from clear password
return hashPassword(password, pbkdf2Values)
// search for email/hash pair in db
.flatMap { database.findUserByCredentials(email, it) }
.map {
// if user is registered, check for existing auth token
when (val existingToken = database.token(it, userAgent)) {
is Either.Left -> createToken(jwtValues, it, userAgent) // no token -> create a new one
is Either.Right -> existingToken.value // token exists -> return it
}
}
I tried to use either.eager{} or fold(ifLeft, ifRight) but I didn’t find any solution more convincing 😕simon.vergauwen
02/24/2022, 8:46 AMeither blocks.
either.eager {
val cred = hashPassword(password, pbkdf2Values).bind()
val user = database.findUserByCredentials(email, cred).bind()
database.token(user, userAgent)
.handleError { createToken(jwtValues, user, userAgent) }
.bind()
}simon.vergauwen
02/24/2022, 8:46 AMdatabase.token to provide a fallback function before you bind the value.simon.vergauwen
02/24/2022, 8:47 AMhandleErrorWith if createToken returns another Either.jean
02/24/2022, 10:01 AMhandleError and indeed that make the either block a bit better. Thanks 🙂Srki Rakic
02/25/2022, 12:14 AM