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, но не смог понять это. Не могли бы вы указать, где я делаю неправильно?

Заранее благодарю,

0 ответов

Другие вопросы по тегам