USDAController.scala 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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) => Success(Ok(Json.toJson(x)))
  55. case Failure(x: HTTPException) => Success((new Status(x.statusCode))(x.responseText))
  56. case Failure(x) => Success(InternalServerError(x.toString))
  57. })
  58. }
  59. def postFoodsSearch() = Action.async(parse.json) {
  60. implicit request: Request[JsValue] =>
  61. fdc.postFoodsSearch()(request.body.as[FoodSearchCriteria]).transform({
  62. case Success(x) => Success(Ok(Json.toJson(x)))
  63. case Failure(x: HTTPException) => Success((new Status(x.statusCode))(x.responseText))
  64. case Failure(x) => Success(InternalServerError(x.toString))
  65. })
  66. }
  67. def getNutrients() = Action.async { implicit request: Request[Any] =>
  68. withCollection(com.weEat.models.Nutrient) { collection =>
  69. collection.find()
  70. .toFuture()
  71. .transform({
  72. case Success(x) => Success(Ok(Json.toJson(x)))
  73. case Failure(x) => throw x
  74. })
  75. }.flatten
  76. }
  77. def getNutrient(id: Int) = Action.async { implicit request: Request[Any] =>
  78. withCollection(com.weEat.models.Nutrient) { collection =>
  79. collection.find(equal("number", id))
  80. .toFuture()
  81. .transform({
  82. case Success(x) => Success(Ok(Json.toJson(x)))
  83. case Failure(x) => throw x
  84. })
  85. }.flatten
  86. }
  87. }