package models import repositories.DailyRepository import org.bson.types.ObjectId import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.{Future, Await} import scala.concurrent.duration._ import play.api.libs.json.Json import play.api.libs.json.{Json, JsValue, JsString, JsNumber, JsObject, JsArray} case class Daily( id: Option[ObjectId], userId: ObjectId, questionId: ObjectId, content: String, likes: Int ) object Daily { val dailyRepo = new DailyRepository() def createDailyAsync( id: Option[ObjectId], userId: ObjectId, questionId: ObjectId, content: String, likes: Int = 0, timeout: Int = 4 ): Daily = { val daily: Daily = Daily(None, userId, questionId, content, likes) val future: Future[Daily] = dailyRepo.insertDaily(daily) Await.result(future, timeout.seconds) } def getAllDailiesAsync(timeout: Int = 4): Seq[Daily] = { val future: Future[Seq[Daily]] = dailyRepo.getAllDailies() Await.result(future, timeout.seconds) } def getUserDailiesAsync(userId: ObjectId, timeout: Int = 4): Seq[Daily] = { val future: Future[Seq[Daily]] = dailyRepo.getUserDailies(userId) Await.result(future, timeout.seconds) } def getUserFeedAsync(userId: ObjectId, timeout: Int = 4): Seq[Daily] = { // Sequentially waits for Future objects to complete before calling next method val result: Future[Seq[Daily]] = for { friends: Seq[ObjectId] <- User.getUserFriends(userId) feed: Seq[Daily] <- dailyRepo.getUserDailies(friends) } yield feed Await.result(result, timeout.seconds) } // Convert from Daily object to JSON (serializing to JSON) def toJson(daily: Daily): JsValue = { val dailyJson = Seq( "id" -> JsString(daily.id.getOrElse("").toString()), "userId" -> JsString(daily.userId.toString()), "questionId" -> JsString(daily.questionId.toString()), "content" -> JsString(daily.content), "likes" -> JsNumber(daily.likes) ) Json.toJson(JsObject(dailyJson)) } // Convert from Daily set to JSON (serializing to JSON) def toJson(dailies: Seq[Daily]): JsValue = { val dailiesJson = dailies.map(daily => Daily.toJson(daily)) Json.toJson(JsArray(dailiesJson)) } def toString(daily: Daily): String = return s"Daily(${daily.id.toString()}, ${daily.userId.toString()}, ${daily.questionId.toString()}, ${daily.content}, ${daily.likes})" }