aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientcriterion.scala
blob: 035310b8aa74b081e865cb3e4713f2fc3fb6819c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package xyz.driver.pdsuidomain.formats.json

import spray.json._
import xyz.driver.entities.labels.{Label, LabelValue}
import xyz.driver.formats.json.labels._
import xyz.driver.pdsuicommon.domain.LongId
import xyz.driver.pdsuidomain.entities._

object patientcriterion {
  import DefaultJsonProtocol._
  import common._

  def applyUpdateToPatientCriterion(json: JsValue, orig: PatientCriterion): PatientCriterion = json match {
    case JsObject(fields) =>
      val eligibilityStatus = fields
        .get("eligibilityStatus")
        .map(_.convertTo[LabelValue])
        .getOrElse(orig.eligibilityStatus)

      val verifiedEligibilityStatus = fields
        .get("verifiedEligibilityStatus")
        .map(_.convertTo[LabelValue])
        .getOrElse(orig.verifiedEligibilityStatus)

      orig.copy(
        eligibilityStatus = eligibilityStatus,
        verifiedEligibilityStatus = verifiedEligibilityStatus
      )

    case _ => deserializationError(s"Expected Json Object as partial PatientCriterion, but got $json")
  }

  implicit val draftPatientCriterionFormat: RootJsonFormat[DraftPatientCriterion] = jsonFormat3(
    DraftPatientCriterion.apply)
  implicit val draftPatientCriterionListReader = new JsonReader[List[DraftPatientCriterion]] {
    override def read(json: JsValue) = json.convertTo[List[JsValue]].map(_.convertTo[DraftPatientCriterion])
  }

  implicit val patientCriterionFormat: RootJsonFormat[PatientCriterion]       = jsonFormat14(PatientCriterion.apply)
  implicit val patientCriterionArmFormat: RootJsonFormat[PatientCriterionArm] = jsonFormat3(PatientCriterionArm.apply)

  implicit val richPatientCriterionFormat: RootJsonFormat[RichPatientCriterion] =
    new RootJsonFormat[RichPatientCriterion] {
      override def read(json: JsValue): RichPatientCriterion = {
        val fields  = json.asJsObject.fields
        val labelId = fields.getOrElse("labelId", deserializationError("field 'labelId' is missing"))
        val arms    = fields.getOrElse("armList", deserializationError("field 'arms' is missing"))
        RichPatientCriterion(
          json.convertTo[PatientCriterion],
          labelId.convertTo[LongId[Label]],
          arms.convertTo[List[PatientCriterionArm]]
        )
      }
      override def write(obj: RichPatientCriterion): JsValue = {
        JsObject(
          obj.patientCriterion.toJson.asJsObject.fields ++
            Map(
              "labelId" -> obj.labelId.toJson,
              "armList" -> obj.armList.toJson
            )
        )
      }
    }

}