1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | case class Profile( loginInfo ![]() confirmed: Boolean, email:Option[String], firstName: Option[String], lastName: Option[String], fullName: Option[String], passwordInfo:Option[PasswordInfo], oauth1Info: Option[OAuth1Info], avatarUrl: Option[String]) case class User(id: UUID, profiles: List[Profile]) extends Identity { def profileFor(loginInfo ![]() def fullName(loginInfo ![]() } object User { implicit val passwordInfoJsonFormat = Json.format[PasswordInfo] implicit val oauth1InfoJsonFormat = Json.format[OAuth1Info] implicit val profileJsonFormat = Json.format[Profile] implicit val userJsonFormat = Json.format[User] } |
1 2 3 4 5 6 7 8 | trait UserDao { def save(user:User):Future[User] def find(loginInfo ![]() def find(userId:UUID):Future[Option[User]] def confirm(loginInfo ![]() def link(user:User, profile ![]() def update(profile ![]() } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | class MongoUserDao extends UserDao { lazy val reactiveMongoApi = current.injector.instanceOf[ReactiveMongoApi] val users = reactiveMongoApi.db.collection[JSONCollection]("users") def find(loginInfo ![]() users.find(Json.obj("profiles.loginInfo" -> loginInfo)).one[User] def find(userId:UUID):Future[Option[User]] = users.find(Json.obj("id" -> userId)).one[User] def save(user:User):Future[User] = users.insert(user).map(_ => user) def confirm(loginInfo ![]() _ <- users.update(Json.obj( "profiles.loginInfo" -> loginInfo ), Json.obj("$set" -> Json.obj("profiles.$.confirmed" -> true))) user <- find(loginInfo) } yield user.get def link(user:User, profile ![]() _ <- users.update(Json.obj( "id" -> user.id ), Json.obj("$push" -> Json.obj("profiles" -> profile))) user <- find(user.id) } yield user.get def update(profile ![]() _ <- users.update(Json.obj( "profiles.loginInfo" -> profile.loginInfo ), Json.obj("$set" -> Json.obj("profiles.$" -> profile))) user <- find(profile.loginInfo) } yield user.get } |
1 2 3 4 5 6 7 8 | def fakeApp = FakeApplication(additionalConfiguration = Map("mongodb.uri" -> "mongodb://localhost:27017/test")) def withUserDao[T](t:MongoUserDao => T):T = running(fakeApp) { val userDao = new MongoUserDao Await.ready(userDao.users.drop(), timeout) t(userDao) } |
1 2 3 4 5 6 7 8 9 | "UserDao" should { "save users and find them by userId" in withUserDao { userDao => val future = for { _ <- userDao.save(credentialsTestUser) maybeUser <- userDao.find(credentialsTestUser.id) } yield maybeUser.map(_ == credentialsTestUser) Await.result(future, timeout) must beSome(true) } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | class UserService @Inject() (userDao:UserDao) extends IdentityService[User] { def retrieve(loginInfo ![]() def save(user:User) = userDao.save(user) def find(id:UUID) = userDao.find(id) def confirm(loginInfo ![]() def link(user:User, socialProfile:CommonSocialProfile) = { val profile = toProfile(socialProfile) if (user.profiles.exists(_.loginInfo == profile.loginInfo)) Future.successful(user) else userDao.link(user, profile) } def save(socialProfile:CommonSocialProfile) = { val profile = toProfile(socialProfile) userDao.find(profile.loginInfo).flatMap { case None => userDao.save(User(UUID.randomUUID(), List(profile))) case Some(user) => userDao.update(profile) } } private def toProfile(p:CommonSocialProfile) = Profile( loginInfo = p.loginInfo, confirmed = true, email = p.email, firstName = p.firstName, lastName = p.lastName, fullName = p.fullName, passwordInfo = None, oauth1Info = None, avatarUrl = p.avatarURL ) } |
1 2 3 4 5 6 7 8 9 10 | case class UserToken(id:UUID, userId:UUID, email:String, expirationTime![]() def isExpired = expirationTime.isBeforeNow } object UserToken { implicit val toJson = Json.format[UserToken] def create(userId:UUID, email:String, isSignUp:Boolean) = UserToken(UUID.randomUUID(), userId, email, new DateTime().plusHours(12), isSignUp) } |
1 2 3 4 5 | class UserTokenService @Inject() (userTokenDao:UserTokenDao) { def find(id:UUID) = userTokenDao.find(id) def save(token:UserToken) = userTokenDao.save(token) def remove(id:UUID) = userTokenDao.remove(id) } |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |