aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/patientcriterion.scala
blob: 2cad78c868b53ac3d0c232658a2ff4fd42a99486 (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.sprayformats

import spray.json._
import xyz.driver.entities.labels.LabelValue
import xyz.driver.pdsuidomain.entities._
import xyz.driver.pdsuidomain.services.PatientCriterionService.{DraftPatientCriterion, RichPatientCriterion}
import xyz.driver.formats.json.labels._

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[Option[LabelValue]])
        .getOrElse(orig.eligibilityStatus)

      val verifiedEligibilityStatus = fields
        .get("verifiedEligibilityStatus")
        .map(_.convertTo[Option[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 patientCriterionWriter: RootJsonWriter[RichPatientCriterion] =
    new RootJsonWriter[RichPatientCriterion] {
      override def write(obj: RichPatientCriterion): JsValue = {
        JsObject(
          "id"            -> obj.patientCriterion.id.toJson,
          "labelId"       -> obj.labelId.toJson,
          "nctId"         -> obj.patientCriterion.nctId.toJson,
          "criterionId"   -> obj.patientCriterion.criterionId.toJson,
          "criterionText" -> obj.patientCriterion.criterionText.toJson,
          "criterionValue" -> obj.patientCriterion.criterionValue.map {
            case true  => "Yes"
            case false => "No"
          }.toJson,
          "criterionIsDefining"       -> obj.patientCriterion.criterionIsDefining.toJson,
          "criterionIsCompound"       -> obj.patientCriterion.criterionValue.isEmpty.toJson,
          "arms"                      -> obj.armList.map(_.armName).toJson,
          "eligibilityStatus"         -> obj.patientCriterion.eligibilityStatus.toJson,
          "verifiedEligibilityStatus" -> obj.patientCriterion.verifiedEligibilityStatus.toJson,
          "isVerified"                -> obj.patientCriterion.isVerified.toJson,
          "isVisible"                 -> obj.patientCriterion.isVisible.toJson,
          "lastUpdate"                -> obj.patientCriterion.lastUpdate.toJson,
          "inclusion"                 -> obj.patientCriterion.inclusion.toJson
        )
      }
    }

}