72 lines
2.0 KiB
Scala
72 lines
2.0 KiB
Scala
package lila.pref
|
|
|
|
import play.api.mvc.Request
|
|
import scala.util.chaining._
|
|
|
|
// because the form structure has changed
|
|
// and the mobile app keeps sending the old format
|
|
object FormCompatLayer {
|
|
|
|
private type FormData = Map[String, Seq[String]]
|
|
|
|
def apply(pref: Pref, req: Request[_]): FormData =
|
|
reqToFormData(req) pipe
|
|
moveToAndRename(
|
|
"clock",
|
|
List(
|
|
"clockTenths" -> "tenths",
|
|
"clockBar" -> "bar",
|
|
"clockSound" -> "sound",
|
|
"moretime" -> "moretime"
|
|
)
|
|
) pipe
|
|
addMissing("clock.moretime", pref.moretime.toString) pipe
|
|
moveTo(
|
|
"behavior",
|
|
List(
|
|
"moveEvent",
|
|
"premove",
|
|
"takeback",
|
|
"autoQueen",
|
|
"autoThreefold",
|
|
"submitMove",
|
|
"confirmResign",
|
|
"keyboardMove"
|
|
)
|
|
) pipe
|
|
moveTo(
|
|
"display",
|
|
List(
|
|
"animation",
|
|
"captured",
|
|
"highlight",
|
|
"destination",
|
|
"coords",
|
|
"replay",
|
|
"pieceNotation",
|
|
"blindfold"
|
|
)
|
|
)
|
|
|
|
private def addMissing(path: String, default: String)(data: FormData): FormData =
|
|
data.updated(path, data.get(path).filter(_.nonEmpty) | List(default))
|
|
|
|
private def moveTo(prefix: String, fields: List[String]) =
|
|
moveToAndRename(prefix, fields.map(f => (f, f))) _
|
|
|
|
private def moveToAndRename(prefix: String, fields: List[(String, String)])(data: FormData): FormData =
|
|
fields.foldLeft(data) { case (d, (orig, dest)) =>
|
|
val newField = s"$prefix.$dest"
|
|
d + (newField -> ~d.get(newField).orElse(d.get(orig)))
|
|
}
|
|
|
|
private def reqToFormData(req: Request[_]): FormData = {
|
|
(req.body match {
|
|
case body: play.api.mvc.AnyContent if body.asFormUrlEncoded.isDefined => body.asFormUrlEncoded.get
|
|
case body: play.api.mvc.AnyContent if body.asMultipartFormData.isDefined =>
|
|
body.asMultipartFormData.get.asFormUrlEncoded
|
|
case _ => Map.empty[String, Seq[String]]
|
|
}) ++ req.queryString
|
|
}
|
|
}
|