このScala Play 認証の例に基づいて認証を実装しています。
したがって、次を使用しActionBuilder
てUserAction
.
UserAction.scala
class UserRequest[A](val user: Option[Admin], request: Request[A]) extends WrappedRequest[A](request)
class UserAction @Inject()(adminService: AdminService, parser: BodyParsers.Default)(implicit val executionContext: ExecutionContext)
extends ActionBuilder[UserRequest, AnyContent]
with ActionTransformer[Request, UserRequest] {
def transform[A](request: Request[A]) = Future.successful {
val sessionTokenOpt = request.session.get("sessionToken")
val user = sessionTokenOpt
.flatMap(token => Sessions.getSession(token))
.filter(_.expiration.isAfter(LocalDateTime.now(ZoneOffset.UTC)))
.map(_.email)
// Signature: getAdminByEmail(email: String): Future[Option[Admin]]
.flatMap(adminService.getAdminByEmail) // <- Extract Future here
// The user has to be Option[Admin] but is Future[Option[Admin]]
// because of adminService.getAdminByEmail
new UserRequest(user, request)
}
}
データベースのセットアップが含まれていないため、25 行目の実装例ではFuture が返されないため、次のエラーが発生します。
type mismatch;
found : scala.concurrent.Future[Option[models.Tables.Admin]]
required: Option[?]
私はscalaを初めて使用するため、この時点で Future を抽出する方法がわかりません。Option[Admin]
Future の結果を処理して?を返すようにする方法