diff options
author | Vlad Uspensky <v.uspenskiy@icloud.com> | 2017-10-12 08:48:35 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-12 08:48:35 -0700 |
commit | f3b809659969ee29ab7f0a62ec1cff25a3e263dc (patch) | |
tree | 6150d30086c7cfa9aac2cdbd33e755863b2a7e74 /src/main/scala/xyz/driver/pdsuidomain/formats/json | |
parent | 623289020c91dfd4cb38ce23cac77d735b31c3be (diff) | |
parent | f49ba1bd0b14073dd263b5cce499250c8a4419b2 (diff) | |
download | rest-query-f3b809659969ee29ab7f0a62ec1cff25a3e263dc.tar.gz rest-query-f3b809659969ee29ab7f0a62ec1cff25a3e263dc.tar.bz2 rest-query-f3b809659969ee29ab7f0a62ec1cff25a3e263dc.zip |
Merge pull request #42 from drivergroup/PDSUI-list-responsev0.8.7
Fixed patientcriterion format; Added format for ListResponse
Diffstat (limited to 'src/main/scala/xyz/driver/pdsuidomain/formats/json')
-rw-r--r-- | src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/ListResponse.scala | 29 | ||||
-rw-r--r-- | src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientcriterion.scala | 18 |
2 files changed, 34 insertions, 13 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..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 @@ -2,13 +2,14 @@ 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" @@ -27,7 +28,7 @@ object ListResponse extends DefaultJsonProtocol { implicit val listResponseMetaFormat: RootJsonFormat[Meta] = jsonFormat4(Meta.apply) - implicit def listResponseMetaWriter[T: JsonWriter]: RootJsonWriter[ListResponse[T]] = + implicit def listResponseWriter[T: JsonWriter]: RootJsonWriter[ListResponse[T]] = new RootJsonWriter[ListResponse[T]] { override def write(listResponse: ListResponse[T]): JsValue = { JsObject( @@ -36,4 +37,26 @@ object ListResponse extends DefaultJsonProtocol { ) } } + + 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 { + 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 + .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 7e8c220..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 @@ -12,17 +12,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[LabelValue]) - } else orig.eligibilityStatus + val eligibilityStatus = fields + .get("eligibilityStatus") + .map(_.convertTo[Option[LabelValue]]) + .getOrElse(orig.eligibilityStatus) - val verifiedEligibilityStatus = if (fields.contains("verifiedEligibilityStatus")) { - fields - .get("verifiedEligibilityStatus") - .map(_.convertTo[LabelValue]) - } else orig.verifiedEligibilityStatus + val verifiedEligibilityStatus = fields + .get("verifiedEligibilityStatus") + .map(_.convertTo[Option[LabelValue]]) + .getOrElse(orig.verifiedEligibilityStatus) orig.copy( eligibilityStatus = eligibilityStatus, |