From c32f965212481e4d26c2ae1ae5616f2d4b3e22ae Mon Sep 17 00:00:00 2001 From: Aleksandr Date: Tue, 10 Oct 2017 16:36:39 +0700 Subject: Fixed patientcriterion format; Added format for ListResponse --- .../formats/json/sprayformats/ListResponse.scala | 39 ++++++++++++++++++---- .../json/sprayformats/patientcriterion.scala | 20 +++++------ .../json/sprayformats/ListResponseSuite.scala | 2 +- .../sprayformats/PatientCriterionFormatSuite.scala | 4 +-- 4 files changed, 45 insertions(+), 20 deletions(-) diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala index 2a670c4..d294b38 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala @@ -10,7 +10,7 @@ final case class ListResponse[+T](items: Seq[T], meta: ListResponse.Meta) object ListResponse extends DefaultJsonProtocol { private val itemsField = "items" - private val metaField = "meta" + private val metaField = "meta" final case class Meta(itemsCount: Int, pageNumber: Int, pageSize: Int, lastUpdate: Option[LocalDateTime]) @@ -27,13 +27,40 @@ object ListResponse extends DefaultJsonProtocol { implicit val listResponseMetaFormat: RootJsonFormat[Meta] = jsonFormat4(Meta.apply) - implicit def listResponseMetaWriter[T: JsonWriter]: RootJsonWriter[ListResponse[T]] = + private def listResponseJsonWriter[T: JsonWriter](listResponse: ListResponse[T]) = { + JsObject( + itemsField -> listResponse.items.map(_.toJson).toJson, + metaField -> listResponse.meta.toJson + ) + } + + implicit def listResponseWriter[T: JsonWriter]: RootJsonWriter[ListResponse[T]] = new RootJsonWriter[ListResponse[T]] { override def write(listResponse: ListResponse[T]): JsValue = { - JsObject( - itemsField -> listResponse.items.map(_.toJson).toJson, - metaField -> listResponse.meta.toJson - ) + listResponseJsonWriter(listResponse) + } + } + + implicit def listResponseFormat[T: RootJsonFormat]: RootJsonFormat[ListResponse[T]] = + new RootJsonFormat[ListResponse[T]] { + override def write(listResponse: ListResponse[T]): JsValue = { + listResponseJsonWriter(listResponse) + } + + override def read(json: JsValue): ListResponse[T] = json match { + case JsObject(fields) => + val items = fields + .get(itemsField) + .map(_.convertTo[Seq[T]]) + .getOrElse(deserializationError(s"ListResponse json object does not contain `$itemsField` field: $json")) + + val meta = fields + .get(metaField) + .map(_.convertTo[Meta]) + .getOrElse(deserializationError(s"ListResponse json object does not contain `$metaField` field: $json")) + + ListResponse(items, meta) + case _ => deserializationError(s"Expected ListResponse json object, but got $json") } } } diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientcriterion.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientcriterion.scala index affb346..87e2a3a 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientcriterion.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientcriterion.scala @@ -11,17 +11,15 @@ object patientcriterion { def applyUpdateToPatientCriterion(json: JsValue, orig: PatientCriterion): PatientCriterion = json match { case JsObject(fields) => - val eligibilityStatus = if (fields.contains("eligibilityStatus")) { - fields - .get("eligibilityStatus") - .map(_.convertTo[FuzzyValue]) - } else orig.eligibilityStatus - - val verifiedEligibilityStatus = if (fields.contains("verifiedEligibilityStatus")) { - fields - .get("verifiedEligibilityStatus") - .map(_.convertTo[FuzzyValue]) - } else orig.verifiedEligibilityStatus + val eligibilityStatus = fields + .get("eligibilityStatus") + .map(_.convertTo[Option[FuzzyValue]]) + .getOrElse(orig.eligibilityStatus) + + val verifiedEligibilityStatus = fields + .get("verifiedEligibilityStatus") + .map(_.convertTo[Option[FuzzyValue]]) + .getOrElse(orig.verifiedEligibilityStatus) orig.copy( eligibilityStatus = eligibilityStatus, diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponseSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponseSuite.scala index 2e7481a..1a1e76c 100644 --- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponseSuite.scala +++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponseSuite.scala @@ -101,7 +101,7 @@ class ListResponseSuite extends FlatSpec with Matchers { val listResponse = ListResponse(Seq(orig), meta) - val writtenJson = ListResponse.listResponseMetaWriter.write(listResponse) + val writtenJson = ListResponse.listResponseWriter.write(listResponse) val expectedJson = s"""{"items":[$recordJsonAsString],"meta":${metaJsonObjectAsString(meta)}}""" writtenJson should be( diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientCriterionFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientCriterionFormatSuite.scala index 623b3a9..054a1df 100644 --- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientCriterionFormatSuite.scala +++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/PatientCriterionFormatSuite.scala @@ -39,8 +39,8 @@ class PatientCriterionFormatSuite extends FlatSpec with Matchers { "criterionIsDefining":false,"criterionIsCompound":false,"eligibilityStatus":"Yes","verifiedEligibilityStatus":null, "isVisible":true,"isVerified":true,"lastUpdate":"2017-08-10T18:00Z","arms":["arm 31","arm 32"]}""".parseJson) - val updatePatientCriterionJson = """{"verifiedEligibilityStatus":"No"}""".parseJson - val expectedUpdatedPatientCriterion = orig.copy(verifiedEligibilityStatus = Some(FuzzyValue.No)) + val updatePatientCriterionJson = """{"verifiedEligibilityStatus":"No","eligibilityStatus":null}""".parseJson + val expectedUpdatedPatientCriterion = orig.copy(verifiedEligibilityStatus = Some(FuzzyValue.No),eligibilityStatus = None) val parsedUpdatePatientCriterion = applyUpdateToPatientCriterion(updatePatientCriterionJson, orig) parsedUpdatePatientCriterion should be(expectedUpdatedPatientCriterion) -- cgit v1.2.3 From 9198729ebf3d20b650b4467daa0d484a3148f01c Mon Sep 17 00:00:00 2001 From: Aleksandr Date: Tue, 10 Oct 2017 16:43:40 +0700 Subject: Code is formatted --- .../driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala | 4 ++-- .../pdsuidomain/formats/json/sprayformats/patientcriterion.scala | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala index d294b38..59a1a48 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala @@ -10,7 +10,7 @@ final case class ListResponse[+T](items: Seq[T], meta: ListResponse.Meta) object ListResponse extends DefaultJsonProtocol { private val itemsField = "items" - private val metaField = "meta" + private val metaField = "meta" final case class Meta(itemsCount: Int, pageNumber: Int, pageSize: Int, lastUpdate: Option[LocalDateTime]) @@ -30,7 +30,7 @@ object ListResponse extends DefaultJsonProtocol { private def listResponseJsonWriter[T: JsonWriter](listResponse: ListResponse[T]) = { JsObject( itemsField -> listResponse.items.map(_.toJson).toJson, - metaField -> listResponse.meta.toJson + metaField -> listResponse.meta.toJson ) } diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientcriterion.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientcriterion.scala index f4d8e90..f41c846 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientcriterion.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientcriterion.scala @@ -22,7 +22,6 @@ object patientcriterion { .map(_.convertTo[Option[LabelValue]]) .getOrElse(orig.verifiedEligibilityStatus) - orig.copy( eligibilityStatus = eligibilityStatus, verifiedEligibilityStatus = verifiedEligibilityStatus -- cgit v1.2.3 From 18b5979ae51ead407e7ebda12d6346031c0dde9d Mon Sep 17 00:00:00 2001 From: Aleksandr Date: Thu, 12 Oct 2017 10:59:02 +0700 Subject: Improved ListResponse class --- .../formats/json/sprayformats/ListResponse.scala | 32 ++++++++++------------ 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala index 59a1a48..34cb7f1 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala @@ -2,15 +2,17 @@ package xyz.driver.pdsuidomain.formats.json.sprayformats import java.time.LocalDateTime -import spray.json.{RootJsonFormat, _} +import spray.json._ +import spray.json.DefaultJsonProtocol._ import xyz.driver.pdsuicommon.db.Pagination import xyz.driver.pdsuidomain.formats.json.sprayformats.common._ + final case class ListResponse[+T](items: Seq[T], meta: ListResponse.Meta) -object ListResponse extends DefaultJsonProtocol { +object ListResponse { private val itemsField = "items" - private val metaField = "meta" + private val metaField = "meta" final case class Meta(itemsCount: Int, pageNumber: Int, pageSize: Int, lastUpdate: Option[LocalDateTime]) @@ -27,31 +29,27 @@ object ListResponse extends DefaultJsonProtocol { implicit val listResponseMetaFormat: RootJsonFormat[Meta] = jsonFormat4(Meta.apply) - private def listResponseJsonWriter[T: JsonWriter](listResponse: ListResponse[T]) = { - JsObject( - itemsField -> listResponse.items.map(_.toJson).toJson, - metaField -> listResponse.meta.toJson - ) - } - implicit def listResponseWriter[T: JsonWriter]: RootJsonWriter[ListResponse[T]] = new RootJsonWriter[ListResponse[T]] { override def write(listResponse: ListResponse[T]): JsValue = { - listResponseJsonWriter(listResponse) + JsObject( + itemsField -> listResponse.items.map(_.toJson).toJson, + metaField -> listResponse.meta.toJson + ) } } - implicit def listResponseFormat[T: RootJsonFormat]: RootJsonFormat[ListResponse[T]] = - new RootJsonFormat[ListResponse[T]] { - override def write(listResponse: ListResponse[T]): JsValue = { - listResponseJsonWriter(listResponse) - } + implicit def listResponseReader[T: JsonReader]: RootJsonReader[ListResponse[T]] = + new RootJsonReader[ListResponse[T]] { override def read(json: JsValue): ListResponse[T] = json match { case JsObject(fields) => val items = fields .get(itemsField) - .map(_.convertTo[Seq[T]]) + .map{ + case JsArray(elements) => elements.map(_.convertTo[T])(collection.breakOut) + case x => deserializationError(s"Expected Array as JsArray, but got $x") + } .getOrElse(deserializationError(s"ListResponse json object does not contain `$itemsField` field: $json")) val meta = fields -- cgit v1.2.3 From f49ba1bd0b14073dd263b5cce499250c8a4419b2 Mon Sep 17 00:00:00 2001 From: Aleksandr Date: Thu, 12 Oct 2017 11:21:15 +0700 Subject: Code is formatted --- .../pdsuidomain/formats/json/sprayformats/ListResponse.scala | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala index 34cb7f1..4afe0ee 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala @@ -7,12 +7,11 @@ import spray.json.DefaultJsonProtocol._ import xyz.driver.pdsuicommon.db.Pagination import xyz.driver.pdsuidomain.formats.json.sprayformats.common._ - final case class ListResponse[+T](items: Seq[T], meta: ListResponse.Meta) object ListResponse { private val itemsField = "items" - private val metaField = "meta" + private val metaField = "meta" final case class Meta(itemsCount: Int, pageNumber: Int, pageSize: Int, lastUpdate: Option[LocalDateTime]) @@ -34,21 +33,20 @@ object ListResponse { override def write(listResponse: ListResponse[T]): JsValue = { JsObject( itemsField -> listResponse.items.map(_.toJson).toJson, - metaField -> listResponse.meta.toJson + metaField -> listResponse.meta.toJson ) } } - implicit def listResponseReader[T: JsonReader]: RootJsonReader[ListResponse[T]] = new RootJsonReader[ListResponse[T]] { override def read(json: JsValue): ListResponse[T] = json match { case JsObject(fields) => val items = fields .get(itemsField) - .map{ + .map { case JsArray(elements) => elements.map(_.convertTo[T])(collection.breakOut) - case x => deserializationError(s"Expected Array as JsArray, but got $x") + case x => deserializationError(s"Expected Array as JsArray, but got $x") } .getOrElse(deserializationError(s"ListResponse json object does not contain `$itemsField` field: $json")) -- cgit v1.2.3