Edit swiss via the API

closes https://github.com/ornicar/lila/issues/9862

TODO: update documentation
pull/10015/head
kraktus 2021-10-23 17:29:33 +02:00
parent 23252dba3d
commit 876a9a37a3
3 changed files with 32 additions and 8 deletions

View File

@ -213,7 +213,25 @@ final class Swiss(
.bindFromRequest()
.fold(
err => BadRequest(html.swiss.form.edit(swiss, err)).fuccess,
data => env.swiss.api.update(swiss, data) inject Redirect(routes.Swiss.show(id))
data => env.swiss.api.update(swiss.id, data) inject Redirect(routes.Swiss.show(id))
)
}
}
def apiUpdate(id: String) =
ScopedBody(_.Tournament.Write) { implicit req => me =>
implicit val lang = reqLang
WithEditableSwiss(
id,
me,
_ => Unauthorized(Json.obj("error" -> "This user cannot edit this swiss")).fuccess
) { swiss =>
env.swiss.forms
.edit(me, swiss)
.bindFromRequest()
.fold(
newJsonFormError,
data => JsonOk { env.swiss.api.update(swiss.id, data) map (_.map(env.swiss.json.api)) }
)
}
}
@ -295,13 +313,17 @@ final class Swiss(
private def WithSwiss(id: String)(f: SwissModel => Fu[Result]): Fu[Result] =
env.swiss.api.byId(SwissId(id)) flatMap { _ ?? f }
private def WithEditableSwiss(id: String, me: lila.user.User)(
private def WithEditableSwiss(
id: String,
me: lila.user.User,
fallback: SwissModel => Fu[Result] = swiss => Redirect(routes.Swiss.show(swiss.id.value)).fuccess
)(
f: SwissModel => Fu[Result]
)(implicit ctx: Context): Fu[Result] =
): Fu[Result] =
WithSwiss(id) { swiss =>
if (swiss.createdBy == me.id && !swiss.isFinished) f(swiss)
else if (isGranted(_.ManageTournament)) f(swiss)
else Redirect(routes.Swiss.show(swiss.id.value)).fuccess
else if (isGranted(_.ManageTournament, me)) f(swiss)
else fallback(swiss)
}
private def canHaveChat(swiss: SwissModel)(implicit ctx: Context): Fu[Boolean] =

View File

@ -663,6 +663,7 @@ POST /api/tournament/:id/join controllers.Tournament.apiJoin(id: String
POST /api/tournament/:id/terminate controllers.Tournament.apiTerminate(id: String)
POST /api/tournament/team-battle/:id controllers.Tournament.apiTeamBattleUpdate(id: String)
POST /api/swiss/new/:teamId controllers.Swiss.apiCreate(teamId: String)
POST /api/swiss/:id/edit controllers.Swiss.apiUpdate(id: String)
POST /api/swiss/:id/join controllers.Swiss.apiJoin(id: String)
POST /api/swiss/:id/terminate controllers.Swiss.apiTerminate(id: String)
GET /api/swiss/:id/games controllers.Api.swissGames(id: String)

View File

@ -85,8 +85,8 @@ final class SwissApi(
cache.featuredInTeam.invalidate(swiss.teamId) inject swiss
}
def update(swiss: Swiss, data: SwissForm.SwissData): Funit =
Sequencing(swiss.id)(byId) { old =>
def update(swissId: Swiss.Id, data: SwissForm.SwissData): Fu[Option[Swiss]] =
Sequencing(swissId)(byId) { old =>
val position =
if (old.isCreated || old.settings.position.isDefined) data.realVariant.standard ?? data.realPosition
else old.settings.position
@ -121,9 +121,10 @@ final class SwissApi(
s.copy(nextRoundAt = none)
else s
}
colls.swiss.update.one($id(old.id), addFeaturable(swiss)).void >>- {
colls.swiss.update.one($id(old.id), addFeaturable(swiss)).void >> {
cache.roundInfo.put(swiss.id, fuccess(swiss.roundInfo.some))
socket.reload(swiss.id)
fuccess(swiss.some)
}
}