Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.12 KB | None | 0 0
  1. val routes: Route = pathPrefix("access-tokens") {
  2. pathPrefix(Segment) { userId =>
  3. parameters('refreshToken) { refreshToken =>
  4. onSuccess(accessTokenActor ? GetAccessToken(userId, refreshToken)) {
  5. case token: AccessToken => complete(ok(token.toJson))
  6. case AccessTokenError => complete(internalServerError("There was problems while retriving the access token"))
  7. }
  8. }
  9. }
  10. }
  11.  
  12. class AccessTokenActor extends Actor with ActorLogging with APIConfig {
  13.  
  14. implicit val actorSystem = context.system
  15. import context.dispatcher
  16. implicit val materializer = ActorMaterializer()
  17.  
  18. import AccessTokenActor._
  19.  
  20. val connectionFlow = Http().cachedHostConnectionPoolHttps[String]("www.service.token.provider.com")
  21.  
  22. override def receive: Receive = {
  23. case get: GetAccessToken => {
  24. val senderActor = sender()
  25. Source.fromFuture(Future.successful(
  26. HttpRequest(
  27. HttpMethods.GET,
  28. "/oauth2/token",
  29. Nil,
  30. FormData(Map(
  31. "clientId" -> youtubeClientId,"clientSecret" -> youtubeSecret,"refreshToken" -> get.refreshToken))
  32. .toEntity(HttpCharsets.`UTF-8`)) -> get.channelId
  33. )
  34. )
  35. .via(connectionFlow)
  36. .map {
  37. case (Success(resp), id) => resp.status match {
  38. case StatusCodes.OK => Unmarshal(resp.entity).to[AccessTokenModel]
  39. .map(senderActor ! AccessToken(_.access_token))
  40. case _ => senderActor ! AccessTokenError
  41. }
  42. case _ => senderActor ! AccessTokenError
  43. }
  44. }.runWith(Sink.head)
  45. case _ => log.info("Unknown message")
  46. }
  47.  
  48. }
  49.  
  50. sealed trait TokenResponse
  51. case class AccessToken() extends TokenResponse {...}
  52. case object AccessTokenError extends TokenResponse
  53.  
  54. val queryActorForToken : (ActorRef) => (GetAccessToken) => Future[TokenResponse] =
  55. (ref) => (getAccessToken) => (ref ? getAccessToken).mapTo[TokenResponse]
  56.  
  57. val actorRef : ActorRef = ??? //not shown in question
  58.  
  59. type TokenQuery = GetAccessToken => Future[TokenResponse]
  60.  
  61. val actorTokenQuery : TokenQuery = queryActorForToken(actorRef)
  62.  
  63. val errorMsg = "There was problems while retriving the access token"
  64.  
  65. def createRoute(getToken : TokenQuery = actorTokenQuery) : Route =
  66. pathPrefix("access-tokens") {
  67. pathPrefix(Segment) { userId =>
  68. parameters('refreshToken) { refreshToken =>
  69. onSuccess(getToken(GetAccessToken(userId, refreshToken))) {
  70. case token: AccessToken => complete(ok(token.toJson))
  71. case AccessTokenError => complete(internalServerError(errorMsg))
  72. }
  73. }
  74. }
  75. }
  76.  
  77. //original routes
  78. val routes = createRoute()
  79.  
  80. val testToken : AccessToken = ???
  81.  
  82. val alwaysSuccceedsRoute = createRoute(_ => Success(testToken))
  83.  
  84. Get("/access-tokens/fooUser?refreshToken=bar" ~> alwaysSucceedsRoute ~> check {
  85. status shouldEqual StatusCodes.Ok
  86. responseAs[String] shouldEqual testToken.toJson
  87. }
  88.  
  89. val alwaysFailsRoute = createRoute(_ => Success(AccessTokenError))
  90.  
  91. Get("/access-tokens/fooUser?refreshToken=bar" ~> alwaysFailsRoute ~> check {
  92. status shouldEqual StatusCodes.InternalServerError
  93. responseAs[String] shouldEqual errorMsg
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement