diff options
author | vlad <vlad@driver.xyz> | 2017-10-30 14:21:55 -0700 |
---|---|---|
committer | vlad <vlad@driver.xyz> | 2017-10-30 14:21:55 -0700 |
commit | 78f467dd0b3b9f35bb49ae973b26fb37c458b138 (patch) | |
tree | e45ec25c7d914bed07774d862d59fdaa56fd6d60 /src/main/scala/xyz/driver/pdsuidomain/formats/json | |
parent | 604fbf0a7a082bc440c0778abd6f90005b210c16 (diff) | |
download | rest-query-78f467dd0b3b9f35bb49ae973b26fb37c458b138.tar.gz rest-query-78f467dd0b3b9f35bb49ae973b26fb37c458b138.tar.bz2 rest-query-78f467dd0b3b9f35bb49ae973b26fb37c458b138.zip |
Fixing Patients and Trials parsing, some refined to tryv0.11.1
Diffstat (limited to 'src/main/scala/xyz/driver/pdsuidomain/formats/json')
6 files changed, 180 insertions, 12 deletions
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiPartialDocument.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiPartialDocument.scala deleted file mode 100644 index 8b13789..0000000 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/document/ApiPartialDocument.scala +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient.scala index 75eb016..0830723 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient.scala @@ -1,9 +1,14 @@ package xyz.driver.pdsuidomain.formats.json +import java.time.{LocalDate, LocalDateTime} + import spray.json._ import xyz.driver.core.json.EnumJsonFormat +import xyz.driver.entities.common.FullName +import xyz.driver.entities.patient.CancerType import xyz.driver.formats.json.common._ import xyz.driver.formats.json.patient._ +import xyz.driver.pdsuicommon.domain.{StringId, User, UuidId} import xyz.driver.pdsuidomain.entities._ object patient { @@ -11,7 +16,7 @@ object patient { import Patient._ import common._ - implicit val patientStatusFormat = new EnumJsonFormat[Status]( + implicit val patientStatusFormat: RootJsonFormat[Status] = new EnumJsonFormat[Status]( "New" -> Status.New, "Verified" -> Status.Verified, "Reviewed" -> Status.Reviewed, @@ -20,7 +25,7 @@ object patient { "Flagged" -> Status.Flagged ) - implicit val patientOrderIdFormat = new RootJsonFormat[PatientOrderId] { + implicit val patientOrderIdFormat: RootJsonFormat[PatientOrderId] = new RootJsonFormat[PatientOrderId] { override def write(orderId: PatientOrderId): JsString = JsString(orderId.toString) override def read(json: JsValue): PatientOrderId = json match { case JsString(value) => PatientOrderId(value) @@ -44,7 +49,76 @@ object patient { "orderId" -> patient.orderId.toJson ) - override def read(json: JsValue): Patient = jsonReader[Patient].read(json) + override def read(json: JsValue): Patient = { + json match { + case JsObject(fields) => + val id = fields + .get("id") + .map(_.convertTo[UuidId[Patient]]) + .getOrElse(deserializationError(s"Patient create json object does not contain `id` field: $json")) + + val status = fields + .get("status") + .map(_.convertTo[Patient.Status]) + .getOrElse(deserializationError(s"Patient create json object does not contain `status` field: $json")) + + val name = fields + .get("name") + .map(_.convertTo[FullName[Patient]]) + .getOrElse(deserializationError(s"Patient create json object does not contain `name` field: $json")) + + val dob = fields + .get("dob") + .map(_.convertTo[LocalDate]) + .getOrElse(deserializationError(s"Patient create json object does not contain `dob` field: $json")) + + val assignee = fields + .get("assignee") + .flatMap(_.convertTo[Option[StringId[User]]]) + + val previousStatus = fields + .get("previousStatus") + .flatMap(_.convertTo[Option[Patient.Status]]) + + val previousAssignee = fields + .get("previousAssignee") + .flatMap(_.convertTo[Option[StringId[User]]]) + + val lastActiveUser = fields + .get("lastActiveUser") + .flatMap(_.convertTo[Option[StringId[User]]]) + + val disease = fields + .get("disease") + .map(_.convertTo[CancerType]) + .getOrElse(deserializationError(s"Patient create json object does not contain `disease` field: $json")) + + val orderId = fields + .get("orderId") + .map(_.convertTo[PatientOrderId]) + .getOrElse(deserializationError(s"Patient create json object does not contain `orderId` field: $json")) + + val lastUpdate = fields + .get("lastUpdate") + .map(_.convertTo[LocalDateTime]) + .getOrElse(deserializationError(s"Patient create json object does not contain `lastUpdate` field: $json")) + + Patient(id, + status, + name, + dob, + assignee, + previousStatus, + previousAssignee, + lastActiveUser, + isUpdateRequired = false, + disease, + orderId, + lastUpdate) + + case _ => deserializationError(s"Expected Json Object as Trial, but got $json") + } + } } } diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/trial/ApiPatientCriterion.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/trial/ApiPatientCriterion.scala deleted file mode 100644 index 8b13789..0000000 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/trial/ApiPatientCriterion.scala +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienthypothesis.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienthypothesis.scala index a36bac2..a459158 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienthypothesis.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienthypothesis.scala @@ -7,6 +7,7 @@ import xyz.driver.pdsuidomain.services.PatientHypothesisService.RichPatientHypot object patienthypothesis { import DefaultJsonProtocol._ import common._ + import xyz.driver.core.json._ def applyUpdateToPatientHypothesis(json: JsValue, orig: PatientHypothesis): PatientHypothesis = json match { case JsObject(fields) => diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientissue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientissue.scala index 5a2955f..bf1c0fd 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientissue.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientissue.scala @@ -2,6 +2,8 @@ package xyz.driver.pdsuidomain.formats.json import java.time.LocalDateTime +import eu.timepit.refined.api.Refined +import eu.timepit.refined.collection.NonEmpty import spray.json._ import xyz.driver.pdsuicommon.domain.{LongId, StringId, User, UuidId} import xyz.driver.pdsuidomain.entities._ @@ -9,12 +11,13 @@ import xyz.driver.pdsuidomain.entities._ object patientissue { import DefaultJsonProtocol._ import common._ + import xyz.driver.core.json._ def applyUpdateToPatientIssue(json: JsValue, orig: PatientIssue): PatientIssue = { json.asJsObject.getFields("text", "archiveRequired") match { case Seq(text, archiveRequired) => orig.copy( - text = text.convertTo[String], + text = text.convertTo[String Refined NonEmpty], archiveRequired = archiveRequired.convertTo[Boolean] ) @@ -31,7 +34,7 @@ object patientissue { patientId = patientId, lastUpdate = LocalDateTime.MIN, isDraft = true, - text = text.convertTo[String], + text = text.convertTo[String Refined NonEmpty], archiveRequired = false ) @@ -40,7 +43,7 @@ object patientissue { } - implicit val patientIssueWriter = new RootJsonWriter[PatientIssue] { + implicit val patientIssueWriter: RootJsonWriter[PatientIssue] = new RootJsonWriter[PatientIssue] { override def write(obj: PatientIssue) = JsObject( "id" -> obj.id.toJson, "text" -> obj.text.toJson, diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial.scala index 6cc2560..dc9c5e0 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial.scala @@ -1,10 +1,10 @@ package xyz.driver.pdsuidomain.formats.json -import java.time.{ZoneId, ZonedDateTime} +import java.time.{LocalDateTime, ZoneId, ZonedDateTime} import spray.json._ import xyz.driver.core.json.EnumJsonFormat -import xyz.driver.pdsuicommon.domain.{LongId, UuidId} +import xyz.driver.pdsuicommon.domain.{LongId, StringId, User, UuidId} import xyz.driver.pdsuidomain.entities._ object trial { @@ -12,7 +12,7 @@ object trial { import Trial._ import common._ - implicit val trialStatusFormat = new EnumJsonFormat[Status]( + implicit val trialStatusFormat: RootJsonFormat[Status] = new EnumJsonFormat[Status]( "New" -> Status.New, "ReviewSummary" -> Status.ReviewSummary, "Summarized" -> Status.Summarized, @@ -47,7 +47,99 @@ object trial { "originalTitle" -> obj.originalTitle.toJson ) - override def read(json: JsValue): Trial = jsonReader[Trial].read(json) + override def read(json: JsValue): Trial = { + json match { + case JsObject(fields) => + val id = fields + .get("id") + .map(_.convertTo[StringId[Trial]]) + .getOrElse(deserializationError(s"Trial create json object does not contain `id` field: $json")) + val externalid = fields + .get("externalid") + .map(_.convertTo[UuidId[Trial]]) + .getOrElse(deserializationError(s"Trial create json object does not contain `externalid` field: $json")) + val status = fields + .get("status") + .map(_.convertTo[Trial.Status]) + .getOrElse(deserializationError(s"Trial create json object does not contain `status` field: $json")) + val assignee = fields + .get("assignee") + .flatMap(_.convertTo[Option[StringId[User]]]) + val previousStatus = fields + .get("previousStatus") + .flatMap(_.convertTo[Option[Trial.Status]]) + val previousAssignee = fields + .get("previousAssignee") + .flatMap(_.convertTo[Option[StringId[User]]]) + val lastActiveUser = fields + .get("lastActiveUser") + .flatMap(_.convertTo[Option[StringId[User]]]) + val lastUpdate = fields + .get("lastUpdate") + .map(_.convertTo[LocalDateTime]) + .getOrElse(deserializationError(s"Trial create json object does not contain `lastUpdate` field: $json")) + val phase = fields + .get("phase") + .map(_.convertTo[String]) + .getOrElse(deserializationError(s"Trial create json object does not contain `phase` field: $json")) + val hypothesisId = fields + .get("hypothesisId") + .flatMap(_.convertTo[Option[UuidId[Hypothesis]]]) + val studyDesignId = fields + .get("studyDesignId") + .flatMap(_.convertTo[Option[LongId[StudyDesign]]]) + val originalStudyDesignId = fields + .get("originalStudyDesignId") + .flatMap(_.convertTo[Option[String]]) + val isPartner = fields + .get("isPartner") + .map(_.convertTo[Boolean]) + .getOrElse(deserializationError(s"Trial create json object does not contain `isPartner` field: $json")) + val overview = fields + .get("overview") + .flatMap(_.convertTo[Option[String]]) + val overviewTemplate = fields + .get("overviewTemplate") + .map(_.convertTo[String]) + .getOrElse( + deserializationError(s"Trial create json object does not contain `overviewTemplate` field: $json")) + val isUpdated = fields + .get("isUpdated") + .map(_.convertTo[Boolean]) + .getOrElse(deserializationError(s"Trial create json object does not contain `isUpdated` field: $json")) + val title = fields + .get("title") + .map(_.convertTo[String]) + .getOrElse(deserializationError(s"Trial create json object does not contain `title` field: $json")) + val originalTitle = fields + .get("originalTitle") + .map(_.convertTo[String]) + .getOrElse(deserializationError(s"Trial create json object does not contain `originalTitle` field: $json")) + + Trial( + id, + externalid, + status, + assignee, + previousStatus, + previousAssignee, + lastActiveUser, + lastUpdate, + phase, + hypothesisId, + studyDesignId, + originalStudyDesignId, + isPartner, + overview, + overviewTemplate, + isUpdated, + title, + originalTitle + ) + + case _ => deserializationError(s"Expected Json Object as Trial, but got $json") + } + } } def applyUpdateToTrial(json: JsValue, orig: Trial): Trial = json match { |