From d52bcb362be0d5a4ff87db8759b8d83b2a616323 Mon Sep 17 00:00:00 2001 From: Kseniya Tomskikh Date: Tue, 28 Nov 2017 10:40:41 +0700 Subject: PDSUI-2407 Removed unnecessary records' statuses --- src/main/scala/xyz/driver/pdsuidomain/formats/json/record.scala | 5 ----- 1 file changed, 5 deletions(-) (limited to 'src/main/scala/xyz/driver/pdsuidomain/formats') diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/record.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/record.scala index cbe4951..d3fe2c9 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/record.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/record.scala @@ -16,13 +16,8 @@ object record { import common._ implicit val recordStatusFormat: EnumJsonFormat[Status] = new EnumJsonFormat[Status]( - "PreCleaning" -> Status.PreCleaning, - "Unprocessed" -> Status.Unprocessed, - "PreOrganized" -> Status.PreOrganized, "New" -> Status.New, "Cleaned" -> Status.Cleaned, - "PreOrganized" -> Status.PreOrganized, - "PreOrganizing" -> Status.PreOrganizing, "Reviewed" -> Status.Reviewed, "Organized" -> Status.Organized, "Done" -> Status.Done, -- cgit v1.2.3 From 3f0aff9110ba1708b46dd916b196a4a7c25f9466 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Mon, 27 Nov 2017 21:48:11 -0800 Subject: Revert "Nest format" This reverts commit 5c50fd8f9eb4588e8f2c7ea5b84822e224b222e5. --- .../xyz/driver/pdsuidomain/formats/json/patienteligibletrial.scala | 5 +++-- .../pdsuidomain/formats/json/PatientEligibleTrialFormatSuite.scala | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) (limited to 'src/main/scala/xyz/driver/pdsuidomain/formats') diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienteligibletrial.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienteligibletrial.scala index f21b0cb..11253fc 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienteligibletrial.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienteligibletrial.scala @@ -14,8 +14,9 @@ object patienteligibletrial { def applyUpdateToTrialArmGroup(json: JsValue, orig: PatientTrialArmGroupView): PatientTrialArmGroupView = json match { case JsObject(fields) => - val isVerified = fields.get("group").map(_.asJsObject) - .flatMap(_.fields.get("isVerified")).map(_.convertTo[Boolean]) + val isVerified = fields + .get("isVerified") + .map(_.convertTo[Boolean]) .getOrElse(orig.isVerified) orig.copy(isVerified = isVerified) diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientEligibleTrialFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientEligibleTrialFormatSuite.scala index 9695c2d..0a83c62 100644 --- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientEligibleTrialFormatSuite.scala +++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientEligibleTrialFormatSuite.scala @@ -59,7 +59,7 @@ class PatientEligibleTrialFormatSuite extends FlatSpec with Matchers { "verifiedEligibilityStatus":"Yes","trialId":"NCT000001","eligibilityStatus":"Yes","id":1}, "arms":[{"patientCriterionId":1,"armId":31,"armName":"arm 31"},{"patientCriterionId":1,"armId":32,"armName":"arm 32"}]}""".parseJson) - val updatePatientEligibleTrialJson = """{"group":{"isVerified":true}}""".parseJson + val updatePatientEligibleTrialJson = """{"isVerified":true}""".parseJson val expectedUpdatedPatientTrialArmGroup = group.copy(isVerified = true) val parsedUpdatePatientTrialArmGroup = applyUpdateToTrialArmGroup(updatePatientEligibleTrialJson, group) parsedUpdatePatientTrialArmGroup should be(expectedUpdatedPatientTrialArmGroup) -- cgit v1.2.3 From 4a657a974815a5e6de56808d818efc84164c3956 Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Mon, 27 Nov 2017 21:49:32 -0800 Subject: Revert 'Add formats for patient eligible trials' --- .../utils/CustomSwaggerJsonFormats.scala | 2 +- .../formats/json/patienteligibletrial.scala | 21 ++++-- .../rest/RestPatientEligibleTrialService.scala | 84 ---------------------- .../json/PatientEligibleTrialFormatSuite.scala | 12 +--- 4 files changed, 18 insertions(+), 101 deletions(-) delete mode 100644 src/main/scala/xyz/driver/pdsuidomain/services/rest/RestPatientEligibleTrialService.scala (limited to 'src/main/scala/xyz/driver/pdsuidomain/formats') diff --git a/src/main/scala/xyz/driver/pdsuicommon/utils/CustomSwaggerJsonFormats.scala b/src/main/scala/xyz/driver/pdsuicommon/utils/CustomSwaggerJsonFormats.scala index 62c9690..f617a20 100644 --- a/src/main/scala/xyz/driver/pdsuicommon/utils/CustomSwaggerJsonFormats.scala +++ b/src/main/scala/xyz/driver/pdsuicommon/utils/CustomSwaggerJsonFormats.scala @@ -197,7 +197,7 @@ object CustomSwaggerJsonFormats { classOf[RichPatientCriterion] -> richPatientCriterionFormat.write(nextRichPatientCriterion()), classOf[DraftPatientCriterion] -> draftPatientCriterionFormat.write(nextDraftPatientCriterion()), classOf[PatientLabelEvidenceView] -> patientLabelEvidenceWriter.write(nextPatientLabelEvidenceView()), - classOf[RichPatientEligibleTrial] -> patientEligibleTrialFormat.write(nextRichPatientEligibleTrial()), + classOf[RichPatientEligibleTrial] -> patientEligibleTrialWriter.write(nextRichPatientEligibleTrial()), classOf[PatientHypothesis] -> patientHypothesisWriter.write(nextPatientHypothesis()), classOf[PatientHistory] -> patientHistoryFormat.write(nextPatientHistory()), classOf[PatientIssue] -> patientIssueWriter.write(nextPatientIssue()), diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienteligibletrial.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienteligibletrial.scala index 11253fc..4c006f9 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienteligibletrial.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patienteligibletrial.scala @@ -8,8 +8,6 @@ import xyz.driver.pdsuidomain.services.PatientEligibleTrialService.RichPatientEl object patienteligibletrial { import DefaultJsonProtocol._ import common._ - import xyz.driver.pdsuidomain.formats.json.trial._ - import xyz.driver.pdsuidomain.formats.json.patientcriterion._ def applyUpdateToTrialArmGroup(json: JsValue, orig: PatientTrialArmGroupView): PatientTrialArmGroupView = json match { @@ -24,10 +22,19 @@ object patienteligibletrial { case _ => deserializationError(s"Expected Json Object as partial PatientTrialArmGroupView, but got $json") } - implicit val patientEligibleArmGroupView: RootJsonFormat[PatientTrialArmGroupView] = - jsonFormat7(PatientTrialArmGroupView.apply) - - implicit val patientEligibleTrialFormat: RootJsonFormat[RichPatientEligibleTrial] = - jsonFormat3(RichPatientEligibleTrial.apply) + implicit val patientEligibleTrialWriter: RootJsonWriter[RichPatientEligibleTrial] = + new RootJsonWriter[RichPatientEligibleTrial] { + override def write(obj: RichPatientEligibleTrial) = + JsObject( + "id" -> obj.group.id.toJson, + "patientId" -> obj.group.patientId.toJson, + "trialId" -> obj.group.trialId.toJson, + "trialTitle" -> obj.trial.title.toJson, + "arms" -> obj.arms.map(_.armName).toJson, + "hypothesisId" -> obj.trial.hypothesisId.toJson, + "verifiedEligibilityStatus" -> obj.group.verifiedEligibilityStatus.toJson, + "isVerified" -> obj.group.isVerified.toJson + ) + } } diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestPatientEligibleTrialService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestPatientEligibleTrialService.scala deleted file mode 100644 index 210e7c1..0000000 --- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestPatientEligibleTrialService.scala +++ /dev/null @@ -1,84 +0,0 @@ -package xyz.driver.pdsuidomain.services.rest - -import akka.http.scaladsl.marshalling.Marshal -import akka.http.scaladsl.model._ -import akka.stream.Materializer -import xyz.driver.core.rest.{Pagination => _, _} -import xyz.driver.entities.users.AuthUserInfo -import xyz.driver.pdsuicommon.db._ -import xyz.driver.pdsuicommon.domain._ -import xyz.driver.pdsuidomain.ListResponse -import xyz.driver.pdsuidomain.entities._ -import xyz.driver.pdsuidomain.services.PatientCriterionService.RichPatientCriterion -import xyz.driver.pdsuidomain.services.PatientEligibleTrialService - -import scala.concurrent.{ExecutionContext, Future} - -class RestPatientEligibleTrialService(transport: ServiceTransport, baseUri: Uri)( - implicit protected val materializer: Materializer, - protected val exec: ExecutionContext) - extends PatientEligibleTrialService with RestHelper { - - import PatientEligibleTrialService._ - import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._ - import xyz.driver.pdsuidomain.formats.json.listresponse._ - import xyz.driver.pdsuidomain.formats.json.patientcriterion._ - import xyz.driver.pdsuidomain.formats.json.patienteligibletrial._ - - def getAll(patientId: UuidId[Patient], - filter: SearchFilterExpr = SearchFilterExpr.Empty, - sorting: Option[Sorting] = None, - pagination: Option[Pagination] = None)( - implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[GetListReply] = { - val request = HttpRequest(HttpMethods.GET, - endpointUri(baseUri, - s"/v1/patient/$patientId/trial", - filterQuery(filter) ++ sortingQuery(sorting) ++ paginationQuery(pagination))) - for { - response <- transport.sendRequestGetResponse(requestContext)(request) - reply <- apiResponse[ListResponse[RichPatientEligibleTrial]](response) - } yield { - GetListReply.EntityList(reply.items, reply.meta.itemsCount) - } - } - - - def getById(patientId: UuidId[Patient], id: LongId[PatientTrialArmGroup])( - implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[GetByIdReply] = { - val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/patient/$patientId/trial/$id")) - for { - response <- transport.sendRequestGetResponse(requestContext)(request) - reply <- apiResponse[RichPatientEligibleTrial](response) - } yield { - GetByIdReply.Entity(reply) - } - } - - def getCriterionListByGroupId(patientId: UuidId[Patient], id: LongId[PatientTrialArmGroup])( - implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[GetCriterionListOfGroupReply] = { - val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/patient/$patientId/trial/$id/criterion")) - for { - response <- transport.sendRequestGetResponse(requestContext)(request) - reply <- apiResponse[ListResponse[RichPatientCriterion]](response) - } yield { - GetCriterionListOfGroupReply.EntityList(reply.items, reply.meta.itemsCount) - } - } - - def update(origEligibleTrialWithTrial: RichPatientEligibleTrial, - draftPatientTrialArmGroup: PatientTrialArmGroupView)( - implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[UpdateReply] = { - for { - entity <- Marshal(draftPatientTrialArmGroup).to[RequestEntity] - request = HttpRequest( - HttpMethods.PATCH, - endpointUri(baseUri, s"/v1/patient/${origEligibleTrialWithTrial.group.patientId}/trial/${origEligibleTrialWithTrial.trial.id}")) - .withEntity(entity) - response <- transport.sendRequestGetResponse(requestContext)(request) - reply <- apiResponse[RichPatientEligibleTrial](response) - } yield { - UpdateReply.Updated(reply) - } - } - -} diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientEligibleTrialFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientEligibleTrialFormatSuite.scala index 0a83c62..faef0f6 100644 --- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientEligibleTrialFormatSuite.scala +++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientEligibleTrialFormatSuite.scala @@ -47,17 +47,11 @@ class PatientEligibleTrialFormatSuite extends FlatSpec with Matchers { PatientCriterionArm(patientCriterionId = LongId(1), armId = LongId(32), armName = "arm 32") ) val orig = RichPatientEligibleTrial(trial, group, arms) - val writtenJson = patientEligibleTrialFormat.write(orig) + val writtenJson = patientEligibleTrialWriter.write(orig) writtenJson should be( - """{"trial":{"isPartner":false,"assignee":null,"lastUpdate":"2017-08-10T18:16:19Z","previousStatus":null, - "isUpdated":false,"overviewTemplate":"","phase":"","originalStudyDesignId":null, - "hypothesisId":"e76e2fc4-a29c-44fb-a81b-8856d06bb1d4","originalTitle":"orig trial title","studyDesignId":321, - "lastActiveUser":null,"externalid":"40892a07-c638-49d2-9795-1edfefbbcc7c","id":"NCT000001","status":"Done", - "overview":null,"previousAssignee":null,"title":"trial title"},"group":{"isVerified":false - ,"patientId":"748b5884-3528-4cb9-904b-7a8151d6e343","hypothesisId":"e76e2fc4-a29c-44fb-a81b-8856d06bb1d4", - "verifiedEligibilityStatus":"Yes","trialId":"NCT000001","eligibilityStatus":"Yes","id":1}, - "arms":[{"patientCriterionId":1,"armId":31,"armName":"arm 31"},{"patientCriterionId":1,"armId":32,"armName":"arm 32"}]}""".parseJson) + """{"id":1,"patientId":"748b5884-3528-4cb9-904b-7a8151d6e343","trialId":"NCT000001","trialTitle":"trial title", + "hypothesisId":"e76e2fc4-a29c-44fb-a81b-8856d06bb1d4","verifiedEligibilityStatus":"Yes","isVerified":false,"arms":["arm 31","arm 32"]}""".parseJson) val updatePatientEligibleTrialJson = """{"isVerified":true}""".parseJson val expectedUpdatedPatientTrialArmGroup = group.copy(isVerified = true) -- cgit v1.2.3 From 6f82d4450ad9657a59059d4810203d2f0ba28eeb Mon Sep 17 00:00:00 2001 From: Kseniya Tomskikh Date: Tue, 28 Nov 2017 15:07:12 +0700 Subject: TRIAL-149 Added more states for trial history --- .../driver/pdsuidomain/entities/TrialHistory.scala | 29 ++++++++++++---------- .../pdsuidomain/formats/json/trialhistory.scala | 9 ++++--- 2 files changed, 21 insertions(+), 17 deletions(-) (limited to 'src/main/scala/xyz/driver/pdsuidomain/formats') diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/TrialHistory.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/TrialHistory.scala index cc96cbd..7aa75fb 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/entities/TrialHistory.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/entities/TrialHistory.scala @@ -17,25 +17,28 @@ object TrialHistory { sealed trait State object State { - case object Summarize extends State - case object Criteriarize extends State - case object Review extends State - case object Flag extends State + case object Summarize extends State + case object Criteriarize extends State + case object ReviewSummary extends State + case object ReviewCriteria extends State + case object Flag extends State - val All: Set[State] = Set[State](Summarize, Criteriarize, Review, Flag) + val All: Set[State] = Set[State](Summarize, Criteriarize, ReviewSummary, ReviewCriteria, Flag) val fromString: PartialFunction[String, State] = { - case "Summarize" => State.Summarize - case "Criteriarize" => State.Criteriarize - case "Review" => State.Review - case "Flag" => State.Flag + case "Summarize" => State.Summarize + case "Criteriarize" => State.Criteriarize + case "ReviewSummary" => State.ReviewSummary + case "ReviewCriteria" => State.ReviewCriteria + case "Flag" => State.Flag } def stateToString(x: State): String = x match { - case State.Summarize => "Summarize" - case State.Criteriarize => "Criteriarize" - case State.Review => "Review" - case State.Flag => "Flag" + case State.Summarize => "Summarize" + case State.Criteriarize => "Criteriarize" + case State.ReviewSummary => "ReviewSummary" + case State.ReviewCriteria => "ReviewCriteria" + case State.Flag => "Flag" } implicit def toPhiString(x: State): PhiString = diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialhistory.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialhistory.scala index c8df1d8..f6c5eea 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialhistory.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialhistory.scala @@ -10,10 +10,11 @@ object trialhistory { import common._ implicit val trialStateFormat = new EnumJsonFormat[State]( - "Summarize" -> State.Summarize, - "Criteriarize" -> State.Criteriarize, - "Review" -> State.Review, - "Flag" -> State.Flag + "Summarize" -> State.Summarize, + "Criteriarize" -> State.Criteriarize, + "ReviewSummary" -> State.ReviewSummary, + "ReviewCriteria" -> State.ReviewCriteria, + "Flag" -> State.Flag ) implicit val trialActionFormat = new EnumJsonFormat[Action]( -- cgit v1.2.3 From 4cc495d47288202c19f7f921a1b7bb545fb54260 Mon Sep 17 00:00:00 2001 From: Kseniya Tomskikh Date: Wed, 29 Nov 2017 08:42:28 +0700 Subject: TRIAL-149 Added 'Review' state --- src/main/scala/xyz/driver/pdsuidomain/entities/TrialHistory.scala | 5 ++++- .../scala/xyz/driver/pdsuidomain/formats/json/trialhistory.scala | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) (limited to 'src/main/scala/xyz/driver/pdsuidomain/formats') diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/TrialHistory.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/TrialHistory.scala index 7aa75fb..9210742 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/entities/TrialHistory.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/entities/TrialHistory.scala @@ -19,15 +19,17 @@ object TrialHistory { object State { case object Summarize extends State case object Criteriarize extends State + case object Review extends State case object ReviewSummary extends State case object ReviewCriteria extends State case object Flag extends State - val All: Set[State] = Set[State](Summarize, Criteriarize, ReviewSummary, ReviewCriteria, Flag) + val All: Set[State] = Set[State](Summarize, Criteriarize, Review, ReviewSummary, ReviewCriteria, Flag) val fromString: PartialFunction[String, State] = { case "Summarize" => State.Summarize case "Criteriarize" => State.Criteriarize + case "Review" => State.Review case "ReviewSummary" => State.ReviewSummary case "ReviewCriteria" => State.ReviewCriteria case "Flag" => State.Flag @@ -36,6 +38,7 @@ object TrialHistory { def stateToString(x: State): String = x match { case State.Summarize => "Summarize" case State.Criteriarize => "Criteriarize" + case State.Review => "Review" case State.ReviewSummary => "ReviewSummary" case State.ReviewCriteria => "ReviewCriteria" case State.Flag => "Flag" diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialhistory.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialhistory.scala index f6c5eea..f71ec12 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialhistory.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialhistory.scala @@ -12,6 +12,7 @@ object trialhistory { implicit val trialStateFormat = new EnumJsonFormat[State]( "Summarize" -> State.Summarize, "Criteriarize" -> State.Criteriarize, + "Review" -> State.Review, "ReviewSummary" -> State.ReviewSummary, "ReviewCriteria" -> State.ReviewCriteria, "Flag" -> State.Flag -- cgit v1.2.3 From 449d0da264c50a7271dec0a421d7c8f375808aeb Mon Sep 17 00:00:00 2001 From: Jakob Odersky Date: Tue, 21 Nov 2017 22:41:51 -0800 Subject: Add eligibility service endpoint and supporting domain model --- .../driver/pdsuidomain/entities/eligibility.scala | 5 ++++ .../pdsuidomain/formats/json/eligibility.scala | 5 ++++ .../services/EligibilitySnapshotService.scala | 16 ++++++++++ .../services/PatientEligibleTrialService.scala | 10 +++---- .../rest/RestEligibilitySnapshotService.scala | 35 ++++++++++++++++++++++ 5 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 src/main/scala/xyz/driver/pdsuidomain/services/EligibilitySnapshotService.scala create mode 100644 src/main/scala/xyz/driver/pdsuidomain/services/rest/RestEligibilitySnapshotService.scala (limited to 'src/main/scala/xyz/driver/pdsuidomain/formats') diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/eligibility.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/eligibility.scala index 1a900ac..9362a0c 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/entities/eligibility.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/entities/eligibility.scala @@ -60,4 +60,9 @@ object eligibility { orderId: Id[TestOrder], disease: CancerType, patientDataStatus: ProcessStepExecutionStatus) + + final case class EligibleTrial(nctId: String, arms: Seq[EligibleArm]) + final case class EligibleArm(title: String, criteria: Seq[EligibleCriterion]) + final case class EligibleCriterion(text: String, eligibilityStatus: LabelValue) + } diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibility.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibility.scala index 571cbde..925ba65 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibility.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/eligibility.scala @@ -100,4 +100,9 @@ object eligibility { implicit def labelRankingsFormat: RootJsonFormat[MismatchRankedLabels] = jsonFormat2(MismatchRankedLabels) implicit def matchedPatientFormat: RootJsonFormat[MatchedPatient] = jsonFormat6(MatchedPatient) + + implicit lazy val eligibleTrialFormat: RootJsonFormat[EligibleTrial] = jsonFormat2(EligibleTrial.apply) + implicit lazy val eligibleArmFormat: RootJsonFormat[EligibleArm] = jsonFormat2(EligibleArm.apply) + implicit lazy val eligibleCriterionFormat: RootJsonFormat[EligibleCriterion] = jsonFormat2(EligibleCriterion.apply) + } diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/EligibilitySnapshotService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/EligibilitySnapshotService.scala new file mode 100644 index 0000000..b3e6673 --- /dev/null +++ b/src/main/scala/xyz/driver/pdsuidomain/services/EligibilitySnapshotService.scala @@ -0,0 +1,16 @@ +package xyz.driver.pdsuidomain.services + +import xyz.driver.core.rest.AuthorizedServiceRequestContext +import xyz.driver.entities.users.AuthUserInfo +import xyz.driver.pdsuicommon.domain.UuidId +import xyz.driver.pdsuidomain.entities.{Patient => PdsuiPatient} +import xyz.driver.pdsuidomain.entities.eligibility.EligibleTrial + +import scala.concurrent.Future + +trait EligibilitySnapshotService { + + def eligibilitySnapshot(patientId: UuidId[PdsuiPatient])( + implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[Seq[EligibleTrial]] + +} diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/PatientEligibleTrialService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/PatientEligibleTrialService.scala index f07f6fa..8d1288a 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/services/PatientEligibleTrialService.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/services/PatientEligibleTrialService.scala @@ -96,11 +96,9 @@ object PatientEligibleTrialService { case object NotFoundError extends UpdateReply with DefaultNotFoundError with DomainError.NotFoundError - case object PatientNotFoundError - extends UpdateReply with DefaultPatientNotFoundError with DomainError.NotFoundError + case object PatientNotFoundError extends UpdateReply with DefaultPatientNotFoundError with DomainError.NotFoundError - case object AuthorizationError - extends UpdateReply with DomainError.AuthorizationError with DefaultAccessDeniedError + case object AuthorizationError extends UpdateReply with DomainError.AuthorizationError with DefaultAccessDeniedError final case class CommonError(userMessage: String) extends UpdateReply with DomainError @@ -127,7 +125,7 @@ trait PatientEligibleTrialService { def getCriterionListByGroupId(patientId: UuidId[Patient], id: LongId[PatientTrialArmGroup])( implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[GetCriterionListOfGroupReply] - def update(origEligibleTrialWithTrial: RichPatientEligibleTrial, - draftPatientTrialArmGroup: PatientTrialArmGroupView)( + def update(origEligibleTrialWithTrial: RichPatientEligibleTrial, draftPatientTrialArmGroup: PatientTrialArmGroupView)( implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[UpdateReply] + } diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestEligibilitySnapshotService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestEligibilitySnapshotService.scala new file mode 100644 index 0000000..8754165 --- /dev/null +++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestEligibilitySnapshotService.scala @@ -0,0 +1,35 @@ +package xyz.driver.pdsuidomain.services.rest + +import akka.http.scaladsl.model.{HttpMethods, HttpRequest, Uri} +import akka.stream.Materializer +import xyz.driver.core.rest.{AuthorizedServiceRequestContext, ServiceTransport} +import xyz.driver.entities.users +import xyz.driver.entities.users.AuthUserInfo +import xyz.driver.pdsuicommon.domain.UuidId +import xyz.driver.pdsuidomain.entities.eligibility.EligibleTrial +import xyz.driver.pdsuidomain.entities.{Patient, eligibility} +import xyz.driver.pdsuidomain.services.EligibilitySnapshotService + +import scala.concurrent.{ExecutionContext, Future} + +class RestEligibilitySnapshotService(transport: ServiceTransport, baseUrl: Uri)( + implicit protected val materializer: Materializer, + protected val exec: ExecutionContext) extends EligibilitySnapshotService with RestHelper { + + import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._ + import spray.json.DefaultJsonProtocol._ + import xyz.driver.pdsuidomain.formats.json.eligibility._ + + override def eligibilitySnapshot(patientId: UuidId[Patient]) + (implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): + Future[Seq[eligibility.EligibleTrial]] = { + val request = HttpRequest(HttpMethods.GET, endpointUri(baseUrl, s"/v1/patient/$patientId/eligibilitySnapshot")) + for { + response <- transport.sendRequestGetResponse(requestContext)(request) + reply <- apiResponse[Seq[EligibleTrial]](response) + } yield { + reply + } + } + +} -- cgit v1.2.3 From d863fdba13bb838978321ef2d4b94473458f970a Mon Sep 17 00:00:00 2001 From: Aleksandr Date: Mon, 4 Dec 2017 17:44:14 +0700 Subject: Implemented RestTrialIssueService; implemented read format for trial issue --- .../pdsuidomain/formats/json/trialissue.scala | 88 ++++++++++++++++-- .../services/rest/RestTrialIssueService.scala | 102 +++++++++++++++++++++ .../formats/json/TrialIssueFormatSuite.scala | 1 + 3 files changed, 183 insertions(+), 8 deletions(-) create mode 100644 src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala (limited to 'src/main/scala/xyz/driver/pdsuidomain/formats') diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala index f9bb0b6..dea5441 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala @@ -2,16 +2,26 @@ package xyz.driver.pdsuidomain.formats.json import java.time.LocalDateTime -import spray.json._ +import spray.json.{RootJsonReader, _} +import xyz.driver.core.{Id, auth} import xyz.driver.core.auth.User import xyz.driver.core.json._ import xyz.driver.pdsuicommon.domain.{LongId, StringId} import xyz.driver.pdsuidomain.entities._ object trialissue { + import DefaultJsonProtocol._ import common._ + private def deserializationErrorFieldMessage(field: String, json: JsValue)(implicit className: String) = { + deserializationError(s"$className json object do not contain '$field' field: $json") + } + + private def deserializationErrorEntityMessage(json: JsValue)(implicit className: String) = { + deserializationError(s"Expected Json Object as $className, but got $json") + } + def applyUpdateToTrialIssue(json: JsValue, orig: TrialIssue): TrialIssue = { json.asJsObject.getFields("text", "evidence", "archiveRequired", "meta") match { case Seq(text, evidence, archiveRequired, meta) => @@ -48,15 +58,77 @@ object trialissue { implicit val trialIssueWriter = new RootJsonWriter[TrialIssue] { override def write(obj: TrialIssue) = JsObject( - "id" -> obj.id.toJson, - "text" -> obj.text.toJson, - "lastUpdate" -> obj.lastUpdate.toJson, - "userId" -> obj.userId.toJson, - "isDraft" -> obj.isDraft.toJson, - "evidence" -> obj.evidence.toJson, + "id" -> obj.id.toJson, + "text" -> obj.text.toJson, + "lastUpdate" -> obj.lastUpdate.toJson, + "userId" -> obj.userId.toJson, + "isDraft" -> obj.isDraft.toJson, + "evidence" -> obj.evidence.toJson, "archiveRequired" -> obj.archiveRequired.toJson, - "meta" -> obj.meta.toJson + "meta" -> obj.meta.toJson ) } + implicit def trialIssueReader(trialId: StringId[Trial]): RootJsonReader[TrialIssue] = + new RootJsonReader[TrialIssue] { + implicit val className: String = "TrialIssue" + + override def read(json: JsValue): TrialIssue = json match { + case JsObject(fields) => + val id = fields + .get("id") + .map(_.convertTo[LongId[TrialIssue]]) + .getOrElse(deserializationErrorFieldMessage("id", json)) + + val text = fields + .get("text") + .map(_.convertTo[String]) + .getOrElse(deserializationErrorFieldMessage("text", json)) + + val lastUpdate = fields + .get("lastUpdate") + .map(_.convertTo[LocalDateTime]) + .getOrElse(deserializationErrorFieldMessage("lastUpdate", json)) + + val userId = fields + .get("userId") + .map(_.convertTo[Id[auth.User]]) + .getOrElse(deserializationErrorFieldMessage("userId", json)) + + val isDraft = fields + .get("isDraft") + .map(_.convertTo[Boolean]) + .getOrElse(deserializationErrorFieldMessage("isDraft", json)) + + val evidence = fields + .get("evidence") + .map(_.convertTo[String]) + .getOrElse(deserializationErrorFieldMessage("evidence", json)) + + val archiveRequired = fields + .get("archiveRequired") + .map(_.convertTo[Boolean]) + .getOrElse(deserializationErrorFieldMessage("archiveRequired", json)) + + val meta = fields + .get("meta") + .map(_.convertTo[String]) + .getOrElse(deserializationErrorFieldMessage("meta", json)) + + TrialIssue( + id = id, + userId = userId, + trialId = trialId, + lastUpdate = lastUpdate, + isDraft = isDraft, + text = text, + evidence = evidence, + archiveRequired = archiveRequired, + meta = meta + ) + + case _ => deserializationErrorEntityMessage(json) + } + } + } diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala new file mode 100644 index 0000000..c9ac357 --- /dev/null +++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala @@ -0,0 +1,102 @@ +package xyz.driver.pdsuidomain.services.rest + +import akka.http.scaladsl.marshalling.Marshal +import akka.http.scaladsl.model._ +import akka.stream.Materializer +import spray.json.RootJsonReader +import xyz.driver.core.rest.{AuthorizedServiceRequestContext, ServiceTransport} +import xyz.driver.entities.users +import xyz.driver.pdsuicommon.db.{Pagination, SearchFilterExpr, Sorting} +import xyz.driver.pdsuicommon.domain.{LongId, StringId} +import xyz.driver.pdsuidomain.ListResponse +import xyz.driver.pdsuidomain.entities.{Trial, TrialIssue} +import xyz.driver.pdsuidomain.services.TrialIssueService + +import scala.concurrent.ExecutionContext + +class RestTrialIssueService(transport: ServiceTransport, baseUri: Uri) + (implicit + protected val materializer: Materializer, + protected val exec: ExecutionContext) + extends TrialIssueService with RestHelper{ + + import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._ + import xyz.driver.pdsuidomain.formats.json.listresponse._ + import xyz.driver.pdsuidomain.formats.json.trialissue._ + import xyz.driver.pdsuidomain.services.TrialIssueService._ + + override def create(draft: TrialIssue) + (implicit requestContext: AuthorizedServiceRequestContext[users.AuthUserInfo]) = { + val trialId = draft.trialId + + implicit val jsonReader: RootJsonReader[TrialIssue] = trialIssueReader(trialId) + + val request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, s"/v1/trial/$trialId/issue")) + for { + response <- transport.sendRequestGetResponse(requestContext)(request) + reply <- apiResponse[TrialIssue](response) + } yield { + CreateReply.Created(reply) + } + } + + override def getListByTrialId(trialId: StringId[Trial], + filter: SearchFilterExpr, + sorting: Option[Sorting], + pagination: Option[Pagination]) + (implicit requestContext: AuthorizedServiceRequestContext[users.AuthUserInfo]) = { + implicit val jsonReader: RootJsonReader[TrialIssue] = trialIssueReader(trialId) + + val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/trial/$trialId/issue", + filterQuery(filter) ++ sortingQuery(sorting) ++ paginationQuery(pagination)) + ) + for { + response <- transport.sendRequestGetResponse(requestContext)(request) + reply <- apiResponse[ListResponse[TrialIssue]](response) + } yield { + GetListByTrialIdReply.EntityList(reply.items, reply.meta.itemsCount, reply.meta.lastUpdate) + } + } + + override def getById(trialId: StringId[Trial], id: LongId[TrialIssue]) + (implicit requestContext: AuthorizedServiceRequestContext[users.AuthUserInfo]) = { + implicit val jsonReader: RootJsonReader[TrialIssue] = trialIssueReader(trialId) + + val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/trial/$trialId/issue/$id")) + for { + response <- transport.sendRequestGetResponse(requestContext)(request) + reply <- apiResponse[TrialIssue](response) + } yield { + GetByIdReply.Entity(reply) + } + } + + override def update(orig: TrialIssue, draft: TrialIssue) + (implicit requestContext: AuthorizedServiceRequestContext[users.AuthUserInfo]) = { + val trialId = draft.trialId + val id = orig.id.id + + implicit val jsonReader: RootJsonReader[TrialIssue] = trialIssueReader(trialId) + + for { + entity <- Marshal(draft).to[RequestEntity] + request = HttpRequest(HttpMethods.PATCH, endpointUri(baseUri, s"/v1/trial/$trialId/issue/$id")).withEntity(entity) + response <- transport.sendRequestGetResponse(requestContext)(request) + reply <- apiResponse[TrialIssue](response) + } yield { + UpdateReply.Updated(reply) + } + } + + override def delete(trialId: StringId[Trial], id: LongId[TrialIssue]) + (implicit requestContext: AuthorizedServiceRequestContext[users.AuthUserInfo]) = { + val request = HttpRequest(HttpMethods.DELETE, endpointUri(baseUri, s"/v1/trial/$trialId/issue/$id")) + for { + response <- transport.sendRequestGetResponse(requestContext)(request) + _ <- apiResponse[HttpEntity](response) + } yield { + DeleteReply.Deleted + } + } + +} diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/TrialIssueFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/TrialIssueFormatSuite.scala index a3b5931..a13e097 100644 --- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/TrialIssueFormatSuite.scala +++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/TrialIssueFormatSuite.scala @@ -26,6 +26,7 @@ class TrialIssueFormatSuite extends FlatSpec with Matchers { writtenJson should be("""{"id":10,"userId":"userId-001","lastUpdate":"2017-08-10T18:00Z","isDraft":false, "text":"message text","evidence":"evidence","archiveRequired":false,"meta":"{}"}""".parseJson) + trialIssueReader(StringId("NCT000001")).read(writtenJson) shouldBe trialIssue val createTrialIssueJson = """{"text":"message text","evidence":"evidence","meta":"{}"}""".parseJson val expectedCreatedTrialIssue = trialIssue.copy(id = LongId(0), lastUpdate = LocalDateTime.MIN, isDraft = true) -- cgit v1.2.3 From 4d07f7cdb4df601398f982dd1df895304c554566 Mon Sep 17 00:00:00 2001 From: Aleksandr Date: Tue, 5 Dec 2017 11:33:49 +0700 Subject: Fixed RestTrialIssueService create method --- src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala | 2 +- .../xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'src/main/scala/xyz/driver/pdsuidomain/formats') diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala index dea5441..79882c2 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue.scala @@ -69,7 +69,7 @@ object trialissue { ) } - implicit def trialIssueReader(trialId: StringId[Trial]): RootJsonReader[TrialIssue] = + def trialIssueReader(trialId: StringId[Trial]): RootJsonReader[TrialIssue] = new RootJsonReader[TrialIssue] { implicit val className: String = "TrialIssue" diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala index c9ac357..b14d35b 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialIssueService.scala @@ -31,8 +31,9 @@ class RestTrialIssueService(transport: ServiceTransport, baseUri: Uri) implicit val jsonReader: RootJsonReader[TrialIssue] = trialIssueReader(trialId) - val request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, s"/v1/trial/$trialId/issue")) for { + entity <- Marshal(draft).to[RequestEntity] + request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, s"/v1/trial/$trialId/issue")).withEntity(entity) response <- transport.sendRequestGetResponse(requestContext)(request) reply <- apiResponse[TrialIssue](response) } yield { -- cgit v1.2.3