| Unauthorized of AuthError
let login (username: string) (password: string) : Job<Result<AuthToken, LoginError>> =
let! user = username |> tryGetUser |> JobResult.requireSome InvalidUser
do! user |> isPwdValid password |> Result.requireTrue InvalidPwd
do! user |> authorize |> JobResult.mapError Unauthorized
return! user |> createAuthToken |> Result.mapError TokenErr