DatabaseRoutes.scala 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import com.fasterxml.jackson.databind.JsonNode
  2. import com.twitter.finagle.Service
  3. import com.twitter.finagle.http.Method.Get
  4. import com.twitter.finagle.http.{Request, Response}
  5. import com.twitter.finagle.mysql.Parameter.wrap
  6. import com.twitter.finagle.mysql.{Client, IntValue, Result, ResultSet}
  7. import com.twitter.util.Future.collect
  8. import io.fintrospect.formats.Jackson.JsonFormat.{array, number, obj}
  9. import io.fintrospect.formats.Jackson.ResponseBuilder._
  10. import io.fintrospect.parameters.{ParameterSpec, Query, StringValidations}
  11. import io.fintrospect.{RouteSpec, ServerRoutes}
  12. import scala.language.reflectiveCalls
  13. import scala.util.{Random, Try}
  14. object DatabaseRoutes {
  15. private val toJson: PartialFunction[Result, Option[JsonNode]] = {
  16. case rs: ResultSet => rs.rows.headOption
  17. .map(row => {
  18. val IntValue(id) = row("id").get
  19. val IntValue(random) = row("randomNumber").get
  20. obj("id" -> number(id), "randomNumber" -> number(random))
  21. })
  22. case _ => None
  23. }
  24. private def generateRandomNumber = Random.nextInt(9999) + 1
  25. def apply(database: Client) = {
  26. val getStatement = database.prepare("SELECT id, randomNumber FROM world WHERE id = ?")
  27. val updateStatement = database.prepare("UPDATE world SET randomNumber = ? WHERE id = ?")
  28. val queryRoute = RouteSpec().at(Get) / "db" bindTo Service.mk {
  29. _: Request => getStatement(generateRandomNumber)
  30. .map(toJson)
  31. .map(_.map(Ok(_)).getOrElse(NotFound("")).build())
  32. }
  33. val numberOfQueries = Query.optional(ParameterSpec.string(StringValidations.EmptyIsValid).map {
  34. i => Try(i.toInt).getOrElse(1).max(1).min(500)
  35. }, "queries")
  36. val multipleRoute = RouteSpec()
  37. .taking(numberOfQueries)
  38. .at(Get) / "queries" bindTo Service.mk {
  39. r: Request => {
  40. collect(1.to((numberOfQueries <-- r).getOrElse(1))
  41. .map(i => getStatement(generateRandomNumber).map(toJson)))
  42. .map(f => f.flatMap(_.toSeq))
  43. .flatMap(c => Ok(array(c)))
  44. }
  45. }
  46. val updateRoute = RouteSpec()
  47. .taking(numberOfQueries)
  48. .at(Get) / "updates" bindTo Service.mk {
  49. r: Request => {
  50. collect(1.to((numberOfQueries <-- r).getOrElse(1))
  51. .map(i => {
  52. val id = generateRandomNumber
  53. updateStatement(generateRandomNumber, id)
  54. .flatMap(_ => getStatement(id))
  55. .map(toJson)
  56. }))
  57. .map(f => f.flatMap(_.toSeq))
  58. .flatMap(c => Ok(array(c)))
  59. }
  60. }
  61. new ServerRoutes[Request, Response] {
  62. add(queryRoute)
  63. add(multipleRoute)
  64. add(updateRoute)
  65. }
  66. }
  67. }