diff --git a/app/controllers/Auth.scala b/app/controllers/Auth.scala index 1d3b9eca6a..ff25ec6b46 100644 --- a/app/controllers/Auth.scala +++ b/app/controllers/Auth.scala @@ -81,7 +81,7 @@ object Auth extends LilaController { api.usernameForm.bindFromRequest.fold( err => negotiate( html = Unauthorized(html.auth.login(api.loginForm, referrer)).fuccess, - api = _ => Unauthorized(errorsAsJson(err)).fuccess + api = _ => jsonFormError(err) ), username => HasherRateLimit(username, ctx.req) { chargeIpLimiter => api.loadLoginForm(username) flatMap { loginForm => @@ -95,7 +95,7 @@ object Auth extends LilaController { case _ => Unauthorized(html.auth.login(err, referrer)) } }, - api = _ => Unauthorized(errorsAsJson(err)).fuccess + api = _ => jsonFormError(err) ) }, result => result.toOption match { @@ -214,7 +214,7 @@ object Auth extends LilaController { api = apiVersion => forms.signup.mobile.bindFromRequest.fold( err => { err("username").value foreach { authLog(_, s"Signup fail: ${err.errors mkString ", "}") } - fuccess(BadRequest(jsonError(errorsAsJson(err)))) + jsonFormError(err) }, data => HasherRateLimit(data.username, ctx.req) { _ => val email = env.emailAddressValidator.validate(data.realEmail) err s"Invalid email ${data.email}" diff --git a/app/controllers/Bot.scala b/app/controllers/Bot.scala index 25df2839f2..25c0f11015 100644 --- a/app/controllers/Bot.scala +++ b/app/controllers/Bot.scala @@ -34,7 +34,7 @@ object Bot extends LilaController { } case Array("game", id, "chat") => WithBot(me) { Env.bot.form.chat.bindFromRequest.fold( - err => BadRequest(errorsAsJson(err)).fuccess, + jsonFormError, res => WithMyBotGame(id, me) { pov => Env.bot.player.chat(pov.gameId, me, res) inject jsonOkResult } diff --git a/app/controllers/LilaController.scala b/app/controllers/LilaController.scala index b985986fc9..0863bf6082 100644 --- a/app/controllers/LilaController.scala +++ b/app/controllers/LilaController.scala @@ -466,7 +466,7 @@ private[controllers] trait LilaController ) andThen (__ \ "").json.prune } - protected def errorsAsJson(form: play.api.data.Form[_])(implicit lang: play.api.i18n.Lang) = { + protected def errorsAsJson(form: Form[_])(implicit lang: play.api.i18n.Lang) = { val json = Json.toJson( form.errors.groupBy(_.key).mapValues { errors => errors.map(e => lila.i18n.Translator.txt.literal(e.message, lila.i18n.I18nDb.Site, e.args, lang)) @@ -475,6 +475,9 @@ private[controllers] trait LilaController json validate jsonGlobalErrorRenamer getOrElse json } + protected def jsonFormError(err: Form[_])(implicit lang: play.api.i18n.Lang) = + fuccess(BadRequest(errorsAsJson(err))) + protected def pageHit(implicit ctx: lila.api.Context) = if (HTTPRequest isHuman ctx.req) lila.mon.http.request.path(ctx.req.path)() diff --git a/app/controllers/Message.scala b/app/controllers/Message.scala index 33a90b2946..d627a1e26d 100644 --- a/app/controllers/Message.scala +++ b/app/controllers/Message.scala @@ -112,7 +112,7 @@ object Message extends LilaController { } ), api = _ => forms.thread(me).bindFromRequest.fold( - err => fuccess(BadRequest(errorsAsJson(err))), + jsonFormError, data => api.makeThread(data, me) map { thread => Ok(Json.obj("ok" -> true, "id" -> thread.id)) } diff --git a/app/controllers/Puzzle.scala b/app/controllers/Puzzle.scala index c498dbc83d..04ab23e3b0 100644 --- a/app/controllers/Puzzle.scala +++ b/app/controllers/Puzzle.scala @@ -98,7 +98,7 @@ object Puzzle extends LilaController { if (puzzle.mate) lila.mon.puzzle.round.mate() else lila.mon.puzzle.round.material() env.forms.round.bindFromRequest.fold( - err => fuccess(BadRequest(errorsAsJson(err))), + jsonFormError, resultInt => { val result = Result(resultInt == 1) ctx.me match { @@ -134,7 +134,7 @@ object Puzzle extends LilaController { if (puzzle.mate) lila.mon.puzzle.round.mate() else lila.mon.puzzle.round.material() env.forms.round.bindFromRequest.fold( - err => fuccess(BadRequest(errorsAsJson(err))), + jsonFormError, resultInt => ctx.me match { case Some(me) => for { (round, mode) <- env.finisher( @@ -168,7 +168,7 @@ object Puzzle extends LilaController { NoBot { implicit val req = ctx.body env.forms.vote.bindFromRequest.fold( - err => fuccess(BadRequest(errorsAsJson(err))), + jsonFormError, vote => env.api.vote.find(id, me) flatMap { v => env.api.vote.update(id, me, v, vote == 1) } map { diff --git a/app/controllers/Setup.scala b/app/controllers/Setup.scala index cf5d7cc4ea..3171c839f0 100644 --- a/app/controllers/Setup.scala +++ b/app/controllers/Setup.scala @@ -63,9 +63,9 @@ object Setup extends LilaController with TheftPrevention { implicit val req = ctx.body PostRateLimit(HTTPRequest lastRemoteAddress ctx.req) { env.forms.friend(ctx).bindFromRequest.fold( - f => negotiate( + err => negotiate( html = Lobby.renderHome(Results.BadRequest), - api = _ => fuccess(BadRequest(errorsAsJson(f))) + api = _ => jsonFormError(err) ), { case config => userId ?? UserRepo.byId flatMap { destUser => destUser ?? { Env.challenge.granter(ctx.me, _, config.perfType) } flatMap { @@ -138,10 +138,7 @@ object Setup extends LilaController with TheftPrevention { PostRateLimit(HTTPRequest lastRemoteAddress ctx.req) { NoPlaybanOrCurrent { env.forms.hook(ctx).bindFromRequest.fold( - err => negotiate( - html = BadRequest(errorsAsJson(err).toString).fuccess, - api = _ => BadRequest(errorsAsJson(err)).fuccess - ), + jsonFormError, config => if (getBool("pool")) env.processor.saveHookConfig(config) inject hookSaveOnlyResponse else (ctx.userId ?? Env.relation.api.fetchBlocking) flatMap { @@ -200,9 +197,9 @@ object Setup extends LilaController with TheftPrevention { PostRateLimit(HTTPRequest lastRemoteAddress ctx.req) { implicit val req = ctx.body form(ctx).bindFromRequest.fold( - f => negotiate( + err => negotiate( html = Lobby.renderHome(Results.BadRequest), - api = _ => fuccess(BadRequest(errorsAsJson(f))) + api = _ => jsonFormError(err) ), config => op(config)(ctx) flatMap { pov => negotiate( diff --git a/app/controllers/Study.scala b/app/controllers/Study.scala index d9b4b343cb..bfb3293279 100644 --- a/app/controllers/Study.scala +++ b/app/controllers/Study.scala @@ -272,7 +272,7 @@ object Study extends LilaController { def importPgn(id: String) = AuthBody { implicit ctx => me => implicit val req = ctx.body lila.study.DataForm.importPgn.form.bindFromRequest.fold( - err => BadRequest(errorsAsJson(err)).fuccess, + jsonFormError, data => env.api.importPgns(me, StudyModel.Id(id), data.toChapterDatas, sticky = data.sticky) ) } diff --git a/app/controllers/Tournament.scala b/app/controllers/Tournament.scala index ee11dd3bc5..be23e00711 100644 --- a/app/controllers/Tournament.scala +++ b/app/controllers/Tournament.scala @@ -253,7 +253,7 @@ object Tournament extends LilaController { private def doApiCreate(me: lila.user.User)(implicit req: Request[_]): Fu[Result] = env.forms(me).bindFromRequest.fold( - err => BadRequest(errorsAsJson(err)).fuccess, + jsonFormError, setup => teamsIBelongTo(me) flatMap { teams => env.api.createTournament(setup, me, teams, getUserTeamIds) flatMap { tour => Env.tournament.jsonView(tour, none, none, getUserTeamIds, none, none, lila.i18n.defaultLang) diff --git a/app/controllers/User.scala b/app/controllers/User.scala index 5d7b8167c0..e163ccb972 100644 --- a/app/controllers/User.scala +++ b/app/controllers/User.scala @@ -282,7 +282,7 @@ object User extends LilaController { def apiWriteNote(username: String) = ScopedBody() { implicit req => me => doWriteNote(username, me)( - err = err => _ => fuccess(BadRequest(errorsAsJson(err))), + err = err => _ => jsonFormError(err), suc = jsonOkResult ) } diff --git a/app/controllers/UserAnalysis.scala b/app/controllers/UserAnalysis.scala index af5c50cb5c..07a14a1f7b 100644 --- a/app/controllers/UserAnalysis.scala +++ b/app/controllers/UserAnalysis.scala @@ -105,7 +105,7 @@ object UserAnalysis extends LilaController with TheftPrevention { def pgn = OpenBody { implicit ctx => implicit val req = ctx.body Env.importer.forms.importForm.bindFromRequest.fold( - failure => BadRequest(errorsAsJson(failure)).fuccess, + jsonFormError, data => Env.importer.importer.inMemory(data).fold( err => BadRequest(jsonError(err.shows)).fuccess, { case (game, fen) =>