swiss API fixes

pull/6604/head
Thibault Duplessis 2020-05-11 14:20:46 -06:00
parent ca53974b1d
commit e64679f420
4 changed files with 51 additions and 40 deletions

View File

@ -108,9 +108,7 @@ final class Swiss(
data =>
tourC.rateLimitCreation(me, false, req) {
JsonOk {
env.swiss.api.create(data, me, teamId) flatMap { swiss =>
env.swiss.json(swiss, me.some, true)
}
env.swiss.api.create(data, me, teamId) map env.swiss.json.api
}
}
)

View File

@ -104,10 +104,13 @@ final private class SwissFields(form: Form[_])(implicit ctx: Context) {
)
def rated =
form3.checkbox(
form("rated"),
trans.rated(),
help = raw("Games are rated<br>and impact players ratings").some
frag(
form3.checkbox(
form("rated"),
trans.rated(),
help = raw("Games are rated<br>and impact players ratings").some
),
st.input(tpe := "hidden", st.name := form("rated").name, value := "false") // hack allow disabling rated
)
def variant =
form3.group(form("variant"), trans.variant(), half = true)(

View File

@ -33,7 +33,7 @@ final class SwissForm {
.verifying("Invalid clock", _.estimateTotalSeconds > 0),
"startsAt" -> optional(inTheFuture(ISODateTimeOrTimestamp.isoDateTimeOrTimestamp)),
"variant" -> optional(nonEmptyText.verifying(v => Variant(v).isDefined)),
"rated" -> boolean,
"rated" -> optional(boolean),
"nbRounds" -> number(min = 3, max = 100),
"description" -> optional(nonEmptyText),
"hasChat" -> optional(boolean),
@ -47,7 +47,7 @@ final class SwissForm {
clock = ClockConfig(180, 0),
startsAt = Some(DateTime.now plusMinutes 10),
variant = Variant.default.key.some,
rated = true,
rated = true.some,
nbRounds = 8,
description = none,
hasChat = true.some,
@ -60,7 +60,7 @@ final class SwissForm {
clock = s.clock,
startsAt = s.startsAt.some,
variant = s.variant.key.some,
rated = s.settings.rated,
rated = s.settings.rated.some,
nbRounds = s.settings.nbRounds,
description = s.settings.description,
hasChat = s.settings.hasChat.some,
@ -92,7 +92,7 @@ object SwissForm {
clock: ClockConfig,
startsAt: Option[DateTime],
variant: Option[String],
rated: Boolean,
rated: Option[Boolean],
nbRounds: Int,
description: Option[String],
hasChat: Option[Boolean],

View File

@ -24,6 +24,11 @@ final class SwissJson(
import SwissJson._
import BsonHandlers._
def api(swiss: Swiss) =
swissJsonBase(swiss) ++ Json.obj(
"rated" -> swiss.settings.rated
)
def apply(
swiss: Swiss,
me: Option[User],
@ -39,23 +44,8 @@ final class SwissJson(
podium <- podiumJson(swiss)
boards <- boardApi.withGames(swiss.id)
stats <- statsApi(swiss)
} yield Json
} yield swissJsonBase(swiss) ++ Json
.obj(
"id" -> swiss.id.value,
"createdBy" -> swiss.createdBy,
"startsAt" -> formatDate(swiss.startsAt),
"name" -> swiss.name,
"clock" -> swiss.clock,
"variant" -> swiss.variant.key,
"round" -> swiss.round,
"nbRounds" -> swiss.actualNbRounds,
"nbPlayers" -> swiss.nbPlayers,
"nbOngoing" -> swiss.nbOngoing,
"status" -> {
if (swiss.isStarted) "started"
else if (swiss.isFinished) "finished"
else "created"
},
"canJoin" -> {
(swiss.isNotFinished && myInfo.exists(_.player.absent)) ||
(myInfo.isEmpty && swiss.isEnterable && isInTeam)
@ -63,19 +53,9 @@ final class SwissJson(
"standing" -> standing,
"boards" -> boards.map(boardJson)
)
.add("me" -> myInfo.map(myInfoJson))
.add("joinTeam" -> (!isInTeam).option(swiss.teamId))
.add("socketVersion" -> socketVersion.map(_.value))
.add("quote" -> swiss.isCreated.option(lila.quote.Quote.one(swiss.id.value)))
.add("nextRound" -> swiss.nextRoundAt.map { next =>
Json.obj(
"at" -> formatDate(next),
"in" -> (next.getSeconds - nowSeconds).toInt.atLeast(0)
)
})
.add("me" -> myInfo.map(myInfoJson))
.add("greatPlayer" -> GreatPlayer.wikiUrl(swiss.name).map { url =>
Json.obj("name" -> swiss.name, "url" -> url)
})
.add("playerInfo" -> playerInfo.map { playerJsonExt(swiss, _) })
.add("podium" -> podium)
.add("isRecentlyFinished" -> swiss.isRecentlyFinished)
@ -136,8 +116,6 @@ final class SwissJson(
}
}
private def formatDate(date: DateTime) = ISODateTimeFormat.dateTime print date
private def podiumJson(swiss: Swiss): Fu[Option[JsArray]] =
swiss.isFinished ?? {
SwissPlayer.fields { f =>
@ -165,6 +143,38 @@ final class SwissJson(
object SwissJson {
private def formatDate(date: DateTime) = ISODateTimeFormat.dateTime print date
private def swissJsonBase(swiss: Swiss) =
Json
.obj(
"id" -> swiss.id.value,
"createdBy" -> swiss.createdBy,
"startsAt" -> formatDate(swiss.startsAt),
"name" -> swiss.name,
"clock" -> swiss.clock,
"variant" -> swiss.variant.key,
"round" -> swiss.round,
"nbRounds" -> swiss.actualNbRounds,
"nbPlayers" -> swiss.nbPlayers,
"nbOngoing" -> swiss.nbOngoing,
"status" -> {
if (swiss.isStarted) "started"
else if (swiss.isFinished) "finished"
else "created"
}
)
.add("quote" -> swiss.isCreated.option(lila.quote.Quote.one(swiss.id.value)))
.add("nextRound" -> swiss.nextRoundAt.map { next =>
Json.obj(
"at" -> formatDate(next),
"in" -> (next.getSeconds - nowSeconds).toInt.atLeast(0)
)
})
.add("greatPlayer" -> GreatPlayer.wikiUrl(swiss.name).map { url =>
Json.obj("name" -> swiss.name, "url" -> url)
})
private[swiss] def playerJson(swiss: Swiss, view: SwissPlayer.View): JsObject =
playerJsonBase(swiss, view) ++ Json
.obj(