Silhouette 4.0: добавление части автоматического входа после активации по электронной почте
Я пытаюсь внедрить часть автоматического входа в метод активации, и приведенный ниже код работает просто отлично.
def activate(token: UUID) = silhouette.UnsecuredAction.async { implicit request =>
authTokenService.validate(token).flatMap {
case Some(authToken) => userService.retrieve(authToken.userID).flatMap {
case Some(user) if user.loginInfo.providerID == CredentialsProvider.ID =>
userService.save(user.copy(activated = true)).map { _ =>
Redirect(auth.routes.SignInController.view())
}
}
}
}
Но когда я добавляю часть автоматического входа, компилятор говорит:
[error] found : scala.concurrent.Future[com.mohiva.play.silhouette.api.services.AuthenticatorResult]
[error] required: play.api.mvc.Result
[error] userService.retrieve(user.loginInfo).flatMap {
[error] ^
Вот фактический код.
def activateAndLogin(token: UUID) = silhouette.UnsecuredAction.async { implicit request =>
authTokenService.validate(token).flatMap {
case Some(authToken) => userService.retrieve(authToken.userID).flatMap {
case Some(user) if user.loginInfo.providerID == CredentialsProvider.ID =>
userService.save(user.copy(activated = true)).map { user =>
val result = Redirect(pages.routes.ApplicationController.index())
userService.retrieve(user.loginInfo).flatMap {
case Some(user) =>
silhouette.env.authenticatorService.create(user.loginInfo).flatMap {
authenticator =>
silhouette.env.eventBus.publish(LoginEvent(user, request))
silhouette.env.authenticatorService.init(authenticator).flatMap { v =>
silhouette.env.authenticatorService.embed(v, result)
}
}
}
}
case _ => Future.successful(Redirect(auth.routes.SignInController.view()))
}
case None => Future.successful(Redirect(auth.routes.SignInController.view()))
}
}
Я перепробовал много паттернов map/flatMap, но не смог понять это. Не могли бы вы указать, где я делаю неправильно?
Заранее благодарю,