aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJakob Odersky <jakob@driver.xyz>2017-10-30 15:41:06 -0700
committerJakob Odersky <jakob@driver.xyz>2017-10-30 16:14:04 -0700
commit91b33aaeb61160da4395e6093e23a947688e12c5 (patch)
tree5ee0ed63ac16d8fc96d372082c745078fbab96c4 /src
parent344996ef6d19551d7cbff717ada35718afcf346a (diff)
downloadrest-query-91b33aaeb61160da4395e6093e23a947688e12c5.tar.gz
rest-query-91b33aaeb61160da4395e6093e23a947688e12c5.tar.bz2
rest-query-91b33aaeb61160da4395e6093e23a947688e12c5.zip
Add REST implementation of RestPatientCriterionService
Diffstat (limited to 'src')
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/utils/CustomSwaggerJsonFormats.scala2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/patientcriterion.scala43
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestPatientCriterionService.scala82
-rw-r--r--src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientCriterionFormatSuite.scala10
4 files changed, 111 insertions, 26 deletions
diff --git a/src/main/scala/xyz/driver/pdsuicommon/utils/CustomSwaggerJsonFormats.scala b/src/main/scala/xyz/driver/pdsuicommon/utils/CustomSwaggerJsonFormats.scala
index fd8ff76..4ff3993 100644
--- a/src/main/scala/xyz/driver/pdsuicommon/utils/CustomSwaggerJsonFormats.scala
+++ b/src/main/scala/xyz/driver/pdsuicommon/utils/CustomSwaggerJsonFormats.scala
@@ -195,7 +195,7 @@ object CustomSwaggerJsonFormats {
classOf[Patient] -> patientFormat.write(nextPatient()),
classOf[RichPatientLabel] -> richPatientLabelFormat.write(nextRichPatientLabel()),
classOf[PatientLabel] -> patientLabelDefiningCriteriaWriter.write(nextPatientLabel()),
- classOf[RichPatientCriterion] -> patientCriterionWriter.write(nextRichPatientCriterion()),
+ classOf[RichPatientCriterion] -> richPatientCriterionFormat.write(nextRichPatientCriterion()),
classOf[DraftPatientCriterion] -> draftPatientCriterionFormat.write(nextDraftPatientCriterion()),
classOf[PatientLabelEvidenceView] -> patientLabelEvidenceWriter.write(nextPatientLabelEvidenceView()),
classOf[RichPatientEligibleTrial] -> patientEligibleTrialWriter.write(nextRichPatientEligibleTrial()),
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientcriterion.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientcriterion.scala
index fbefd33..b5696f7 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientcriterion.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/patientcriterion.scala
@@ -1,8 +1,9 @@
package xyz.driver.pdsuidomain.formats.json
import spray.json._
-import xyz.driver.entities.labels.LabelValue
+import xyz.driver.entities.labels.{Label, LabelValue}
import xyz.driver.formats.json.labels._
+import xyz.driver.pdsuicommon.domain.LongId
import xyz.driver.pdsuidomain.entities._
import xyz.driver.pdsuidomain.services.PatientCriterionService.{DraftPatientCriterion, RichPatientCriterion}
@@ -36,28 +37,28 @@ object patientcriterion {
override def read(json: JsValue) = json.convertTo[List[JsValue]].map(_.convertTo[DraftPatientCriterion])
}
- implicit val patientCriterionWriter: RootJsonWriter[RichPatientCriterion] =
- new RootJsonWriter[RichPatientCriterion] {
+ 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(
- "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
+ obj.patientCriterion.toJson.asJsObject.fields ++
+ Map(
+ "labelId" -> obj.labelId.toJson,
+ "armList" -> obj.armList.toJson
+ )
)
}
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestPatientCriterionService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestPatientCriterionService.scala
new file mode 100644
index 0000000..82c522f
--- /dev/null
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestPatientCriterionService.scala
@@ -0,0 +1,82 @@
+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.pdsuicommon.auth._
+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
+
+import scala.concurrent.{ExecutionContext, Future}
+
+class RestPatientCriterionService(transport: ServiceTransport, baseUri: Uri)(
+ implicit protected val materializer: Materializer,
+ protected val exec: ExecutionContext)
+ extends PatientCriterionService with RestHelper {
+
+ import spray.json.DefaultJsonProtocol._
+ import akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport._
+ import xyz.driver.pdsuidomain.formats.json.patientcriterion._
+ import xyz.driver.pdsuidomain.formats.json.listresponse._
+ import xyz.driver.pdsuidomain.services.PatientCriterionService._
+
+ def getAll(patientId: UuidId[Patient],
+ filter: SearchFilterExpr = SearchFilterExpr.Empty,
+ sorting: Option[Sorting] = None,
+ pagination: Option[Pagination] = None)(
+ implicit requestContext: AuthenticatedRequestContext): Future[GetListReply] = {
+ val request = HttpRequest(HttpMethods.GET,
+ endpointUri(baseUri,
+ s"/v1/patient/$patientId/criterion",
+ filterQuery(filter) ++ sortingQuery(sorting) ++ paginationQuery(pagination)))
+ for {
+ response <- transport.sendRequestGetResponse(requestContext)(request)
+ reply <- apiResponse[ListResponse[RichPatientCriterion]](response)
+ } yield {
+ GetListReply.EntityList(reply.items, reply.meta.itemsCount, reply.meta.lastUpdate)
+ }
+ }
+
+ def getById(patientId: UuidId[Patient], id: LongId[PatientCriterion])(
+ implicit requestContext: AuthenticatedRequestContext): Future[GetByIdReply] = {
+ val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/patient/$patientId/criterion/$id"))
+ for {
+ response <- transport.sendRequestGetResponse(requestContext)(request)
+ reply <- apiResponse[RichPatientCriterion](response)
+ } yield {
+ GetByIdReply.Entity(reply)
+ }
+ }
+
+ def updateList(patientId: UuidId[Patient], draftEntities: List[DraftPatientCriterion])(
+ implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply] = {
+ for {
+ entity <- Marshal(draftEntities).to[RequestEntity]
+ request = HttpRequest(HttpMethods.PATCH, endpointUri(baseUri, s"/v1/patient/$patientId/criterion"))
+ .withEntity(entity)
+ response <- transport.sendRequestGetResponse(requestContext)(request)
+ reply <- apiResponse[RichPatientCriterion](response)
+ } yield {
+ UpdateReply.Updated(reply)
+ }
+ }
+
+ def update(origEntity: PatientCriterion, draftEntity: PatientCriterion, patientId: UuidId[Patient])(
+ implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply] = {
+ for {
+ entity <- Marshal(draftEntity).to[RequestEntity]
+ request = HttpRequest(
+ HttpMethods.PATCH,
+ endpointUri(baseUri, s"/v1/patient/$patientId/criterion/${origEntity.criterionId}")).withEntity(entity)
+ response <- transport.sendRequestGetResponse(requestContext)(request)
+ reply <- apiResponse[RichPatientCriterion](response)
+ } yield {
+ UpdateReply.Updated(reply)
+ }
+ }
+
+}
diff --git a/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientCriterionFormatSuite.scala b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientCriterionFormatSuite.scala
index 93284d9..e0f96bb 100644
--- a/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientCriterionFormatSuite.scala
+++ b/src/test/scala/xyz/driver/pdsuidomain/formats/json/PatientCriterionFormatSuite.scala
@@ -34,12 +34,14 @@ class PatientCriterionFormatSuite extends FlatSpec with Matchers {
PatientCriterionArm(patientCriterionId = LongId(1), armId = LongId(32), armName = "arm 32")
)
val richPatientCriterion = RichPatientCriterion(orig, LongId(21), arms)
- val writtenJson = patientCriterionWriter.write(richPatientCriterion)
+ val writtenJson = richPatientCriterionFormat.write(richPatientCriterion)
writtenJson should be(
- """{"id":1,"labelId":21,"nctId":"NCT00001","criterionId":101,"criterionText":"criterion text","criterionValue":"Yes",
- "criterionIsDefining":false,"criterionIsCompound":false,"eligibilityStatus":"Yes","verifiedEligibilityStatus":null,
- "isVisible":true,"isVerified":true,"lastUpdate":"2017-08-10T18:00Z","arms":["arm 31","arm 32"],"inclusion":true}""".parseJson)
+ """{"isVerified":true,"patientLabelId":1,"lastUpdate":"2017-08-10T18:00Z","trialId":0,
+ "armList":[{"patientCriterionId":1,"armId":31,"armName":"arm 31"},{"patientCriterionId":1,
+ "armId":32,"armName":"arm 32"}],"eligibilityStatus":"Yes","id":1,"nctId":"NCT00001",
+ "criterionId":101,"criterionValue":true,"criterionIsDefining":false,"labelId":21,
+ "isVisible":true,"criterionText":"criterion text","inclusion":true}""".parseJson)
val updatePatientCriterionJson = """{"verifiedEligibilityStatus":"No"}""".parseJson
val expectedUpdatedPatientCriterion = orig.copy(verifiedEligibilityStatus = Some(LabelValue.No))