From a05b489f56dedb3acd88430d35a66c4f9f2d46cd Mon Sep 17 00:00:00 2001 From: gnowacki Date: Tue, 14 Aug 2018 16:08:53 +0200 Subject: [PATCH] Added support for multi custom fields --- .gitignore | 2 + .../models/CustomAttributeFormat.scala | 39 ++++++++++++++++--- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 46eb1b3..a32b255 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,5 @@ tmp __pycache__/ *.py[cod] *$py.class + +sbt-launch.jar diff --git a/app/org/elastic4play/models/CustomAttributeFormat.scala b/app/org/elastic4play/models/CustomAttributeFormat.scala index 3944edb..76d8506 100644 --- a/app/org/elastic4play/models/CustomAttributeFormat.scala +++ b/app/org/elastic4play/models/CustomAttributeFormat.scala @@ -30,17 +30,44 @@ class CustomAttributeFormat extends AttributeFormat[JsValue]("custom") { case _ ⇒ false } - private def objectFieldsIsValid(v: JsValue) = v match { + private def objectFieldsIsValid(v: JsValue): Boolean = v match { case JsObject(fields) ⇒ fields.forall(fieldIsValid) case _ ⇒ false } private def fieldIsValid(f: (String, JsValue)): Boolean = f match { - case ("number", _: JsNumber | JsNull) ⇒ true - case ("string", _: JsString | JsNull) ⇒ true - case ("date", JsString(d)) ⇒ DateAttributeFormat.parse(d).isDefined - case ("date", JsNull) ⇒ true - case ("date", _: JsNumber | JsNull) ⇒ true + case ("number", _: JsNumber | JsNull) ⇒ true + case ("number", arr: JsArray) ⇒ arr.validate[IndexedSeq[JsNumber]] match { + case success: JsSuccess[IndexedSeq[JsNumber]] ⇒ true + case failure: JsError ⇒ arr.value.forall(elem ⇒ elem.validate[JsNumber] match { + case success: JsSuccess[JsNumber] ⇒ true + case failure: JsError ⇒ if (elem == JsNull) true else false + }) + } + + case ("string", _: JsString | JsNull) ⇒ true + case ("string", arr: JsArray) ⇒ arr.validate[IndexedSeq[JsString]] match { + case success: JsSuccess[IndexedSeq[JsString]] ⇒ true + case failure: JsError ⇒ arr.value.forall(elem ⇒ elem.validate[JsString] match { + case success: JsSuccess[JsString] ⇒ true + case failure: JsError ⇒ if (elem == JsNull) true else false + }) + } + + case ("date", JsString(d)) ⇒ DateAttributeFormat.parse(d).isDefined + case ("date", JsNull) ⇒ true + case ("date", _: JsNumber | JsNull) ⇒ true + case ("date", arr: JsArray) ⇒ arr.validate[IndexedSeq[JsString]] match { + case success: JsSuccess[IndexedSeq[JsString]] ⇒ success.get.map(elem ⇒ elem.value).forall(value ⇒ DateAttributeFormat.parse(value).isDefined) + case failure: JsError ⇒ arr.validate[IndexedSeq[JsNumber]] match { + case success: JsSuccess[IndexedSeq[JsNumber]] ⇒ true + case failure: JsError ⇒ arr.value.forall(elem ⇒ elem.validate[JsNumber] match { + case success: JsSuccess[JsNumber] ⇒ true + case failure: JsError ⇒ if (elem == JsNull) true else false + }) + } + } + case ("boolean", _: JsBoolean | JsNull) ⇒ true case ("order", _: JsNumber | JsNull) ⇒ true case _ ⇒ false