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