From 01170a92bec7e09be89727143b442e4fb78446e7 Mon Sep 17 00:00:00 2001 From: Kseniya Tomskikh Date: Mon, 3 Jul 2017 18:06:35 +0600 Subject: PDSUI-2003 Added arm ids list to PatientCriterion --- .../scala/xyz/driver/pdsuicommon/acl/ACL.scala | 2 +- .../pdsuidomain/entities/PatientCriterion.scala | 69 ++++++++++++++++++++++ .../entities/PatientEligibleTrial.scala | 52 ---------------- .../patient/eligible/ApiPatientEligibleTrial.scala | 2 +- .../json/patient/trial/ApiPatientCriterion.scala | 9 ++- .../services/PatientCriterionService.scala | 10 ++-- .../services/PatientEligibleTrialService.scala | 6 +- 7 files changed, 82 insertions(+), 68 deletions(-) create mode 100644 src/main/scala/xyz/driver/pdsuidomain/entities/PatientCriterion.scala (limited to 'src') diff --git a/src/main/scala/xyz/driver/pdsuicommon/acl/ACL.scala b/src/main/scala/xyz/driver/pdsuicommon/acl/ACL.scala index f201554..6d78ba9 100644 --- a/src/main/scala/xyz/driver/pdsuicommon/acl/ACL.scala +++ b/src/main/scala/xyz/driver/pdsuicommon/acl/ACL.scala @@ -142,7 +142,7 @@ object ACL extends PhiLogging { extends BaseACL( label = "criterion", create = Set(CriteriaCurator, TrialAdmin), - read = Set(CriteriaCurator, TrialAdmin, RoutesCurator, TreatmentMatchingAdmin, ResearchOncologist), + read = Set(CriteriaCurator, TrialAdmin), update = Set(CriteriaCurator, TrialAdmin), delete = Set(CriteriaCurator, TrialAdmin) ) diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/PatientCriterion.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/PatientCriterion.scala new file mode 100644 index 0000000..6c14458 --- /dev/null +++ b/src/main/scala/xyz/driver/pdsuidomain/entities/PatientCriterion.scala @@ -0,0 +1,69 @@ +package xyz.driver.pdsuidomain.entities + +import java.time.LocalDateTime + +import xyz.driver.pdsuicommon.domain.{FuzzyValue, LongId, StringId} +import xyz.driver.pdsuicommon.logging._ + +object PatientCriterion { + implicit def toPhiString(x: PatientCriterion): PhiString = { + import x._ + phi"PatientCriterion(id=$id, patientLabelId=$patientLabelId, trialId=${Unsafe(trialId)}, nctId=${Unsafe(nctId)}, " + + phi"criterionId=$criterionId, criterionValue=${Unsafe(criterionValue)}, " + + phi"isImplicitMatch=$criterionIsDefining), criterionIsDefining=${Unsafe(criterionIsDefining)}, " + + phi"eligibilityStatus=${Unsafe(eligibilityStatus)}, verifiedEligibilityStatus=${Unsafe(verifiedEligibilityStatus)}, " + + phi"isVerified=${Unsafe(isVerified)}, lastUpdate=${Unsafe(lastUpdate)}" + } + + /** + * @see https://driverinc.atlassian.net/wiki/display/MTCH/EV+Business+Process + */ + def getEligibilityStatus(criterionValue: Option[Boolean], primaryValue: Option[FuzzyValue]): Option[FuzzyValue] = { + primaryValue match { + case None => None + case Some(FuzzyValue.Maybe) => Some(FuzzyValue.Maybe) + case Some(_) if criterionValue.isEmpty => Some(FuzzyValue.Maybe) + case Some(status) => + Some( + FuzzyValue.fromBoolean( + FuzzyValue.fromBoolean( + criterionValue.getOrElse(throw new IllegalArgumentException("Criterion should not be empty"))) == status + )) + } + } + +} + +/** + * @param eligibilityStatus - a value, that selects an eligibility verifier (EV) + * @param verifiedEligibilityStatus - a copy of eligibilityStatus, when a patient goes to routes curator (RC) + * @param isVerified - is EV selected the eligibilityStatus? + */ +final case class PatientCriterion(id: LongId[PatientCriterion], + patientLabelId: LongId[PatientLabel], + trialId: Long, + nctId: StringId[Trial], + criterionId: LongId[Criterion], + criterionText: String, + criterionValue: Option[Boolean], + criterionIsDefining: Boolean, + eligibilityStatus: Option[FuzzyValue], + verifiedEligibilityStatus: Option[FuzzyValue], + isVerified: Boolean, + isVisible: Boolean, + lastUpdate: LocalDateTime) { + def isIneligibleForEv: Boolean = eligibilityStatus.contains(FuzzyValue.No) && isVerified +} + +object PatientCriterionArm { + + implicit def toPhiString(x: PatientCriterionArm): PhiString = { + import x._ + phi"PatientCriterionArm(patientCriterionId=$patientCriterionId, armId=$armId, armName=${Unsafe(armName)})" + } + +} + +final case class PatientCriterionArm(patientCriterionId: LongId[PatientCriterion], + armId: LongId[Arm], + armName: String) diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/PatientEligibleTrial.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/PatientEligibleTrial.scala index e16c324..8ee5b3c 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/entities/PatientEligibleTrial.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/entities/PatientEligibleTrial.scala @@ -1,60 +1,8 @@ package xyz.driver.pdsuidomain.entities -import java.time.LocalDateTime - import xyz.driver.pdsuicommon.domain.{FuzzyValue, LongId, StringId, UuidId} import xyz.driver.pdsuicommon.logging._ -object PatientCriterion { - implicit def toPhiString(x: PatientCriterion): PhiString = { - import x._ - phi"PatientCriterion(id=$id, patientLabelId=$patientLabelId, trialId=${Unsafe(trialId)}, nctId=${Unsafe(nctId)}, " + - phi"criterionId=$criterionId, criterionValue=${Unsafe(criterionValue)}, " + - phi"isImplicitMatch=$criterionIsDefining), criterionIsDefining=${Unsafe(criterionIsDefining)}, " + - phi"eligibilityStatus=${Unsafe(eligibilityStatus)}, verifiedEligibilityStatus=${Unsafe(verifiedEligibilityStatus)}, " + - phi"isVerified=${Unsafe(isVerified)}, lastUpdate=${Unsafe(lastUpdate)}" - } - - /** - * @see https://driverinc.atlassian.net/wiki/display/MTCH/EV+Business+Process - */ - def getEligibilityStatus(criterionValue: Option[Boolean], primaryValue: Option[FuzzyValue]): Option[FuzzyValue] = { - primaryValue match { - case None => None - case Some(FuzzyValue.Maybe) => Some(FuzzyValue.Maybe) - case Some(_) if criterionValue.isEmpty => Some(FuzzyValue.Maybe) - case Some(status) => - Some( - FuzzyValue.fromBoolean( - FuzzyValue.fromBoolean( - criterionValue.getOrElse(throw new IllegalArgumentException("Criterion should not be empty"))) == status - )) - } - } - -} - -/** - * @param eligibilityStatus - a value, that selects an eligibility verifier (EV) - * @param verifiedEligibilityStatus - a copy of eligibilityStatus, when a patient goes to routes curator (RC) - * @param isVerified - is EV selected the eligibilityStatus? - */ -final case class PatientCriterion(id: LongId[PatientCriterion], - patientLabelId: LongId[PatientLabel], - trialId: Long, - nctId: StringId[Trial], - criterionId: LongId[Criterion], - criterionText: String, - criterionValue: Option[Boolean], - criterionIsDefining: Boolean, - eligibilityStatus: Option[FuzzyValue], - verifiedEligibilityStatus: Option[FuzzyValue], - isVerified: Boolean, - isVisible: Boolean, - lastUpdate: LocalDateTime) { - def isIneligibleForEv: Boolean = eligibilityStatus.contains(FuzzyValue.No) && isVerified -} - object PatientTrialArm { implicit def toPhiString(x: PatientTrialArm): PhiString = { diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/eligible/ApiPatientEligibleTrial.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/eligible/ApiPatientEligibleTrial.scala index 033d73e..4136715 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/eligible/ApiPatientEligibleTrial.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patient/eligible/ApiPatientEligibleTrial.scala @@ -43,7 +43,7 @@ object ApiPatientEligibleTrial { patientId = eligibleTrialWithTrial.group.patientId.toString, trialId = eligibleTrialWithTrial.group.trialId.id, trialTitle = eligibleTrialWithTrial.trial.title, - arms = eligibleTrialWithTrial.arms.map(_.name), + arms = eligibleTrialWithTrial.arms.map(_.armName), hypothesisId = eligibleTrialWithTrial.group.hypothesisId.id, eligibleTrialWithTrial.group.verifiedEligibilityStatus.map(FuzzyValue.valueToString), eligibleTrialWithTrial.group.isVerified 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 index 7ac55f6..75347f4 100644 --- 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 @@ -3,7 +3,7 @@ package xyz.driver.pdsuidomain.formats.json.patient.trial import java.time.{ZoneId, ZonedDateTime} import xyz.driver.pdsuicommon.domain.{FuzzyValue, LongId} -import xyz.driver.pdsuidomain.entities.{Arm, Label, PatientCriterion} +import xyz.driver.pdsuidomain.entities.{Label, PatientCriterion, PatientCriterionArm} import play.api.data.validation.ValidationError import play.api.libs.functional.syntax._ import play.api.libs.json.{Format, JsPath, Reads, Writes} @@ -53,8 +53,7 @@ object ApiPatientCriterion { def fromDomain(patientCriterion: PatientCriterion, labelId: LongId[Label], - arms: List[Arm], - criterionIsCompound: Boolean) = ApiPatientCriterion( + arms: List[PatientCriterionArm]) = ApiPatientCriterion( id = patientCriterion.id.id, labelId = labelId.id, nctId = patientCriterion.nctId.id, @@ -64,8 +63,8 @@ object ApiPatientCriterion { FuzzyValue.valueToString(FuzzyValue.fromBoolean(x)) }, criterionIsDefining = patientCriterion.criterionIsDefining, - criterionIsCompound = criterionIsCompound, - arms = arms.map(_.name), + criterionIsCompound = patientCriterion.criterionValue.isEmpty, + arms = arms.map(_.armName), eligibilityStatus = patientCriterion.eligibilityStatus.map(FuzzyValue.valueToString), verifiedEligibilityStatus = patientCriterion.verifiedEligibilityStatus.map(FuzzyValue.valueToString), isVerified = patientCriterion.isVerified, diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/PatientCriterionService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/PatientCriterionService.scala index e23dfc5..5c9aa19 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/services/PatientCriterionService.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/services/PatientCriterionService.scala @@ -40,7 +40,7 @@ object PatientCriterionService { object GetListReply { type Error = GetListReply with DomainError - case class EntityList(xs: Seq[(PatientCriterion, LongId[Label], List[Arm], Boolean)], + case class EntityList(xs: Seq[(PatientCriterion, LongId[Label], List[PatientCriterionArm])], totalFound: Int, lastUpdate: Option[LocalDateTime]) extends GetListReply @@ -59,7 +59,7 @@ object PatientCriterionService { object GetByIdReply { type Error = GetByIdReply with DomainError - case class Entity(x: PatientCriterion, labelId: LongId[Label], armList: List[Arm], criterionIsCompound: Boolean) + case class Entity(x: PatientCriterion, labelId: LongId[Label], armList: List[PatientCriterionArm]) extends GetByIdReply case object AuthorizationError @@ -74,9 +74,7 @@ object PatientCriterionService { implicit def toPhiString(reply: GetByIdReply): PhiString = reply match { case x: DomainError => phi"GetByIdReply.Error($x)" - case Entity(x, labelId, armList, criterionIsCompound) => - phi"GetByIdReply.Entity(entity=$x, labelId=$labelId, " + - phi"armList=$armList, criterionIsCompound=$criterionIsCompound)" + case Entity(x, labelId, armList) => phi"GetByIdReply.Entity(entity=$x, labelId=$labelId, armList=$armList)" } } @@ -84,7 +82,7 @@ object PatientCriterionService { object UpdateReply { type Error = UpdateReply with DomainError - case class Updated(x: PatientCriterion, labelId: LongId[Label], armList: List[Arm], criterionIsCompound: Boolean) + case class Updated(x: PatientCriterion, labelId: LongId[Label], armList: List[PatientCriterionArm]) extends UpdateReply case object UpdatedList extends UpdateReply diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/PatientEligibleTrialService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/PatientEligibleTrialService.scala index d322fdd..12cd4f3 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/services/PatientEligibleTrialService.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/services/PatientEligibleTrialService.scala @@ -5,7 +5,7 @@ import xyz.driver.pdsuicommon.db.{Pagination, SearchFilterExpr, Sorting} import xyz.driver.pdsuicommon.domain.{LongId, UuidId} import xyz.driver.pdsuicommon.error.DomainError import xyz.driver.pdsuicommon.logging._ -import xyz.driver.pdsuidomain.entities.{Arm, Trial, _} +import xyz.driver.pdsuidomain.entities.{Trial, _} import scala.concurrent.Future @@ -23,7 +23,7 @@ object PatientEligibleTrialService { def userMessage: String = "Access denied" } - case class RichPatientEligibleTrial(trial: Trial, group: PatientTrialArmGroupView, arms: List[Arm]) + case class RichPatientEligibleTrial(trial: Trial, group: PatientTrialArmGroupView, arms: List[PatientCriterionArm]) object RichPatientEligibleTrial { implicit def toPhiString(x: RichPatientEligibleTrial): PhiString = { phi"RichPatientEligibleTrial(group=${x.group}, trial=${x.trial}, arms=${x.arms})" @@ -67,7 +67,7 @@ object PatientEligibleTrialService { sealed trait GetCriterionListOfGroupReply object GetCriterionListOfGroupReply { - case class EntityList(xs: Seq[(PatientCriterion, LongId[Label], List[Arm], Boolean)], totalFound: Int) + case class EntityList(xs: Seq[(PatientCriterion, LongId[Label], List[PatientCriterionArm])], totalFound: Int) extends GetCriterionListOfGroupReply type Error = GetCriterionListOfGroupReply with DomainError -- cgit v1.2.3