Edit swiss via the API
closes https://github.com/ornicar/lila/issues/9862 TODO: update documentationpull/10015/head
parent
23252dba3d
commit
876a9a37a3
|
@ -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] =
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue