USDAController.scala 3.0 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.models._
  7. import gov.usda.nal.fdc.models.FoodsCriteria.Format
  8. import scala.util.{Success,Failure}
  9. import com.tflucke.webroutes.HTTPException
  10. import gov.usda.nal.fdc.{controllers => fdcControllers}
  11. import org.mongodb.scala.model.Filters._
  12. import com.weEat.services.MongoDBService
  13. @Singleton
  14. class USDAController @Inject()(
  15. val controllerComponents: ControllerComponents,
  16. config: Configuration,
  17. db: MongoDBService
  18. ) extends BaseController {
  19. import db.withCollection
  20. implicit val ec = scala.concurrent.ExecutionContext.global
  21. val fdc = new fdcControllers.FoodController(config.get[String]("fdc.apikey"))
  22. def getFood(id: Long, fmt: String = "Full") = Action.async
  23. { implicit request: Request[Any] =>
  24. fdc.getFood(id, Format.withName(fmt))().map(x => Ok(Json.toJson[FoodItem](x)))
  25. }
  26. def getFoods(ids: String, fmt: String = "Full") = Action.async
  27. { implicit request: Request[Any] =>
  28. fdc.getFoods(ids.split(",").toSeq, Format.withName(fmt))().map(x =>
  29. Ok(Json.toJson(x))
  30. )
  31. }
  32. def getFoodsSearch(
  33. query: String,
  34. dataType: Seq[String] = Nil,
  35. pageSize: Option[Short] = None,
  36. pageNumber: Option[Long] = None,
  37. sortBy: Option[String] = None,
  38. sortOrder: Option[String] = None
  39. ) = Action.async { implicit request: Request[Any] =>
  40. fdc.getFoodsSearch(
  41. query,
  42. dataType.map(dt => DataType.withName(dt)),
  43. pageSize,
  44. pageNumber,
  45. sortBy.map(x => SortCriteria.withName(x)),
  46. sortOrder.map(x => SortOrder.withName(x.toLowerCase))
  47. )().transform({
  48. case Success(x) =>
  49. Success(Ok(Json.toJson(x)))
  50. case Failure(x: HTTPException) =>
  51. Success((new Status(x.statusCode))(x.responseText))
  52. case Failure(x) =>
  53. Success(InternalServerError(x.toString))
  54. })
  55. }
  56. def postFoodsSearch() = Action.async(parse.json) {
  57. implicit request: Request[JsValue] =>
  58. fdc.postFoodsSearch()(request.body.as[FoodSearchCriteria]).transform({
  59. case Success(x) =>
  60. Success(Ok(Json.toJson(x)))
  61. case Failure(x: HTTPException) =>
  62. Success((new Status(x.statusCode))(x.responseText))
  63. case Failure(x) =>
  64. 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. }