Skip to content
Snippets Groups Projects
Commit 0f81aa97 authored by Felipe D'Abrantes's avatar Felipe D'Abrantes
Browse files

Hide feed content if user has not posted yet (#31)

parent f351ef93
No related branches found
No related tags found
1 merge request!19Fix feed endpoint issues
......@@ -66,8 +66,8 @@ class DailyController @Inject()(val controllerComponents: ControllerComponents,
try {
if (!ObjectId.isValid(userId)) throw new InvalidRequestBodyException("Invalid query parameter ID format: userId")
val result: Seq[Daily] = Daily.getUserFeedAsync(new ObjectId(userId), new ObjectId(questionId), request.jwt)
val jsonResult: JsValue = Daily.toJson(result)
val (feed, hasPosted): (Seq[Daily], Boolean) = Daily.getUserFeedAsync(new ObjectId(userId), new ObjectId(questionId), request.jwt)
val jsonResult: JsValue = Daily.feedToJson(feed, hasPosted)
Ok(jsonResult)
} catch {
case _: TimeoutException => BadRequest("Request timed out")
......
......@@ -12,7 +12,7 @@ import java.util.Date
import java.time.Instant
import java.text.SimpleDateFormat
import play.api.libs.json.{Json, JsValue, JsString, JsObject, JsArray}
import play.api.libs.json.{Json, JsValue, JsString, JsObject, JsArray, JsBoolean}
import org.bson.{BsonWriter, BsonReader, BsonType}
import org.bson.codecs.{Codec, EncoderContext, DecoderContext}
......@@ -54,20 +54,33 @@ object Daily {
Await.result[Seq[Daily]](future, timeout.seconds)
}
def getUserFeedAsync(userId: ObjectId, questionId: ObjectId, jwt: String, timeout: Int = 4): Seq[Daily] = {
// Sequentially waits for Future objects to complete before calling next method
val result: Future[Seq[Daily]] = for {
def getUserFeedAsync(userId: ObjectId, questionId: ObjectId, jwt: String, timeout: Int = 4): (Seq[Daily], Boolean) = {
val result = for {
friends: Seq[ObjectId] <- User.getUserFriends(userId, jwt)
hasPosted: Boolean <- hasUserPosted(userId, questionId)
feed: Seq[Daily] <- {
val friendsFilter: Bson = Filters.in("user_id", friends: _*)
val questionFilter: Bson = Filters.eq("question_id", questionId)
val filters: Bson = Filters.and(friendsFilter, questionFilter)
dailyRepo.getAll(Some(filters), None, None, None)
val futureFeed: Future[Seq[Daily]] = dailyRepo.getAll(Some(filters), None, None, None)
if (!hasPosted)
futureFeed.map(_.map(_.copy(content = "")))
else
futureFeed
}
} yield feed
} yield (feed: Seq[Daily], hasPosted: Boolean)
Await.result(result, timeout.seconds)
}
Await.result[Seq[Daily]](result, timeout.seconds)
def hasUserPosted(userId: ObjectId, questionId: ObjectId): Future[Boolean] = {
val userFilter: Bson = Filters.eq("user_id", userId)
val questionFilter: Bson = Filters.eq("question_id", questionId)
val filters: Bson = Filters.and(userFilter, questionFilter)
dailyRepo.getFirst(Some(filters), None, None).map(_.isDefined)
}
def likeAsync(dailyId: ObjectId, likerId: ObjectId, jwt: String, timeout: Int = 4): Unit = {
......@@ -156,6 +169,12 @@ object Daily {
Json.toJson[JsArray](JsArray(dailiesJson))
}
// Convert from feed set to JSON (serializing to JSON)
def feedToJson(dailies: Seq[Daily], userHasPosted: Boolean): JsValue = {
val jsonDailies: JsValue = toJson(dailies)
Json.toJson[JsObject](JsObject(Seq("userHasPosted" -> JsBoolean(userHasPosted), "feed" -> jsonDailies)))
}
def toString(daily: Daily): String =
return s"Daily(${daily.id.toString()}, ${daily.userId.toString()}, ${daily.questionId.toString()}, ${daily.content}, ${daily.usersLiked.toString()})"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment