2

我有以下目标:创建一个单子,添加一个具有以下计算流程的用户:

  1. 检查用户是否存在指定的电子邮件,如果不存在则:
  2. 检查给定的凭据是否正常(密码足够长等)。如果他们没问题,那么:
  3. 将用户保存到数据库

我的第一个“草稿”是这样的:

val work: DBIO[UserId] = for {
   userO <- UserRepository.findByEmail(createdUser.email) //userO is Option[User]
   //This won't work cause Action.withFilter doesnt exist
   if userO.isEmpty 
   //as above, validate user actually returns an ValidateNel[String, User]
   if User.validateUser(createdUser.email, createdUser.password).isValid 
   //Returns DBIO[UserId]
   id <- UserRepository.save(createdUser)
} yield id

任何想法在我可以db.run(...)的一个单子计算中写下来的最佳方法是什么?我正在使用 Cats + Slick 3.0。如果有帮助,我还从https://groups.google.com/forum/?fromgroups#!topic/scalaquery/HrvrvyEIopw写了一个简单的隐式 dbioMonad。

4

1 回答 1

3

这个不用于理解,所以让我知道这是否可以接受。

val work: DBIO[UserId] = {
  UserRepository.findByEmail(createdUser.email).flatMap {
    case Some(_) => DBIO.failed(new Exception("Provided email is already taken"))
    case _ =>
      if(User.validateUser(createdUser.email, createdUser.password).isValid) {
        UserRepository.save(createdUser)
      } else {
        DBIO.failed(new Exception("User validation has failed"))
      }
  }.transactionally
}
于 2016-05-19T22:47:08.090 回答