/read-frontend/src/main/scala/ru/pavkin/ihavemoney/readfront/ReadFrontend.scala

https://github.com/vpavkin/i-have-money · Scala · 66 lines · 57 code · 9 blank · 0 comment · 0 complexity · e9a450899bf61c418d8e56175265a4a9 MD5 · raw file

  1. package ru.pavkin.ihavemoney.readfront
  2. import java.util.UUID
  3. import akka.actor.ActorSystem
  4. import akka.event.Logging
  5. import akka.http.scaladsl.Http
  6. import akka.http.scaladsl.model._
  7. import akka.http.scaladsl.server.Directives._
  8. import akka.pattern.AskTimeoutException
  9. import akka.stream.ActorMaterializer
  10. import akka.util.Timeout
  11. import com.typesafe.config.ConfigFactory
  12. import de.heikoseeberger.akkahttpcirce.CirceSupport
  13. import akka.http.scaladsl.model.StatusCodes._
  14. import scala.concurrent.duration._
  15. import ru.pavkin.ihavemoney.domain.fortune.FortuneId
  16. import ru.pavkin.ihavemoney.domain.query.{MoneyBalance, QueryFailed, QueryId}
  17. import ru.pavkin.ihavemoney.protocol.readfront._
  18. object ReadFrontend extends App with CirceSupport {
  19. implicit val system = ActorSystem("IHaveMoneyReadFront")
  20. implicit val executor = system.dispatcher
  21. implicit val materializer = ActorMaterializer()
  22. implicit val timeout: Timeout = Timeout(30.seconds)
  23. val config = ConfigFactory.load()
  24. val logger = Logging(system, getClass)
  25. val readBack = new ReadBackClient(system, config.getString("read-backend.interface"))
  26. val writeFrontURL = s"http://${config.getString("write-frontend.host")}:${config.getString("write-frontend.port")}"
  27. val routes = {
  28. logRequestResult("i-have-money-read-frontend") {
  29. path("write_front_url") {
  30. get {
  31. complete {
  32. HttpResponse(entity = HttpEntity(ContentType(MediaTypes.`text/plain`, HttpCharsets.`UTF-8`), writeFrontURL))
  33. }
  34. }
  35. } ~
  36. pathPrefix("balance" / Segment) { fortuneId
  37. get {
  38. complete {
  39. val queryId = QueryId(UUID.randomUUID.toString)
  40. readBack.query(MoneyBalance(queryId, FortuneId(fortuneId)))
  41. .recover {
  42. case timeout: AskTimeoutException
  43. RequestTimeout QueryFailed(queryId, s"Query $queryId timed out")
  44. }
  45. .map(kv kv._1 conversions.toFrontendFormat(kv._2))
  46. }
  47. }
  48. } ~
  49. get {
  50. pathSingleSlash {
  51. getFromResource("index.html")
  52. }
  53. }
  54. } ~ getFromResourceDirectory("")
  55. }
  56. Http().bindAndHandle(routes, config.getString("app.host"), config.getInt("app.http-port"))
  57. }