| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- package controllers
- import scala.concurrent.Await
- import scala.language.postfixOps
- import scala.concurrent.duration.{Duration,DurationInt}
- import javax.inject._
- import models.Food
- import org.bson.conversions.Bson
- import org.mongodb.scala.{MongoCollection, MongoDatabase, Observable, Completed}
- import org.mongodb.scala.model.Filters
- import org.mongodb.scala.result.UpdateResult
- import play.api.libs.json._
- import play.api.mvc._
- @Singleton
- class FoodController(collection: MongoCollection[Food], sync: Boolean = true) extends Controller {
- def this(db: MongoDatabase, sync: Boolean) {
- this(db.getCollection[Food]("Food"), sync)
- }
- def this() {
- this(MongoDB.con, false)
- }
- def put(): Action[JsValue] = Action(parse.json) { request: Request[JsValue] =>
- try {
- val food: Food = request.body.as[Food](Food.foodFormats)
- val query: Observable[Completed] = collection.insertOne(food)
- if (sync)
- {
- Await.result(query.toFuture, 5 minutes)
- }
- Ok(Json.toJson(food))
- }
- catch {
- case jsre: JsResultException => BadRequest(s"Could not parse json into Food.")
- }
- }
- def update(id: String): Action[JsValue] = Action(parse.json) { request: Request[JsValue] =>
- try {
- val filter: Bson = Filters.equal[String]("_id", id)
- val json: JsObject = request.body.asInstanceOf[JsObject]
- val queryResult: Observable[Food] = collection.find(filter)
- val food: JsValue = Json.toJson(Await.result(queryResult.toFuture, 5 minutes))
- .asInstanceOf[JsObject] ++ json
- val save: Observable[UpdateResult] = collection.replaceOne(filter, food.as[Food])
- if (sync)
- {
- Await.result(save.toFuture, 5 minutes)
- }
- Ok(food)
- }
- catch {
- case jsre: JsResultException => BadRequest(s"Could not parse json into Food.")
- }
- }
- def get(id: String): Action[JsValue] = Action(parse.json) { request: Request[JsValue] =>
- val filter: Bson = Filters.equal[String]("_id", id)
- val queryResult: Observable[Food] = collection.find(filter)
- Ok(Json.toJson(Await.result(queryResult.toFuture, 5 minutes)))
- }
- def query(query: String = ""): Action[JsValue] = Action(parse.json) { request: Request[JsValue] =>
- val filter: Bson = Filters.regex("name", s".*${query}.*")
- val queryResult: Observable[Food] = collection.find(filter)
- Ok(Json.toJson(Await.result(queryResult.toFuture, 5 minutes)))
- }
- def delete(id: String): Action[JsValue] = Action(parse.json) { request: Request[JsValue] =>
- val filter: Bson = Filters.equal[String]("_id", id)
- val queryResult: Observable[Food] = collection.findOneAndDelete(filter)
- Ok(Json.toJson(Await.result(queryResult.toFuture, 5 minutes)))
- }
- }
|