Skip to content

Commit

Permalink
OAuth2 endpoint to create tournaments
Browse files Browse the repository at this point in the history
  • Loading branch information
ornicar committed May 10, 2018
1 parent 8a0b3eb commit d67aaa0
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 20 deletions.
21 changes: 14 additions & 7 deletions app/controllers/Tournament.scala
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ object Tournament extends LilaController {
fuccess(Redirect(routes.Tournament.home(1)))
}

def create = AuthBody { implicit ctx => implicit me =>
def create = AuthBody { implicit ctx => me =>
NoLameOrBot {
implicit val req = ctx.body
negotiate(
Expand All @@ -234,16 +234,23 @@ object Tournament extends LilaController {
}(rateLimited)
}(rateLimited)
),
api = _ => env.forms(me).bindFromRequest.fold(
err => BadRequest(errorsAsJson(err)).fuccess,
setup => env.api.createTournament(setup, me) map { tour =>
Ok(Json.obj("id" -> tour.id))
}
)
api = _ => doApiCreate(me)
)
}
}

def apiCreate = ScopedBody() { implicit req => me =>
doApiCreate(me)
}

private def doApiCreate(me: lila.user.User)(implicit req: Request[_]): Fu[Result] =
env.forms(me).bindFromRequest.fold(
err => BadRequest(errorsAsJson(err)).fuccess,
setup => env.api.createTournament(setup, me) flatMap { tour =>
Env.tournament.jsonView(tour, none, none, none, none, lila.i18n.defaultLang)
} map { Ok(_) }
)

def limitedInvitation = Auth { implicit ctx => me =>
for {
(tours, _) <- upcomingCache.get
Expand Down
1 change: 1 addition & 0 deletions conf/routes
Original file line number Diff line number Diff line change
Expand Up @@ -496,6 +496,7 @@ GET /api/game/:id controllers.Api.game(id: String)
GET /api/games/team/:teamId controllers.Api.gamesVsTeam(teamId: String)
GET /api/tournament controllers.Api.currentTournaments
GET /api/tournament/:id controllers.Api.tournament(id: String)
POST /api/tournament/new controllers.Tournament.apiCreate
GET /api/status controllers.Api.status
GET /api/socket controllers.Main.apiWebsocket
GET /api/users/status controllers.Api.usersStatus
Expand Down
5 changes: 5 additions & 0 deletions modules/oauth/src/main/OAuthScope.scala
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ object OAuthScope {
case object Read extends OAuthScope("email:read", "Read email address")
}

object Tournament {
case object Write extends OAuthScope("tournament:write", "Create tournaments")
}

object Bot {
case object Play extends OAuthScope("bot:play", "Play bot moves")
}
Expand All @@ -29,6 +33,7 @@ object OAuthScope {
Game.Read,
Preference.Read, Preference.Write,
Email.Read,
Tournament.Write,
Bot.Play
)

Expand Down
12 changes: 7 additions & 5 deletions modules/tournament/src/main/DataForm.scala
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ final class DataForm {
clockIncrement = clockIncrementDefault,
minutes = minuteDefault,
waitMinutes = waitMinuteDefault,
variant = chess.variant.Standard.id,
variant = chess.variant.Standard.key,
position = StartingPosition.initial.fen,
`private` = None,
password = None,
Expand All @@ -43,7 +43,7 @@ final class DataForm {
"clockIncrement" -> numberIn(clockIncrementPrivateChoices),
"minutes" -> numberIn(minutePrivateChoices),
"waitMinutes" -> numberIn(waitMinuteChoices),
"variant" -> number.verifying(validVariantIds contains _),
"variant" -> nonEmptyText.verifying(v => guessVariant(v).isDefined),
"position" -> nonEmptyText,
"mode" -> optional(number.verifying(Mode.all map (_.id) contains _)),
"private" -> optional(text.verifying("on" == _)),
Expand Down Expand Up @@ -100,7 +100,9 @@ object DataForm {

val validVariants = List(Standard, Chess960, KingOfTheHill, ThreeCheck, Antichess, Atomic, Horde, RacingKings, Crazyhouse)

val validVariantIds = validVariants.map(_.id).toSet
def guessVariant(from: String): Option[Variant] = validVariants.find { v =>
v.key == from || parseIntOption(from).exists(v.id ==)
}

def startingPosition(fen: String, variant: Variant): StartingPosition =
Thematic.byFen(fen).ifTrue(variant.standard) | StartingPosition.initial
Expand All @@ -112,7 +114,7 @@ private[tournament] case class TournamentSetup(
clockIncrement: Int,
minutes: Int,
waitMinutes: Int,
variant: Int,
variant: String,
position: String,
mode: Option[Int],
`private`: Option[String],
Expand All @@ -135,7 +137,7 @@ private[tournament] case class TournamentSetup(

def realMode = mode.fold(Mode.default)(Mode.orDefault)

def realVariant = chess.variant.Variant orDefault variant
def realVariant = DataForm.guessVariant(variant) | chess.variant.Standard

def clockConfig = chess.Clock.Config((clockTime * 60).toInt, clockIncrement)

Expand Down
9 changes: 4 additions & 5 deletions modules/tournament/src/main/crud/CrudApi.scala
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ final class CrudApi {
clockTime = tour.clock.limitInMinutes,
clockIncrement = tour.clock.incrementSeconds,
minutes = tour.minutes,
variant = tour.variant.id,
variant = tour.variant.key,
position = tour.position.fen,
date = tour.startsAt,
image = ~tour.spotlight.flatMap(_.iconImg),
Expand Down Expand Up @@ -53,17 +53,16 @@ final class CrudApi {
private def updateTour(tour: Tournament, data: CrudForm.Data) = {
import data._
val clock = chess.Clock.Config((clockTime * 60).toInt, clockIncrement)
val v = chess.variant.Variant.orDefault(variant)
tour.copy(
name = name,
clock = clock,
minutes = minutes,
variant = v,
variant = realVariant,
startsAt = date,
schedule = Schedule(
freq = Schedule.Freq.Unique,
speed = Schedule.Speed.fromClock(clock),
variant = v,
variant = realVariant,
position = chess.StartingPosition.initial,
at = date
).some,
Expand All @@ -74,7 +73,7 @@ final class CrudApi {
iconFont = none,
iconImg = image.some.filter(_.nonEmpty)
).some,
position = DataForm.startingPosition(data.position, v),
position = DataForm.startingPosition(data.position, realVariant),
noBerserk = !data.berserkable
) |> { tour =>
tour.perfType.fold(tour) { perfType =>
Expand Down
8 changes: 5 additions & 3 deletions modules/tournament/src/main/crud/CrudForm.scala
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ object CrudForm {
"clockTime" -> numberInDouble(clockTimePrivateChoices),
"clockIncrement" -> numberIn(clockIncrementPrivateChoices),
"minutes" -> number(min = 20, max = 1440),
"variant" -> number.verifying(validVariantIds contains _),
"variant" -> nonEmptyText.verifying(v => guessVariant(v).isDefined),
"position" -> nonEmptyText.verifying(DataForm.positions contains _),
"date" -> utcDate,
"image" -> stringIn(imageChoices),
Expand All @@ -38,7 +38,7 @@ object CrudForm {
clockTime = clockTimeDefault,
clockIncrement = clockIncrementDefault,
minutes = minuteDefault,
variant = chess.variant.Standard.id,
variant = chess.variant.Standard.key,
position = StartingPosition.initial.fen,
date = DateTime.now plusDays 7,
image = "",
Expand All @@ -54,7 +54,7 @@ object CrudForm {
clockTime: Double,
clockIncrement: Int,
minutes: Int,
variant: Int,
variant: String,
position: String,
date: DateTime,
image: String,
Expand All @@ -64,6 +64,8 @@ object CrudForm {
berserkable: Boolean
) {

def realVariant = DataForm.guessVariant(variant) | chess.variant.Standard

def validClock = (clockTime + clockIncrement) > 0

def validTiming = (minutes * 60) >= (3 * estimatedGameDuration)
Expand Down

0 comments on commit d67aaa0

Please sign in to comment.