aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVlad Uspensky <v.uspenskiy@icloud.com>2017-07-21 19:14:02 -0700
committerGitHub <noreply@github.com>2017-07-21 19:14:02 -0700
commita835eef22830ab86a9f65194a6645f4f474ae0cc (patch)
tree13c14e33e346560a8db587b589b6a9464f3e6616
parent525ef428d950a6c9ddb58247101aeb1cb1f42d80 (diff)
parent92f503ce18e90c9955bed8b0a8c6ec2e30f0304e (diff)
downloadrest-query-a835eef22830ab86a9f65194a6645f4f474ae0cc.tar.gz
rest-query-a835eef22830ab86a9f65194a6645f4f474ae0cc.tar.bz2
rest-query-a835eef22830ab86a9f65194a6645f4f474ae0cc.zip
Merge pull request #9 from drivergroup/export-service-separationv0.2.4
Export service separation
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/acl/ACL.scala33
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/auth/AuthenticatedRequestContext.scala1
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/entities/export/trial/ExportTrial.scala27
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrial.scala26
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialArm.scala9
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialLabelCriterion.scala18
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialList.scala15
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialWithLabels.scala19
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiTrial.scala2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/ExportService.scala63
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/ExtractedDataService.scala17
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/MedicalRecordService.scala11
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/TrialService.scala18
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/fake/FakeTrialService.scala33
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala15
15 files changed, 132 insertions, 175 deletions
diff --git a/src/main/scala/xyz/driver/pdsuicommon/acl/ACL.scala b/src/main/scala/xyz/driver/pdsuicommon/acl/ACL.scala
index 276ef9f..48a86e3 100644
--- a/src/main/scala/xyz/driver/pdsuicommon/acl/ACL.scala
+++ b/src/main/scala/xyz/driver/pdsuicommon/acl/ACL.scala
@@ -19,21 +19,6 @@ object ACL extends PhiLogging {
// Common
- object User
- extends BaseACL(
- label = "user",
- create = Set(RecordAdmin, TrialAdmin, TreatmentMatchingAdmin),
- read = Allow,
- update = Allow,
- delete = Set(RecordAdmin, TrialAdmin, TreatmentMatchingAdmin)
- )
-
- object Label
- extends BaseACL(
- label = "label",
- read = RepRoles ++ TcRoles ++ TreatmentMatchingRoles + ResearchOncologist
- )
-
object UserHistory
extends BaseACL(
label = "user history",
@@ -53,7 +38,7 @@ object ACL extends PhiLogging {
object MedicalRecord
extends BaseACL(
label = "medical record",
- read = RepRoles + RoutesCurator + TreatmentMatchingAdmin + ResearchOncologist,
+ read = RepRoles + RoutesCurator + TreatmentMatchingAdmin + ResearchOncologist + SystemUser,
update = RepRoles - DocumentExtractor
)
@@ -75,12 +60,6 @@ object ACL extends PhiLogging {
delete = Set(DocumentExtractor, RecordAdmin)
)
- object Keyword
- extends BaseACL(
- label = "keyword",
- read = Set(DocumentExtractor, RecordAdmin)
- )
-
object ProviderType
extends BaseACL(
label = "provider type",
@@ -107,7 +86,7 @@ object ACL extends PhiLogging {
object Trial
extends BaseACL(
label = "trial",
- read = TcRoles + RoutesCurator + TreatmentMatchingAdmin + ResearchOncologist,
+ read = TcRoles + RoutesCurator + TreatmentMatchingAdmin + ResearchOncologist + SystemUser,
update = TcRoles
)
@@ -156,12 +135,6 @@ object ACL extends PhiLogging {
delete = Set(TrialSummarizer, TrialAdmin)
)
- object Category
- extends BaseACL(
- label = "category",
- read = Set(DocumentExtractor, RecordAdmin, CriteriaCurator, TrialAdmin)
- )
-
object Intervention
extends BaseACL(
label = "intervention",
@@ -180,7 +153,7 @@ object ACL extends PhiLogging {
object Patient
extends BaseACL(
label = "patient",
- read = TreatmentMatchingRoles + ResearchOncologist,
+ read = TreatmentMatchingRoles + ResearchOncologist + SystemUser,
update = TreatmentMatchingRoles
)
diff --git a/src/main/scala/xyz/driver/pdsuicommon/auth/AuthenticatedRequestContext.scala b/src/main/scala/xyz/driver/pdsuicommon/auth/AuthenticatedRequestContext.scala
index 16265c6..42f7435 100644
--- a/src/main/scala/xyz/driver/pdsuicommon/auth/AuthenticatedRequestContext.scala
+++ b/src/main/scala/xyz/driver/pdsuicommon/auth/AuthenticatedRequestContext.scala
@@ -31,5 +31,4 @@ object AuthenticatedRequestContext {
implicit def toPhiString(x: AuthenticatedRequestContext): PhiString = {
phi"AuthenticatedRequestContext(executor=${x.executor}, requestId=${x.requestId})"
}
-
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/export/trial/ExportTrial.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/export/trial/ExportTrial.scala
deleted file mode 100644
index 1aed121..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/entities/export/trial/ExportTrial.scala
+++ /dev/null
@@ -1,27 +0,0 @@
-package xyz.driver.pdsuidomain.entities.export.trial
-
-import java.time.LocalDateTime
-
-import xyz.driver.pdsuicommon.domain._
-import xyz.driver.pdsuicommon.logging._
-import xyz.driver.pdsuidomain.entities.Trial
-
-final case class ExportTrial(nctId: StringId[Trial],
- trialId: UuidId[Trial],
- condition: Trial.Condition,
- lastReviewed: LocalDateTime)
-
-object ExportTrial {
-
- implicit def toPhiString(x: ExportTrial): PhiString = {
- import x._
- phi"ExportTrial(nctId=$nctId, trialId=$trialId, condition=${Unsafe(condition)}, lastReviewed=$lastReviewed)"
- }
-
- def fromDomain(x: Trial) = ExportTrial(
- nctId = x.id,
- trialId = x.externalId,
- condition = x.condition,
- lastReviewed = x.lastUpdate
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrial.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrial.scala
deleted file mode 100644
index 0c9cb71..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrial.scala
+++ /dev/null
@@ -1,26 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.export
-
-import java.time.ZoneId
-
-import play.api.libs.functional.syntax._
-import play.api.libs.json.{Format, JsPath}
-import xyz.driver.pdsuidomain.entities.export.trial.ExportTrial
-
-final case class ApiExportTrial(nctId: String, trialId: String, disease: String, lastReviewed: Long)
-
-object ApiExportTrial {
-
- implicit val format: Format[ApiExportTrial] = (
- (JsPath \ "nctId").format[String] and
- (JsPath \ "trialId").format[String] and
- (JsPath \ "disease").format[String] and
- (JsPath \ "lastReviewed").format[Long]
- )(ApiExportTrial.apply, unlift(ApiExportTrial.unapply))
-
- def fromDomain(trial: ExportTrial): ApiExportTrial = ApiExportTrial(
- nctId = trial.nctId.id,
- trialId = trial.trialId.toString,
- disease = trial.condition.toString.toUpperCase,
- lastReviewed = trial.lastReviewed.atZone(ZoneId.of("Z")).toEpochSecond
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialArm.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialArm.scala
index b2b02eb..ea96f58 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialArm.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialArm.scala
@@ -2,9 +2,16 @@ package xyz.driver.pdsuidomain.formats.json.export
import play.api.libs.functional.syntax._
import play.api.libs.json._
+import xyz.driver.pdsuicommon.domain.LongId
+import xyz.driver.pdsuidomain.entities.Arm
import xyz.driver.pdsuidomain.entities.export.trial.ExportTrialArm
-final case class ApiExportTrialArm(armId: String, armName: String)
+final case class ApiExportTrialArm(armId: String, armName: String) {
+
+ def toDomain: ExportTrialArm = {
+ ExportTrialArm(LongId[Arm](armId.toLong), armName)
+ }
+}
object ApiExportTrialArm {
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialLabelCriterion.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialLabelCriterion.scala
index 2564efe..df1ebb4 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialLabelCriterion.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialLabelCriterion.scala
@@ -1,9 +1,10 @@
package xyz.driver.pdsuidomain.formats.json.export
-import xyz.driver.pdsuicommon.domain.FuzzyValue
import play.api.libs.functional.syntax._
import play.api.libs.json._
+import xyz.driver.pdsuicommon.domain.{FuzzyValue, LongId}
import xyz.driver.pdsuidomain.entities.export.trial.ExportTrialLabelCriterion
+import xyz.driver.pdsuidomain.entities.{Arm, Criterion, Label}
final case class ApiExportTrialLabelCriterion(value: String,
labelId: String,
@@ -11,7 +12,20 @@ final case class ApiExportTrialLabelCriterion(value: String,
criterionText: String,
armIds: List[String],
isCompound: Boolean,
- isDefining: Boolean)
+ isDefining: Boolean) {
+
+ def toDomain: ExportTrialLabelCriterion = {
+ ExportTrialLabelCriterion(
+ LongId[Criterion](criterionId.toLong),
+ FuzzyValue.fromString.lift(value).map(_ == FuzzyValue.Yes),
+ LongId[Label](labelId.toLong),
+ armIds.map(armId => LongId[Arm](armId.toLong)).toSet,
+ criterionText,
+ isCompound,
+ isDefining
+ )
+ }
+}
object ApiExportTrialLabelCriterion {
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialList.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialList.scala
deleted file mode 100644
index 93ee42e..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialList.scala
+++ /dev/null
@@ -1,15 +0,0 @@
-package xyz.driver.pdsuidomain.formats.json.export
-
-import play.api.libs.json.{Format, Json}
-import xyz.driver.pdsuidomain.entities.export.trial.ExportTrial
-
-final case class ApiExportTrialList(trials: Seq[ApiExportTrial])
-
-object ApiExportTrialList {
-
- implicit val format: Format[ApiExportTrialList] = Json.format
-
- def fromDomain(trialList: Seq[ExportTrial]) = ApiExportTrialList(
- trials = trialList.map(ApiExportTrial.fromDomain)
- )
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialWithLabels.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialWithLabels.scala
index de76ac0..e383a1f 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialWithLabels.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/export/ApiExportTrialWithLabels.scala
@@ -1,9 +1,11 @@
package xyz.driver.pdsuidomain.formats.json.export
-import java.time.ZoneId
+import java.time.{Instant, ZoneId}
import play.api.libs.functional.syntax._
import play.api.libs.json.{Format, JsPath}
+import xyz.driver.pdsuicommon.domain.{StringId, UuidId}
+import xyz.driver.pdsuidomain.entities.Trial
import xyz.driver.pdsuidomain.entities.export.trial.ExportTrialWithLabels
final case class ApiExportTrialWithLabels(nctId: String,
@@ -12,7 +14,20 @@ final case class ApiExportTrialWithLabels(nctId: String,
lastReviewed: Long,
labelVersion: Long,
arms: List[ApiExportTrialArm],
- criteria: List[ApiExportTrialLabelCriterion])
+ criteria: List[ApiExportTrialLabelCriterion]) {
+
+ def toDomain: ExportTrialWithLabels = {
+ ExportTrialWithLabels(
+ StringId[Trial](nctId),
+ UuidId[Trial](trialId),
+ condition,
+ lastReviewed = Instant.ofEpochMilli(lastReviewed).atZone(ZoneId.of("Z")).toLocalDateTime,
+ labelVersion,
+ arms.map(_.toDomain),
+ criteria.map(_.toDomain)
+ )
+ }
+}
object ApiExportTrialWithLabels {
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiTrial.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiTrial.scala
index f59836e..51bd03f 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiTrial.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiTrial.scala
@@ -36,7 +36,7 @@ final case class ApiTrial(id: String,
previousStatus = this.previousStatus.map(s => TrialStatus.statusFromString(s)),
previousAssignee = this.previousAssignee.map(id => StringId(id)),
lastActiveUserId = this.lastActiveUser.map(id => StringId(id)),
- lastUpdate = this.lastUpdate.toLocalDateTime(),
+ lastUpdate = this.lastUpdate.toLocalDateTime,
condition = Trial.Condition
.fromString(this.condition)
.getOrElse(
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/ExportService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/ExportService.scala
deleted file mode 100644
index a313703..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/services/ExportService.scala
+++ /dev/null
@@ -1,63 +0,0 @@
-package xyz.driver.pdsuidomain.services
-
-import java.time.LocalDateTime
-
-import xyz.driver.pdsuicommon.auth.AnonymousRequestContext
-import xyz.driver.pdsuicommon.db.SearchFilterExpr
-import xyz.driver.pdsuicommon.domain._
-import xyz.driver.pdsuicommon.error.DomainError
-import xyz.driver.pdsuidomain.entities.export.patient.ExportPatientWithLabels
-import xyz.driver.pdsuidomain.entities.export.trial.{ExportTrial, ExportTrialWithLabels}
-import xyz.driver.pdsuidomain.entities.{MedicalRecord, Patient, Trial}
-
-import scala.concurrent.Future
-
-object ExportService {
-
- sealed trait GetPatientReply
- object GetPatientReply {
- type Error = GetPatientReply with DomainError
-
- final case class Entity(x: ExportPatientWithLabels) extends GetPatientReply
-
- case object NotFoundError extends GetPatientReply with DomainError.NotFoundError {
- def userMessage: String = "Patient not found"
- }
- }
-
- sealed trait GetTrialListReply
- object GetTrialListReply {
- final case class EntityList(xs: Seq[ExportTrial], totalFound: Int, lastUpdate: Option[LocalDateTime])
- extends GetTrialListReply
- }
-
- sealed trait GetTrialReply
- object GetTrialReply {
- type Error = GetTrialReply with DomainError
-
- final case class Entity(x: ExportTrialWithLabels) extends GetTrialReply
-
- case object NotFoundError extends GetTrialReply with DomainError.NotFoundError {
- def userMessage: String = "Trial not found"
- }
- }
-}
-
-trait ExportService {
-
- import ExportService._
-
- def getPatient(id: UuidId[Patient])(implicit requestContext: AnonymousRequestContext): Future[GetPatientReply]
-
- def getTrialList(filter: SearchFilterExpr = SearchFilterExpr.Empty)(
- implicit requestContext: AnonymousRequestContext): Future[GetTrialListReply]
-
- def getTrial(trialId: StringId[Trial], condition: String)(
- implicit requestContext: AnonymousRequestContext): Future[GetTrialReply]
-
- def getRecords(patientId: UuidId[Patient])(
- implicit requestContext: AnonymousRequestContext): Future[MedicalRecordService.GetListReply]
-
- def getRecordPdf(recordId: LongId[MedicalRecord])(
- implicit requestContext: AnonymousRequestContext): Future[MedicalRecordService.GetPdfSourceReply]
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/ExtractedDataService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/ExtractedDataService.scala
index afb994e..9bcd921 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/ExtractedDataService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/ExtractedDataService.scala
@@ -2,10 +2,11 @@ package xyz.driver.pdsuidomain.services
import xyz.driver.pdsuicommon.auth.AuthenticatedRequestContext
import xyz.driver.pdsuicommon.db.{Pagination, SearchFilterExpr, Sorting}
-import xyz.driver.pdsuicommon.domain.LongId
+import xyz.driver.pdsuicommon.domain.{LongId, UuidId}
import xyz.driver.pdsuicommon.error.DomainError
import xyz.driver.pdsuicommon.logging._
import xyz.driver.pdsuidomain.entities._
+import xyz.driver.pdsuidomain.entities.export.patient.ExportPatientWithLabels
import scala.concurrent.Future
@@ -49,6 +50,17 @@ object ExtractedDataService {
extends GetListReply with DomainError.AuthorizationError with DefaultAccessDeniedError
}
+ sealed trait GetPatientLabelsReply
+ object GetPatientLabelsReply {
+ type Error = GetPatientLabelsReply with DomainError
+
+ final case class Entity(x: ExportPatientWithLabels) extends GetPatientLabelsReply
+
+ case object NotFoundError extends GetPatientLabelsReply with DomainError.NotFoundError {
+ def userMessage: String = "Patient not found"
+ }
+ }
+
sealed trait CreateReply
object CreateReply {
type Error = CreateReply with DomainError
@@ -93,6 +105,9 @@ trait ExtractedDataService {
def getById(id: LongId[ExtractedData])(implicit requestContext: AuthenticatedRequestContext): Future[GetByIdReply]
+ def getPatientLabels(id: UuidId[Patient])(
+ implicit requestContext: AuthenticatedRequestContext): Future[GetPatientLabelsReply]
+
def getAll(filter: SearchFilterExpr = SearchFilterExpr.Empty,
sorting: Option[Sorting] = None,
pagination: Option[Pagination] = None)(
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/MedicalRecordService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/MedicalRecordService.scala
index b2fc9f9..46e9156 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/MedicalRecordService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/MedicalRecordService.scala
@@ -4,7 +4,7 @@ import java.time.LocalDateTime
import xyz.driver.pdsuicommon.auth.AuthenticatedRequestContext
import xyz.driver.pdsuicommon.db._
-import xyz.driver.pdsuicommon.domain.LongId
+import xyz.driver.pdsuicommon.domain.{LongId, UuidId}
import xyz.driver.pdsuicommon.error._
import xyz.driver.pdsuidomain.entities.MedicalRecord.PdfSource
import xyz.driver.pdsuidomain.entities._
@@ -60,8 +60,14 @@ object MedicalRecordService {
final case class EntityList(xs: Seq[MedicalRecord], totalFound: Int, lastUpdate: Option[LocalDateTime])
extends GetListReply
+ type Error = GetListReply with DomainError
+
case object AuthorizationError
extends GetListReply with DomainError.AuthorizationError with DefaultAccessDeniedError
+
+ case object NotFoundError extends GetListReply with DomainError.NotFoundError {
+ def userMessage: String = "Patient wasn't found"
+ }
}
sealed trait CreateReply
@@ -93,6 +99,9 @@ trait MedicalRecordService {
def getById(recordId: LongId[MedicalRecord])(
implicit requestContext: AuthenticatedRequestContext): Future[GetByIdReply]
+ def getPatientRecords(patientId: UuidId[Patient])(
+ implicit requestContext: AuthenticatedRequestContext): Future[GetListReply]
+
def getPdfSource(recordId: LongId[MedicalRecord])(
implicit requestContext: AuthenticatedRequestContext): Future[GetPdfSourceReply]
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/TrialService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/TrialService.scala
index 3148842..d140d27 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/TrialService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/TrialService.scala
@@ -9,6 +9,7 @@ import xyz.driver.pdsuicommon.error.DomainError
import xyz.driver.pdsuicommon.logging._
import xyz.driver.pdsuidomain.entities.Trial
import xyz.driver.pdsuidomain.entities.Trial.PdfSource
+import xyz.driver.pdsuidomain.entities.export.trial.ExportTrialWithLabels
import scala.concurrent.Future
@@ -51,6 +52,20 @@ object TrialService {
}
}
+ sealed trait GetTrialWithLabelsReply
+ object GetTrialWithLabelsReply {
+ type Error = GetTrialWithLabelsReply with DomainError
+
+ final case class Entity(x: ExportTrialWithLabels) extends GetTrialWithLabelsReply
+
+ case object NotFoundError extends GetTrialWithLabelsReply with DomainError.NotFoundError {
+ def userMessage: String = "Trial not found"
+ }
+
+ case object AuthorizationError
+ extends GetTrialWithLabelsReply with DomainError.AuthorizationError with DefaultAccessDeniedError
+ }
+
sealed trait GetPdfSourceReply
object GetPdfSourceReply {
type Error = GetPdfSourceReply with DomainError
@@ -95,6 +110,9 @@ trait TrialService {
def getById(id: StringId[Trial])(implicit requestContext: AuthenticatedRequestContext): Future[GetByIdReply]
+ def getTrialWithLabels(trialId: StringId[Trial], condition: String)(
+ implicit requestContext: AuthenticatedRequestContext): Future[GetTrialWithLabelsReply]
+
def getPdfSource(trialId: StringId[Trial])(
implicit requestContext: AuthenticatedRequestContext): Future[GetPdfSourceReply]
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/fake/FakeTrialService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/fake/FakeTrialService.scala
index bd176b3..7c0e313 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/fake/FakeTrialService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/fake/FakeTrialService.scala
@@ -1,11 +1,15 @@
package xyz.driver.pdsuidomain.services.fake
import java.time.LocalDateTime
+
+import xyz.driver.core.generators
import xyz.driver.pdsuicommon.auth.AuthenticatedRequestContext
import xyz.driver.pdsuicommon.db._
-import xyz.driver.pdsuicommon.domain.{StringId, UuidId}
-import xyz.driver.pdsuidomain.entities.Trial
+import xyz.driver.pdsuicommon.domain.{LongId, StringId, UuidId}
+import xyz.driver.pdsuidomain.entities.{Arm, Criterion, Label, Trial}
+import xyz.driver.pdsuidomain.entities.export.trial.{ExportTrialArm, ExportTrialLabelCriterion, ExportTrialWithLabels}
import xyz.driver.pdsuidomain.services.TrialService
+
import scala.concurrent.Future
class FakeTrialService extends TrialService {
@@ -49,6 +53,31 @@ class FakeTrialService extends TrialService {
implicit requestContext: AuthenticatedRequestContext): Future[GetListReply] =
Future.successful(GetListReply.EntityList(Seq(trial), 1, None))
+ override def getTrialWithLabels(trialId: StringId[Trial], condition: String)(
+ implicit requestContext: AuthenticatedRequestContext): Future[GetTrialWithLabelsReply] = {
+ Future.successful(
+ GetTrialWithLabelsReply.Entity(ExportTrialWithLabels(
+ StringId[Trial]("NCT" + generators.nextInt(999999).toString),
+ UuidId[Trial](generators.nextUuid()),
+ generators.oneOf("adenocarcinoma", "breast", "prostate"),
+ LocalDateTime.now(),
+ labelVersion = 1L,
+ generators.listOf(new ExportTrialArm(
+ LongId[Arm](generators.nextInt(999999).toLong),
+ generators.nextName().value
+ )),
+ generators.listOf(new ExportTrialLabelCriterion(
+ LongId[Criterion](generators.nextInt(999999).toLong),
+ generators.nextOption(generators.nextBoolean()),
+ LongId[Label](generators.nextInt(999999).toLong),
+ generators.setOf(LongId[Arm](generators.nextInt(999999).toLong)),
+ generators.nextName().value,
+ generators.nextBoolean(),
+ generators.nextBoolean()
+ ))
+ )))
+ }
+
def update(origTrial: Trial, draftTrial: Trial)(
implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply] =
Future.successful(UpdateReply.Updated(draftTrial))
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala
index 54f5f2e..9f72760 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala
@@ -1,8 +1,6 @@
package xyz.driver.pdsuidomain.services.rest
-import scala.NotImplementedError
import scala.concurrent.{ExecutionContext, Future}
-
import akka.http.scaladsl.marshalling.Marshal
import akka.http.scaladsl.model._
import akka.stream.Materializer
@@ -12,6 +10,7 @@ import xyz.driver.pdsuicommon.db._
import xyz.driver.pdsuicommon.domain._
import xyz.driver.pdsuidomain.entities._
import xyz.driver.pdsuidomain.formats.json.ListResponse
+import xyz.driver.pdsuidomain.formats.json.export.ApiExportTrialWithLabels
import xyz.driver.pdsuidomain.formats.json.trial.ApiTrial
import xyz.driver.pdsuidomain.services.TrialService
@@ -32,6 +31,17 @@ class RestTrialService(transport: ServiceTransport, baseUri: Uri)(implicit prote
}
}
+ def getTrialWithLabels(trialId: StringId[Trial], condition: String)(
+ implicit requestContext: AuthenticatedRequestContext): Future[GetTrialWithLabelsReply] = {
+ val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/export/trial/$trialId"))
+ for {
+ response <- transport.sendRequestGetResponse(requestContext)(request)
+ reply <- apiResponse[ApiExportTrialWithLabels](response)
+ } yield {
+ GetTrialWithLabelsReply.Entity(reply.toDomain)
+ }
+ }
+
def getPdfSource(trialId: StringId[Trial])(
implicit requestContext: AuthenticatedRequestContext): Future[GetPdfSourceReply] =
Future.failed(new NotImplementedError("Streaming PDF over network is not supported."))
@@ -90,5 +100,4 @@ class RestTrialService(transport: ServiceTransport, baseUri: Uri)(implicit prote
singleAction(origTrial, "archive")
def unassign(origTrial: Trial)(implicit requestContext: AuthenticatedRequestContext): Future[UpdateReply] =
singleAction(origTrial, "unassign")
-
}