| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- package com.weEat.controllers
- import javax.inject.{Inject,Singleton}
- import play.api._
- import play.api.mvc._
- import play.api.libs.json._
- import gov.usda.nal.fdc.models._
- import gov.usda.nal.fdc.models.FoodsCriteria.Format
- import scala.util.{Success,Failure}
- import com.tflucke.webroutes.HTTPException
- import gov.usda.nal.fdc.{controllers => fdcControllers}
- import org.mongodb.scala.model.Filters._
- import com.weEat.services.MongoDBService
- @Singleton
- class USDAController @Inject()(
- val controllerComponents: ControllerComponents,
- config: Configuration,
- db: MongoDBService
- ) extends BaseController {
- import db.withCollection
- implicit val ec = scala.concurrent.ExecutionContext.global
- val fdc = new fdcControllers.FoodController(config.get[String]("fdc.apikey"))
- def getFood(id: Long, fmt: String = "Full") = Action.async
- { implicit request: Request[Any] =>
- fdc.getFood(id, Format.withName(fmt))().map(x => Ok(Json.toJson[FoodItem](x)))
- }
- def getFoods(ids: String, fmt: String = "Full") = Action.async
- { implicit request: Request[Any] =>
- fdc.getFoods(ids.split(",").toSeq, Format.withName(fmt))().map(x =>
- Ok(Json.toJson(x))
- )
- }
- def getFoodsSearch(
- query: String,
- dataType: Seq[String] = Nil,
- pageSize: Option[Short] = None,
- pageNumber: Option[Long] = None,
- sortBy: Option[String] = None,
- sortOrder: Option[String] = None
- ) = Action.async { implicit request: Request[Any] =>
- fdc.getFoodsSearch(
- query,
- dataType.map(dt => DataType.withName(dt)),
- pageSize,
- pageNumber,
- sortBy.map(x => SortCriteria.withName(x)),
- sortOrder.map(x => SortOrder.withName(x.toLowerCase))
- )().transform({
- case Success(x) =>
- Success(Ok(Json.toJson(x)))
- case Failure(x: HTTPException) =>
- Success((new Status(x.statusCode))(x.responseText))
- case Failure(x) =>
- Success(InternalServerError(x.toString))
- })
- }
- def postFoodsSearch() = Action.async(parse.json) {
- implicit request: Request[JsValue] =>
- fdc.postFoodsSearch()(request.body.as[FoodSearchCriteria]).transform({
- case Success(x) =>
- Success(Ok(Json.toJson(x)))
- case Failure(x: HTTPException) =>
- Success((new Status(x.statusCode))(x.responseText))
- case Failure(x) =>
- Success(InternalServerError(x.toString))
- })
- }
- def getNutrients() = Action.async { implicit request: Request[Any] =>
- withCollection(com.weEat.models.Nutrient) { collection =>
- collection.find()
- .toFuture()
- .transform({
- case Success(x) => Success(Ok(Json.toJson(x)))
- case Failure(x) => throw x
- })
- }.flatten
- }
- def getNutrient(id: Int) = Action.async { implicit request: Request[Any] =>
- withCollection(com.weEat.models.Nutrient) { collection =>
- collection.find(equal("number", id))
- .toFuture()
- .transform({
- case Success(x) => Success(Ok(Json.toJson(x)))
- case Failure(x) => throw x
- })
- }.flatten
- }
- }
|