Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- val routes: Route = pathPrefix("access-tokens") {
- pathPrefix(Segment) { userId =>
- parameters('refreshToken) { refreshToken =>
- onSuccess(accessTokenActor ? GetAccessToken(userId, refreshToken)) {
- case token: AccessToken => complete(ok(token.toJson))
- case AccessTokenError => complete(internalServerError("There was problems while retriving the access token"))
- }
- }
- }
- }
- class AccessTokenActor extends Actor with ActorLogging with APIConfig {
- implicit val actorSystem = context.system
- import context.dispatcher
- implicit val materializer = ActorMaterializer()
- import AccessTokenActor._
- val connectionFlow = Http().cachedHostConnectionPoolHttps[String]("www.service.token.provider.com")
- override def receive: Receive = {
- case get: GetAccessToken => {
- val senderActor = sender()
- Source.fromFuture(Future.successful(
- HttpRequest(
- HttpMethods.GET,
- "/oauth2/token",
- Nil,
- FormData(Map(
- "clientId" -> youtubeClientId,"clientSecret" -> youtubeSecret,"refreshToken" -> get.refreshToken))
- .toEntity(HttpCharsets.`UTF-8`)) -> get.channelId
- )
- )
- .via(connectionFlow)
- .map {
- case (Success(resp), id) => resp.status match {
- case StatusCodes.OK => Unmarshal(resp.entity).to[AccessTokenModel]
- .map(senderActor ! AccessToken(_.access_token))
- case _ => senderActor ! AccessTokenError
- }
- case _ => senderActor ! AccessTokenError
- }
- }.runWith(Sink.head)
- case _ => log.info("Unknown message")
- }
- }
- sealed trait TokenResponse
- case class AccessToken() extends TokenResponse {...}
- case object AccessTokenError extends TokenResponse
- val queryActorForToken : (ActorRef) => (GetAccessToken) => Future[TokenResponse] =
- (ref) => (getAccessToken) => (ref ? getAccessToken).mapTo[TokenResponse]
- val actorRef : ActorRef = ??? //not shown in question
- type TokenQuery = GetAccessToken => Future[TokenResponse]
- val actorTokenQuery : TokenQuery = queryActorForToken(actorRef)
- val errorMsg = "There was problems while retriving the access token"
- def createRoute(getToken : TokenQuery = actorTokenQuery) : Route =
- pathPrefix("access-tokens") {
- pathPrefix(Segment) { userId =>
- parameters('refreshToken) { refreshToken =>
- onSuccess(getToken(GetAccessToken(userId, refreshToken))) {
- case token: AccessToken => complete(ok(token.toJson))
- case AccessTokenError => complete(internalServerError(errorMsg))
- }
- }
- }
- }
- //original routes
- val routes = createRoute()
- val testToken : AccessToken = ???
- val alwaysSuccceedsRoute = createRoute(_ => Success(testToken))
- Get("/access-tokens/fooUser?refreshToken=bar" ~> alwaysSucceedsRoute ~> check {
- status shouldEqual StatusCodes.Ok
- responseAs[String] shouldEqual testToken.toJson
- }
- val alwaysFailsRoute = createRoute(_ => Success(AccessTokenError))
- Get("/access-tokens/fooUser?refreshToken=bar" ~> alwaysFailsRoute ~> check {
- status shouldEqual StatusCodes.InternalServerError
- responseAs[String] shouldEqual errorMsg
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement