aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKseniya Tomskikh <ktomskih@datamonsters.co>2017-09-27 15:50:35 +0700
committerKseniya Tomskikh <ktomskih@datamonsters.co>2017-09-27 15:57:47 +0700
commit3a9ba980e6ce08361f6f3cdaf6ab2a401101b35c (patch)
tree19e39abe46b33ab9f0be3731541e77a5df0ce849
parentc0ffb2a34240876c16f9ce62205cf257aa6d5991 (diff)
downloadrest-query-3a9ba980e6ce08361f6f3cdaf6ab2a401101b35c.tar.gz
rest-query-3a9ba980e6ce08361f6f3cdaf6ab2a401101b35c.tar.bz2
rest-query-3a9ba980e6ce08361f6f3cdaf6ab2a401101b35c.zip
PDSUI-2275 Added delivery methods to intervention type entrypoint
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/entities/Intervention.scala140
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiInterventionType.scala18
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/intervention.scala33
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/InterventionFormatSuite.scala6
4 files changed, 188 insertions, 9 deletions
diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/Intervention.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/Intervention.scala
index 5dada55..6dc42d0 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/entities/Intervention.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/entities/Intervention.scala
@@ -2,10 +2,150 @@ package xyz.driver.pdsuidomain.entities
import xyz.driver.pdsuicommon.domain.{LongId, StringId}
import xyz.driver.pdsuicommon.logging._
+import xyz.driver.pdsuidomain.entities.InterventionType.DeliveryMethod._
final case class InterventionType(id: LongId[InterventionType], name: String)
object InterventionType {
+
+ sealed trait InterventionTypeName
+ case object RadiationTherapy extends InterventionTypeName
+ case object Chemotherapy extends InterventionTypeName
+ case object TargetedTherapy extends InterventionTypeName
+ case object Immunotherapy extends InterventionTypeName
+ case object Surgery extends InterventionTypeName
+ case object HormoneTherapy extends InterventionTypeName
+ case object Other extends InterventionTypeName
+ case object Radiation extends InterventionTypeName
+ case object SurgeryProcedure extends InterventionTypeName
+
+ def typeFromString: PartialFunction[String, InterventionTypeName] = {
+ case "Radiation therapy" => RadiationTherapy
+ case "Chemotherapy" => Chemotherapy
+ case "Targeted therapy" => TargetedTherapy
+ case "Immunotherapy" => Immunotherapy
+ case "Surgery" => Surgery
+ case "Hormone therapy" => HormoneTherapy
+ case "Other" => Other
+ case "Radiation" => Radiation
+ case "Surgery/Procedure" => SurgeryProcedure
+ }
+
+ def typeToString(x: InterventionTypeName): String = x match {
+ case RadiationTherapy => "Radiation therapy"
+ case Chemotherapy => "Chemotherapy"
+ case TargetedTherapy => "Targeted therapy"
+ case Immunotherapy => "Immunotherapy"
+ case Surgery => "Surgery"
+ case HormoneTherapy => "Hormone therapy"
+ case Other => "Other"
+ case Radiation => "Radiation"
+ case SurgeryProcedure => "Surgery/Procedure"
+ }
+
+ sealed trait DeliveryMethod
+ object DeliveryMethod {
+ case object IntravenousInfusionIV extends DeliveryMethod
+ case object IntramuscularInjection extends DeliveryMethod
+ case object SubcutaneousInjection extends DeliveryMethod
+ case object IntradermalInjection extends DeliveryMethod
+ case object SpinalInjection extends DeliveryMethod
+ case object Oral extends DeliveryMethod
+ case object Topical extends DeliveryMethod
+ case object TransdermalPatch extends DeliveryMethod
+ case object Inhalation extends DeliveryMethod
+ case object Rectal extends DeliveryMethod
+ case object ExternalRadiationTherapy extends DeliveryMethod
+ case object Brachytherapy extends DeliveryMethod
+ case object SystemicRadiationTherapyIV extends DeliveryMethod
+ case object SystemicRadiationTherapyOral extends DeliveryMethod
+ case object ProtonBeamTherapy extends DeliveryMethod
+ case object RadioFrequencyAblationRFA extends DeliveryMethod
+ case object Cryoablation extends DeliveryMethod
+ case object TherapeuticConventionalSurgery extends DeliveryMethod
+ case object RoboticAssistedLaparoscopicSurgery extends DeliveryMethod
+
+ def fromString: PartialFunction[String, DeliveryMethod] = {
+ case "Intravenous Infusion (IV)" => IntravenousInfusionIV
+ case "Intramuscular Injection" => IntramuscularInjection
+ case "Subcutaneous Injection" => SubcutaneousInjection
+ case "Intradermal Injection" => IntradermalInjection
+ case "Spinal Injection" => SpinalInjection
+ case "Oral" => Oral
+ case "Topical" => Topical
+ case "Transdermal Patch" => TransdermalPatch
+ case "Inhalation" => Inhalation
+ case "Rectal" => Rectal
+ case "External Radiation Therapy" => ExternalRadiationTherapy
+ case "Brachytherapy" => Brachytherapy
+ case "Systemic Radiation Therapy (IV)" => SystemicRadiationTherapyIV
+ case "Systemic Radiation Therapy (Oral)" => SystemicRadiationTherapyOral
+ case "Proton Beam Therapy" => ProtonBeamTherapy
+ case "Radio-Frequency Ablation (RFA)" => RadioFrequencyAblationRFA
+ case "Cryoablation" => Cryoablation
+ case "Therapeutic Conventional Surgery" => TherapeuticConventionalSurgery
+ case "Robotic Assisted Laparoscopic Surgery" => RoboticAssistedLaparoscopicSurgery
+ }
+
+ def methodToString(x: DeliveryMethod): String = x match {
+ case IntravenousInfusionIV => "Intravenous Infusion (IV)"
+ case IntramuscularInjection => "Intramuscular Injection"
+ case SubcutaneousInjection => "Subcutaneous Injection"
+ case IntradermalInjection => "Intradermal Injection"
+ case SpinalInjection => "Spinal Injection"
+ case Oral => "Oral"
+ case Topical => "Topical"
+ case TransdermalPatch => "Transdermal Patch"
+ case Inhalation => "Inhalation"
+ case Rectal => "Rectal"
+ case ExternalRadiationTherapy => "External Radiation Therapy"
+ case Brachytherapy => "Brachytherapy"
+ case SystemicRadiationTherapyIV => "Systemic Radiation Therapy (IV)"
+ case SystemicRadiationTherapyOral => "Systemic Radiation Therapy (Oral)"
+ case ProtonBeamTherapy => "Proton Beam Therapy"
+ case RadioFrequencyAblationRFA => "Radio-Frequency Ablation (RFA)"
+ case Cryoablation => "Cryoablation"
+ case TherapeuticConventionalSurgery => "Therapeutic Conventional Surgery"
+ case RoboticAssistedLaparoscopicSurgery => "Robotic Assisted Laparoscopic Surgery"
+ }
+ }
+
+ val commonMethods = Set[DeliveryMethod](
+ IntravenousInfusionIV,
+ IntramuscularInjection,
+ SubcutaneousInjection,
+ IntradermalInjection,
+ SpinalInjection,
+ Oral,
+ Topical,
+ TransdermalPatch,
+ Inhalation,
+ Rectal
+ )
+
+ val deliveryMethodGroups: Map[LongId[InterventionType], Set[DeliveryMethod]] = Map(
+ LongId(1) -> commonMethods,
+ LongId(2) -> commonMethods,
+ LongId(3) -> commonMethods,
+ LongId(4) -> commonMethods,
+ LongId(5) -> commonMethods,
+ LongId(6) -> commonMethods,
+ LongId(7) -> commonMethods,
+ LongId(8) -> Set(
+ ExternalRadiationTherapy,
+ Brachytherapy,
+ SystemicRadiationTherapyIV,
+ SystemicRadiationTherapyOral,
+ ProtonBeamTherapy
+ ),
+ LongId(9) -> Set(
+ RadioFrequencyAblationRFA,
+ Cryoablation,
+ TherapeuticConventionalSurgery,
+ RoboticAssistedLaparoscopicSurgery
+ )
+ )
+
implicit def toPhiString(x: InterventionType): PhiString = {
import x._
phi"InterventionType(id=$id, name=${Unsafe(name)})"
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiInterventionType.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiInterventionType.scala
index ebef225..c28c5b4 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiInterventionType.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiInterventionType.scala
@@ -4,8 +4,9 @@ import play.api.libs.functional.syntax._
import play.api.libs.json.{Format, JsPath}
import xyz.driver.pdsuicommon.domain.LongId
import xyz.driver.pdsuidomain.entities.InterventionType
+import xyz.driver.pdsuidomain.entities.InterventionType.DeliveryMethod
-final case class ApiInterventionType(id: Long, name: String) {
+final case class ApiInterventionType(id: Long, name: String, deliveryMethods: List[String]) {
def toDomain = InterventionType(id = LongId[InterventionType](id), name = name)
}
@@ -14,11 +15,16 @@ object ApiInterventionType {
implicit val format: Format[ApiInterventionType] = (
(JsPath \ "id").format[Long] and
- (JsPath \ "name").format[String]
+ (JsPath \ "name").format[String] and
+ (JsPath \ "deliveryMethods").format[List[String]]
)(ApiInterventionType.apply, unlift(ApiInterventionType.unapply))
- def fromDomain(interventionType: InterventionType) = ApiInterventionType(
- id = interventionType.id.id,
- name = interventionType.name
- )
+ def fromDomain(interventionType: InterventionType) = {
+ val typeMethods = InterventionType.deliveryMethodGroups.getOrElse(interventionType.id, Set.empty[DeliveryMethod])
+ ApiInterventionType(
+ id = interventionType.id.id,
+ name = interventionType.name,
+ deliveryMethods = typeMethods.map(DeliveryMethod.methodToString).toList
+ )
+ }
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/intervention.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/intervention.scala
index daa28e4..4bd5bad 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/intervention.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/intervention.scala
@@ -2,6 +2,7 @@ package xyz.driver.pdsuidomain.formats.json.sprayformats
import spray.json._
import xyz.driver.pdsuicommon.domain.{LongId, StringId}
+import xyz.driver.pdsuidomain.entities.InterventionType.DeliveryMethod
import xyz.driver.pdsuidomain.entities._
object intervention {
@@ -119,6 +120,36 @@ object intervention {
case _ => deserializationError(s"Expected Json Object as partial Intervention, but got $json")
}
- implicit val interventionTypeFormat: RootJsonFormat[InterventionType] = jsonFormat2(InterventionType.apply)
+ implicit val interventionTypeFormat: JsonFormat[InterventionType] = new RootJsonFormat[InterventionType] {
+ override def read(json: JsValue) = json match {
+ case JsObject(fields) =>
+ val id = fields
+ .get("id")
+ .map(_.convertTo[LongId[InterventionType]])
+ .getOrElse(deserializationError(s"Intervention type json object does not contain `id` field: $json"))
+
+ val name = fields
+ .get("name")
+ .map(_.convertTo[String])
+ .getOrElse(deserializationError(s"Intervention type json object does not contain `name` field: $json"))
+
+ InterventionType(id, name)
+
+ case _ => deserializationError(s"Expected Json Object as Intervention type, but got $json")
+ }
+
+ override def write(obj: InterventionType) = {
+ val typeMethods = InterventionType.deliveryMethodGroups
+ .getOrElse(obj.id, Set.empty[DeliveryMethod])
+ .map(DeliveryMethod.methodToString)
+ .toList
+
+ JsObject(
+ "id" -> obj.id.toJson,
+ "name" -> obj.name.toJson,
+ "deliveryMethods" -> typeMethods.toJson
+ )
+ }
+ }
}
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/InterventionFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/InterventionFormatSuite.scala
index ebb5f3d..d406162 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/InterventionFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/InterventionFormatSuite.scala
@@ -60,12 +60,14 @@ class InterventionFormatSuite extends FlatSpec with Matchers {
"Json format for InterventionType" should "read and write correct JSON" in {
val interventionType = InterventionType(
- id = LongId(10),
+ id = LongId(9),
name = "type name"
)
val writtenJson = interventionTypeFormat.write(interventionType)
- writtenJson should be("""{"id":10,"name":"type name"}""".parseJson)
+ writtenJson should be(
+ """{"id":9,"name":"type name","deliveryMethods":["Radio-Frequency Ablation (RFA)",
+ "Cryoablation","Therapeutic Conventional Surgery","Robotic Assisted Laparoscopic Surgery"]}""".parseJson)
val parsedInterventionType = interventionTypeFormat.read(writtenJson)
parsedInterventionType should be(interventionType)