simplify round user JSON

This commit is contained in:
Thibault Duplessis 2016-02-11 08:08:22 +07:00
parent 3f86f8bc7c
commit 9c28d08101
6 changed files with 25 additions and 29 deletions

View file

@ -43,7 +43,7 @@ object Account extends LilaController {
Ok {
import play.api.libs.json._
import lila.pref.JsonView._
Env.user.jsonView(me, extended = true) ++ Json.obj(
Env.user.jsonView(me) ++ Json.obj(
"prefs" -> prefs,
"nowPlaying" -> JsArray(povs take 20 map Env.api.lobbyApi.nowPlaying))
}

View file

@ -21,7 +21,7 @@ object Auth extends LilaController {
private def mobileUserOk(u: UserModel): Fu[Result] =
lila.game.GameRepo urgentGames u map { povs =>
Ok {
Env.user.jsonView(u, extended = true) ++ Json.obj(
Env.user.jsonView(u) ++ Json.obj(
"nowPlaying" -> JsArray(povs take 20 map Env.api.lobbyApi.nowPlaying))
}
}

View file

@ -64,7 +64,7 @@ object User extends LilaController {
negotiate(
html = env.cached topOnline max map { html.user.online(_, max) },
api = _ => env.cached topOnline getInt("nb").fold(10)(_ min max) map { list =>
Ok(Json.toJson(list.map(env.jsonView(_, true))))
Ok(Json.toJson(list.map(env.jsonView(_))))
}
)
}

View file

@ -34,7 +34,7 @@ private[api] final class UserApi(
Json.obj(
"list" -> JsArray(
users map { u =>
jsonView(u, extended = team.isDefined) ++
jsonView(u) ++
Json.obj("url" -> makeUrl(s"@/${u.username}"))
}
)
@ -51,7 +51,7 @@ private[api] final class UserApi(
ctx.userId.?? { relationApi.fetchRelation(_, u.id) } zip
ctx.userId.?? { relationApi.fetchFollows(u.id, _) } map {
case ((((((gameOption, nbGamesWithMe), following), followers), followable), relation), isFollowed) =>
jsonView(u, extended = true) ++ {
jsonView(u) ++ {
Json.obj(
"url" -> makeUrl(s"@/$username"),
"playing" -> gameOption.map(g => makeUrl(s"${g.gameId}/${g.color.name}")),

View file

@ -53,7 +53,7 @@ final class JsonView(
"color" -> player.color.name,
"version" -> socket.version,
"spectator" -> false,
"user" -> playerUser.map { userJsonView(_, true) },
"user" -> playerUser.map { userJsonView(_, game.perfType) },
"rating" -> player.rating,
"ratingDiff" -> player.ratingDiff,
"provisional" -> player.provisional.option(true),
@ -68,7 +68,7 @@ final class JsonView(
"opponent" -> Json.obj(
"color" -> opponent.color.name,
"ai" -> opponent.aiLevel,
"user" -> opponentUser.map { userJsonView(_, true) },
"user" -> opponentUser.map { userJsonView(_, game.perfType) },
"rating" -> opponent.rating,
"ratingDiff" -> opponent.ratingDiff,
"provisional" -> opponent.provisional.option(true),
@ -154,7 +154,7 @@ final class JsonView(
"version" -> socket.version,
"spectator" -> true,
"ai" -> player.aiLevel,
"user" -> playerUser.map { userJsonView(_, true) },
"user" -> playerUser.map { userJsonView(_, game.perfType) },
"name" -> player.name,
"rating" -> player.rating,
"ratingDiff" -> player.ratingDiff,
@ -168,7 +168,7 @@ final class JsonView(
"opponent" -> Json.obj(
"color" -> opponent.color.name,
"ai" -> opponent.aiLevel,
"user" -> opponentUser.map { userJsonView(_, true) },
"user" -> opponentUser.map { userJsonView(_, game.perfType) },
"name" -> opponent.name,
"rating" -> opponent.rating,
"ratingDiff" -> opponent.ratingDiff,

View file

@ -1,7 +1,7 @@
package lila.user
import lila.common.PimpedJson._
import lila.rating.{ Perf, Glicko }
import lila.rating.{ Perf, Glicko, PerfType }
import play.api.libs.json._
import User.PlayTime
@ -14,27 +14,23 @@ final class JsonView(isOnline: String => Boolean) {
"rd" -> o.glicko.deviation.toInt,
"prog" -> o.progress)
}
private implicit val perfsWrites: Writes[Perfs] = Writes { o =>
JsObject(o.perfsMap.toList map {
case (name, perf) => name -> perfWrites.writes(perf)
})
}
private implicit val profileWrites = Json.writes[Profile]
private implicit val playTimeWrites = Json.writes[PlayTime]
def apply(u: User, extended: Boolean) = Json.obj(
def apply(u: User, onlyPerf: Option[PerfType] = None) = Json.obj(
"id" -> u.id,
"username" -> u.username
) ++ extended.??(Json.obj(
"title" -> u.title,
"online" -> isOnline(u.id),
"engine" -> u.engine,
"booster" -> u.booster,
"language" -> u.lang,
"profile" -> u.profile.??(profileWrites.writes).noNull,
"perfs" -> u.perfs,
"createdAt" -> u.createdAt,
"seenAt" -> u.seenAt,
"playTime" -> u.playTime
)).noNull
"username" -> u.username,
"title" -> u.title,
"online" -> isOnline(u.id),
"engine" -> u.engine,
"booster" -> u.booster,
"language" -> u.lang,
"profile" -> u.profile.??(profileWrites.writes).noNull,
"perfs" -> JsObject(u.perfs.perfsMap collect {
case (key, perf) if onlyPerf.fold(true)(_.key == key) => key -> perfWrites.writes(perf)
}),
"createdAt" -> u.createdAt,
"seenAt" -> u.seenAt,
"playTime" -> u.playTime
).noNull
}