USDAController.scala 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package com.weEat.controllers
  2. import javax.inject.{Inject,Singleton}
  3. import play.api._
  4. import play.api.mvc._
  5. import play.api.libs.json._
  6. import gov.usda.nal.fdc.{controllers => fdc}
  7. import gov.usda.nal.fdc.models._
  8. import gov.usda.nal.fdc.models.FoodsCriteria.Format
  9. import gov.usda.nal.fdc.models.DataType.DataType
  10. import gov.usda.nal.fdc.models.SortCriteria.SortCriteria
  11. import gov.usda.nal.fdc.models.SortOrder.SortOrder
  12. import scala.util.{Try,Success,Failure}
  13. import com.tflucke.webroutes.HTTPException
  14. import com.weEat.shared.util.TryWith
  15. import scala.concurrent.{ExecutionContext,Future,blocking}
  16. import gov.usda.nal.fdc.{controllers => fdcControllers}
  17. import org.mongodb.scala.model.Filters._
  18. import com.weEat.services.MongoDBService
  19. @Singleton
  20. class USDAController @Inject()(
  21. val controllerComponents: ControllerComponents,
  22. config: Configuration,
  23. db: MongoDBService
  24. ) extends BaseController {
  25. import db.withCollection
  26. implicit val ec = scala.concurrent.ExecutionContext.global
  27. val fdc = new fdcControllers.FoodController(config.get[String]("fdc.apikey"))
  28. def getFood(id: Long, fmt: String = "Full") = Action.async
  29. { implicit request: Request[Any] =>
  30. fdc.getFood(id, Format.withName(fmt))().map(x => Ok(Json.toJson[FoodItem](x)))
  31. }
  32. def getFoods(ids: String, fmt: String = "Full") = Action.async
  33. { implicit request: Request[Any] =>
  34. fdc.getFoods(ids.split(",").toSeq, Format.withName(fmt))().map(x =>
  35. Ok(Json.toJson(x))
  36. )
  37. }
  38. def getFoodsSearch(
  39. query: String,
  40. dataType: Seq[String] = Nil,
  41. pageSize: Option[Short] = None,
  42. pageNumber: Option[Long] = None,
  43. sortBy: Option[String] = None,
  44. sortOrder: Option[String] = None
  45. ) = Action.async { implicit request: Request[Any] =>
  46. fdc.getFoodsSearch(
  47. query,
  48. dataType.map(dt => DataType.withName(dt)),
  49. pageSize,
  50. pageNumber,
  51. sortBy.map(x => SortCriteria.withName(x)),
  52. sortOrder.map(x => SortOrder.withName(x.toLowerCase))
  53. )().transform({
  54. case Success(x) =>
  55. Success(Ok(Json.toJson(x)))
  56. case Failure(x: HTTPException) =>
  57. Success((new Status(x.statusCode))(x.responseText))
  58. case Failure(x) =>
  59. Success(InternalServerError(x.toString))
  60. })
  61. }
  62. def postFoodsSearch() = Action.async(parse.json) {
  63. implicit request: Request[JsValue] =>
  64. fdc.postFoodsSearch()(request.body.as[FoodSearchCriteria]).transform({
  65. case Success(x) =>
  66. Success(Ok(Json.toJson(x)))
  67. case Failure(x: HTTPException) =>
  68. Success((new Status(x.statusCode))(x.responseText))
  69. case Failure(x) =>
  70. Success(InternalServerError(x.toString))
  71. })
  72. }
  73. def getNutrients() = Action.async { implicit request: Request[Any] =>
  74. withCollection(com.weEat.models.Nutrient) { collection =>
  75. collection.find()
  76. .toFuture()
  77. .transform({
  78. case Success(x) => Success(Ok(Json.toJson(x)))
  79. case Failure(x) => throw x
  80. })
  81. }.flatten
  82. }
  83. def getNutrient(id: Int) = Action.async { implicit request: Request[Any] =>
  84. withCollection(com.weEat.models.Nutrient) { collection =>
  85. collection.find(equal("number", id))
  86. .toFuture()
  87. .transform({
  88. case Success(x) => Success(Ok(Json.toJson(x)))
  89. case Failure(x) => throw x
  90. })
  91. }.flatten
  92. }
  93. }