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))) } }