Newer
Older
import repositories.DailyRepository
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{Future, Await}
import scala.concurrent.duration._
import org.bson.types.ObjectId
import java.util.Date
import java.time.Instant
import java.text.SimpleDateFormat
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,
object Daily {
val dailyRepo = new DailyRepository()
id: Option[ObjectId],
userId: ObjectId,
questionId: ObjectId,
content: String,
likes: Int = 0,
timeout: Int = 4
): Daily = {
val now: Date = Date.from(Instant.now())
val daily: Daily = Daily(None, userId, questionId, content, likes, now)
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 dateFormat: SimpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
val formattedDate: String = dateFormat.format(daily.createdAt);
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),
"createdAt" -> JsString(formattedDate)
)
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})"