FoodController.scala 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package controllers
  2. import scala.concurrent.Await
  3. import scala.language.postfixOps
  4. import scala.concurrent.duration.{Duration,DurationInt}
  5. import javax.inject._
  6. import models.Food
  7. import org.bson.conversions.Bson
  8. import org.mongodb.scala.{MongoCollection, MongoDatabase, Observable, Completed}
  9. import org.mongodb.scala.model.Filters
  10. import org.mongodb.scala.result.UpdateResult
  11. import play.api.libs.json._
  12. import play.api.mvc._
  13. @Singleton
  14. class FoodController(collection: MongoCollection[Food], sync: Boolean = true) extends Controller {
  15. def this(db: MongoDatabase, sync: Boolean) {
  16. this(db.getCollection[Food]("Food"), sync)
  17. }
  18. def this() {
  19. this(MongoDB.con, false)
  20. }
  21. def put(): Action[JsValue] = Action(parse.json) { request: Request[JsValue] =>
  22. try {
  23. val food: Food = request.body.as[Food](Food.foodFormats)
  24. val query: Observable[Completed] = collection.insertOne(food)
  25. if (sync)
  26. {
  27. Await.result(query.toFuture, 5 minutes)
  28. }
  29. Ok(Json.toJson(food))
  30. }
  31. catch {
  32. case jsre: JsResultException => BadRequest(s"Could not parse json into Food.")
  33. }
  34. }
  35. def update(id: String): Action[JsValue] = Action(parse.json) { request: Request[JsValue] =>
  36. try {
  37. val filter: Bson = Filters.equal[String]("_id", id)
  38. val json: JsObject = request.body.asInstanceOf[JsObject]
  39. val queryResult: Observable[Food] = collection.find(filter)
  40. val food: JsValue = Json.toJson(Await.result(queryResult.toFuture, 5 minutes))
  41. .asInstanceOf[JsObject] ++ json
  42. val save: Observable[UpdateResult] = collection.replaceOne(filter, food.as[Food])
  43. if (sync)
  44. {
  45. Await.result(save.toFuture, 5 minutes)
  46. }
  47. Ok(food)
  48. }
  49. catch {
  50. case jsre: JsResultException => BadRequest(s"Could not parse json into Food.")
  51. }
  52. }
  53. def get(id: String): Action[JsValue] = Action(parse.json) { request: Request[JsValue] =>
  54. val filter: Bson = Filters.equal[String]("_id", id)
  55. val queryResult: Observable[Food] = collection.find(filter)
  56. Ok(Json.toJson(Await.result(queryResult.toFuture, 5 minutes)))
  57. }
  58. def query(query: String = ""): Action[JsValue] = Action(parse.json) { request: Request[JsValue] =>
  59. val filter: Bson = Filters.regex("name", s".*${query}.*")
  60. val queryResult: Observable[Food] = collection.find(filter)
  61. Ok(Json.toJson(Await.result(queryResult.toFuture, 5 minutes)))
  62. }
  63. def delete(id: String): Action[JsValue] = Action(parse.json) { request: Request[JsValue] =>
  64. val filter: Bson = Filters.equal[String]("_id", id)
  65. val queryResult: Observable[Food] = collection.findOneAndDelete(filter)
  66. Ok(Json.toJson(Await.result(queryResult.toFuture, 5 minutes)))
  67. }
  68. }