2014-03-02 53 views
1

我正試圖學習在Scala的Play框架中使用Action組合。[Play] [Scala]我可以獲取多個鏈接的動作的內容嗎?

我知道做基本動作組合和WrappedRequests的能力,但是我的問題是:是否可以在組合動作中訪問多個WrappedRequest的內容?

讓我解釋一下,我有以下代碼:

class RequestWithUser[A](val user: models.User, request: Request[A]) extends WrappedRequest[A](request) 
    def UserAction(userId: Long) = new ActionBuilder[RequestWithUser] { 
     def invokeBlock[A](request: Request[A], block: (RequestWithUser[A]) => Future[SimpleResult]) = { 
     models.UsersDAO.findById(userId).map { user => 
      block(new RequestWithUser(user, request)) 
     } getOrElse { 
      Future.successful(NotFound) 
     } 
     } 
    } 

case class AuthenticatedRequest[A](user: models.User, request: Request[A]) extends WrappedRequest[A](request) 

object Authorized extends ActionBuilder[AuthenticatedRequest] { 
    def invokeBlock[A](request: Request[A], block: (AuthenticatedRequest[A]) => Future[SimpleResult]) = { 
     userTokenForm.bindFromRequest()(request).fold(
       formWithErrors => { 
        resolve(Results.Unauthorized(formWithErrors.errorsAsJson)) 
       }, 
       userData => { 
        models.UsersDAO.findByToken(userData.token) map { user=> 
         block(AuthenticatedRequest(user, request)) 
        } getOrElse { 
         resolve(Results.Unauthorized("Token matched no one.")) 
        } 
       } 
       ) 
    } 
} 

我希望能夠將它們組合成第三個動作可能叫用來構成授權和UserAction「UserPermissionAction」。 它應檢查授權用戶是否與RequestWithUser中的用戶相同(即僅允許用戶編輯自己)。

這可能嗎?

回答

0

這是我最終做的。 它的作品,但我希望看到反饋,如果有更多的慣用斯卡拉方式:

 /** Contains the security token, extracted from the RequestHeader */ 
    case class AuthenticatedRequest[A](user: models.User, request: Request[A]) extends WrappedRequest[A](request) 

    case class AuthorizedAction[A](action: Action[A]) extends Action[A] { 
     lazy val parser = action.parser 
     def apply(request: Request[A]): Future[SimpleResult] = { 
     userTokenForm.bindFromRequest()(request).fold(
       formWithErrors => { 
        resolve(Results.Unauthorized(formWithErrors.errorsAsJson)) 
       }, 
       userData => { 
        models.UsersDAO.findByToken(userData.token) map { user=> 
         action(AuthenticatedRequest(user, request)) 
        } getOrElse { 
         resolve(Results.Unauthorized("Token matched no one.")) 
        } 
       } 
       ) 
     } 
    } 


    class RequestWithUser[A](val user: models.User, request: Request[A]) extends WrappedRequest[A](request) 

    case class UserAction[A](userId: Long, action: Action[A]) extends Action[A] { 
     lazy val parser = action.parser 
     def apply(request: Request[A]): Future[SimpleResult] = { 
     models.UsersDAO.findById(userId).map { user => 
      action(new RequestWithUser(user, request)) 
     } getOrElse { 
      Future.successful(NotFound) 
     } 
     } 
    } 

    def UserHasPermission[A](userId: Long) = new ActionBuilder[AuthenticatedRequest] { 
     def invokeBlock[A](request: Request[A], block: (AuthenticatedRequest[A]) => Future[SimpleResult]) = { 
     request match { 
      case req: AuthenticatedRequest[A] => { 
      { 
      for (
       authUserId <- req.user.id 
       if authUserId == userId 
       ) yield block(req) 
      } getOrElse Future.successful(Unauthorized) 
      } 
      case _ => Future.successful(BadRequest) 
     } 
     } 
     override def composeAction[A](action: Action[A]) = UserAction(userId, AuthorizedAction(action)) 
    } 
相關問題