aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/pdsuidomain
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/scala/xyz/driver/pdsuidomain')
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/entities/Intervention.scala4
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/entities/Trial.scala3
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/fakes/entities/common.scala36
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/fakes/entities/trialcuration.scala137
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiIntervention.scala16
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiPartialIntervention.scala8
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/documentissue.scala13
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/documenttype.scala13
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/intervention.scala26
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/providerttype.scala12
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/recordissue.scala13
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue/ApiTrialIssue.scala20
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/TrialService.scala24
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/fake/FakeTrialService.scala5
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala14
15 files changed, 266 insertions, 78 deletions
diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/Intervention.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/Intervention.scala
index e691547..cb677cf 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/entities/Intervention.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/entities/Intervention.scala
@@ -27,8 +27,8 @@ final case class Intervention(id: LongId[Intervention],
originalName: String,
typeId: Option[LongId[InterventionType]],
originalType: Option[String],
- description: String,
- originalDescription: String,
+ dosage: String,
+ originalDosage: String,
isActive: Boolean)
object Intervention {
diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/Trial.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/Trial.scala
index 2f90820..db4def2 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/entities/Trial.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/entities/Trial.scala
@@ -1,6 +1,5 @@
package xyz.driver.pdsuidomain.entities
-import java.nio.file.Path
import java.time.LocalDateTime
import xyz.driver.pdsuicommon.domain.{LongId, StringId, User, UuidId}
@@ -52,8 +51,6 @@ object Trial {
implicit def toPhiString(x: Status): PhiString = Unsafe(Utils.getClassSimpleName(x.getClass))
}
- final case class PdfSource(path: Path) extends AnyVal
-
implicit def toPhiString(x: Trial): PhiString = {
import x._
phi"Trial(id=$id, externalId=$externalId, status=$status, previousStatus=$previousStatus, " +
diff --git a/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/common.scala b/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/common.scala
new file mode 100644
index 0000000..b259b07
--- /dev/null
+++ b/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/common.scala
@@ -0,0 +1,36 @@
+package xyz.driver.pdsuidomain.fakes.entities
+
+import java.time.{LocalDate, LocalDateTime, LocalTime}
+
+import xyz.driver.pdsuicommon.domain.{LongId, StringId, UuidId}
+import xyz.driver.pdsuidomain.entities.{Trial, TrialHistory}
+import scala.util.Random
+
+object common {
+ import xyz.driver.core.generators
+
+ def nextUuidId[T] = UuidId[T](generators.nextUuid())
+
+ def nextLongId[T] = LongId[T](generators.nextInt(Int.MaxValue).toLong)
+
+ def nextStringId[T] = StringId[T](generators.nextString(maxLength = 20))
+
+ def nextTrialStatus = generators.oneOf[Trial.Status](Trial.Status.All)
+
+ def nextPreviousTrialStatus = generators.oneOf[Trial.Status](Trial.Status.AllPrevious)
+
+ def nextLocalDateTime = LocalDateTime.of(nextLocalDate, LocalTime.MIDNIGHT)
+
+ def nextLocalDate = LocalDate.of(
+ 1970 + Random.nextInt(68),
+ 1 + Random.nextInt(12),
+ 1 + Random.nextInt(28) // all months have at least 28 days
+ )
+
+ def nextCondition = generators.oneOf[Trial.Condition](Trial.Condition.All)
+
+ def nextTrialAction = generators.oneOf[TrialHistory.Action](TrialHistory.Action.All)
+
+ def nextTrialState = generators.oneOf[TrialHistory.State](TrialHistory.State.All)
+
+}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/trialcuration.scala b/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/trialcuration.scala
new file mode 100644
index 0000000..ecb6e0a
--- /dev/null
+++ b/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/trialcuration.scala
@@ -0,0 +1,137 @@
+package xyz.driver.pdsuidomain.fakes.entities
+
+import xyz.driver.pdsuicommon.domain.{LongId, User}
+import xyz.driver.pdsuidomain.entities._
+import xyz.driver.pdsuidomain.services.CriterionService.RichCriterion
+
+object trialcuration {
+ import xyz.driver.core.generators
+ import common._
+
+ def nextTrial(): Trial = Trial(
+ id = nextStringId[Trial],
+ externalId = nextUuidId[Trial],
+ status = nextTrialStatus,
+ assignee = Option(nextStringId[User]),
+ previousStatus = Option(nextPreviousTrialStatus),
+ previousAssignee = Option(nextStringId[User]),
+ lastActiveUserId = Option(nextStringId[User]),
+ lastUpdate = nextLocalDateTime,
+ condition = nextCondition,
+ phase = generators.nextString(),
+ hypothesisId = Option(nextUuidId[Hypothesis]),
+ studyDesignId = Option(nextLongId[StudyDesign]),
+ originalStudyDesign = Option(generators.nextString()),
+ isPartner = generators.nextBoolean(),
+ overview = Option(generators.nextString()),
+ overviewTemplate = generators.nextString(),
+ isUpdated = generators.nextBoolean(),
+ title = generators.nextString(),
+ originalTitle = generators.nextString()
+ )
+
+ def nextArm(): Arm = Arm(
+ id = nextLongId[Arm],
+ name = generators.nextString(),
+ originalName = generators.nextString(),
+ trialId = nextStringId[Trial],
+ deleted = Option(nextLocalDateTime)
+ )
+
+ def nextCriterion(): Criterion = Criterion(
+ id = nextLongId[Criterion],
+ trialId = nextStringId[Trial],
+ text = Option(generators.nextString()),
+ isCompound = generators.nextBoolean(),
+ meta = generators.nextString()
+ )
+
+ def nextCriterionLabel(criterionId: LongId[Criterion]): CriterionLabel = CriterionLabel(
+ id = nextLongId[CriterionLabel],
+ labelId = Option(nextLongId[Label]),
+ criterionId = criterionId,
+ categoryId = Option(nextLongId[Category]),
+ value = Option(generators.nextBoolean()),
+ isDefining = generators.nextBoolean()
+ )
+
+ def nextRichCriterion(): RichCriterion = {
+ val criterion = nextCriterion()
+ RichCriterion(
+ criterion = criterion,
+ armIds = Seq(nextLongId[Arm], nextLongId[Arm]),
+ labels = Seq(
+ nextCriterionLabel(criterion.id),
+ nextCriterionLabel(criterion.id)
+ )
+ )
+ }
+
+ def nextIntervention(): Intervention = Intervention(
+ id = nextLongId[Intervention],
+ trialId = nextStringId[Trial],
+ name = generators.nextString(),
+ originalName = generators.nextString(),
+ typeId = Option(nextLongId[InterventionType]),
+ originalType = Option(generators.nextString()),
+ dosage = generators.nextString(),
+ originalDosage = generators.nextString(),
+ isActive = generators.nextBoolean()
+ )
+
+ def nextInterventionArm(interventionId: LongId[Intervention]): InterventionArm = InterventionArm(
+ interventionId = interventionId,
+ armId = nextLongId[Arm]
+ )
+
+ def nextInterventionWithArms(): InterventionWithArms = {
+ val intervention = nextIntervention()
+ InterventionWithArms(
+ intervention = intervention,
+ arms = List(
+ nextInterventionArm(intervention.id),
+ nextInterventionArm(intervention.id),
+ nextInterventionArm(intervention.id)
+ )
+ )
+ }
+
+ def nextTrialIssue(): TrialIssue = TrialIssue(
+ id = nextLongId[TrialIssue],
+ userId = nextStringId[User],
+ trialId = nextStringId[Trial],
+ lastUpdate = nextLocalDateTime,
+ isDraft = generators.nextBoolean(),
+ text = generators.nextString(),
+ evidence = generators.nextString(),
+ archiveRequired = generators.nextBoolean(),
+ meta = generators.nextString()
+ )
+
+ def nextTrialHistory(): TrialHistory = TrialHistory(
+ id = nextLongId[TrialHistory],
+ executor = nextStringId[User],
+ trialId = nextStringId[Trial],
+ state = nextTrialState,
+ action = nextTrialAction,
+ created = nextLocalDateTime
+ )
+
+ def nextHypothesis(): Hypothesis = Hypothesis(
+ id = nextUuidId[Hypothesis],
+ name = generators.nextString(),
+ treatmentType = generators.nextString(),
+ description = generators.nextString()
+ )
+
+ def nextStudyDesign(): StudyDesign = StudyDesign(
+ id = nextLongId[StudyDesign],
+ name = generators.nextString()
+ )
+
+ def nextInterventionType(): InterventionType = InterventionType(
+ id = nextLongId[InterventionType],
+ name = generators.nextString()
+ )
+
+}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiIntervention.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiIntervention.scala
index 39acbde..f306a71 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiIntervention.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiIntervention.scala
@@ -8,12 +8,12 @@ import play.api.libs.json.{Format, JsPath}
final case class ApiIntervention(id: Long,
name: String,
typeId: Option[Long],
- description: String,
+ dosage: String,
isActive: Boolean,
arms: List[Long],
trialId: String,
originalName: String,
- originalDescription: String,
+ originalDosage: String,
originalType: Option[String]) {
def toDomain = {
@@ -24,8 +24,8 @@ final case class ApiIntervention(id: Long,
originalName = this.originalName,
typeId = this.typeId.map(id => LongId(id)),
originalType = this.originalType.map(id => id.toString),
- description = this.description,
- originalDescription = this.originalDescription,
+ dosage = this.dosage,
+ originalDosage = this.originalDosage,
isActive = this.isActive
)
@@ -43,12 +43,12 @@ object ApiIntervention {
(JsPath \ "id").format[Long] and
(JsPath \ "name").format[String] and
(JsPath \ "typeId").formatNullable[Long] and
- (JsPath \ "description").format[String] and
+ (JsPath \ "dosage").format[String] and
(JsPath \ "isActive").format[Boolean] and
(JsPath \ "arms").format[List[Long]] and
(JsPath \ "trialId").format[String] and
(JsPath \ "originalName").format[String] and
- (JsPath \ "originalDescription").format[String] and
+ (JsPath \ "originalDosage").format[String] and
(JsPath \ "originalType").formatNullable[String]
)(ApiIntervention.apply, unlift(ApiIntervention.unapply))
@@ -60,12 +60,12 @@ object ApiIntervention {
id = intervention.id.id,
name = intervention.name,
typeId = intervention.typeId.map(_.id),
- description = intervention.description,
+ dosage = intervention.dosage,
isActive = intervention.isActive,
arms = arms.map(_.armId.id),
trialId = intervention.trialId.id,
originalName = intervention.originalName,
- originalDescription = intervention.originalDescription,
+ originalDosage = intervention.originalDosage,
originalType = intervention.originalType
)
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiPartialIntervention.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiPartialIntervention.scala
index f67ba6b..aa55506 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiPartialIntervention.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/intervention/ApiPartialIntervention.scala
@@ -6,7 +6,7 @@ import play.api.libs.functional.syntax._
import play.api.libs.json._
final case class ApiPartialIntervention(typeId: Option[Long],
- description: Option[String],
+ dosage: Option[String],
isActive: Option[Boolean],
arms: Option[List[Long]]) {
@@ -16,7 +16,7 @@ final case class ApiPartialIntervention(typeId: Option[Long],
orig.copy(
intervention = origIntervention.copy(
typeId = typeId.map(LongId(_)).orElse(origIntervention.typeId),
- description = description.getOrElse(origIntervention.description),
+ dosage = dosage.getOrElse(origIntervention.dosage),
isActive = isActive.getOrElse(origIntervention.isActive)
),
arms = draftArmList.getOrElse(orig.arms)
@@ -28,14 +28,14 @@ object ApiPartialIntervention {
private val reads: Reads[ApiPartialIntervention] = (
(JsPath \ "typeId").readNullable[Long] and
- (JsPath \ "description").readNullable[String] and
+ (JsPath \ "dosage").readNullable[String] and
(JsPath \ "isActive").readNullable[Boolean] and
(JsPath \ "arms").readNullable[List[Long]]
)(ApiPartialIntervention.apply _)
private val writes: Writes[ApiPartialIntervention] = (
(JsPath \ "typeId").writeNullable[Long] and
- (JsPath \ "description").writeNullable[String] and
+ (JsPath \ "dosage").writeNullable[String] and
(JsPath \ "isActive").writeNullable[Boolean] and
(JsPath \ "arms").writeNullable[List[Long]]
)(unlift(ApiPartialIntervention.unapply))
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/documentissue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/documentissue.scala
index 28b2a5e..a658cfa 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/documentissue.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/documentissue.scala
@@ -61,17 +61,6 @@ object documentissue {
case _ => deserializationError(s"Expected Json Object as DocumentIssue, but got $json")
}
- implicit val documentIssueWriter = new JsonWriter[DocumentIssue] {
- override def write(obj: DocumentIssue) = JsObject(
- "id" -> obj.id.toJson,
- "startPage" -> obj.startPage.toJson,
- "endPage" -> obj.endPage.toJson,
- "text" -> obj.text.toJson,
- "lastUpdate" -> obj.lastUpdate.toJson,
- "userId" -> obj.userId.toJson,
- "isDraft" -> obj.isDraft.toJson,
- "archiveRequired" -> obj.archiveRequired.toJson
- )
- }
+ implicit val documentIssueFormat: RootJsonFormat[DocumentIssue] = jsonFormat9(DocumentIssue.apply)
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/documenttype.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/documenttype.scala
new file mode 100644
index 0000000..8119d35
--- /dev/null
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/documenttype.scala
@@ -0,0 +1,13 @@
+package xyz.driver.pdsuidomain.formats.json.sprayformats
+
+import spray.json._
+import xyz.driver.pdsuidomain.entities._
+import xyz.driver.pdsuidomain.entities.DocumentType
+
+object documenttype {
+ import DefaultJsonProtocol._
+ import common._
+
+ implicit val format: RootJsonFormat[DocumentType] = jsonFormat2(DocumentType.apply)
+
+}
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 a8ce950..9314391 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
@@ -11,16 +11,16 @@ object intervention {
implicit val interventionWriter: JsonWriter[InterventionWithArms] = new JsonWriter[InterventionWithArms] {
override def write(obj: InterventionWithArms) =
JsObject(
- "id" -> obj.intervention.id.toJson,
- "name" -> obj.intervention.name.toJson,
- "typeId" -> obj.intervention.typeId.toJson,
- "description" -> obj.intervention.description.toJson,
- "isActive" -> obj.intervention.isActive.toJson,
- "arms" -> obj.arms.map(_.armId).toJson,
- "trialId" -> obj.intervention.trialId.toJson,
- "originalName" -> obj.intervention.originalName.toJson,
- "originalDescription" -> obj.intervention.originalDescription.toJson,
- "originalType" -> obj.intervention.originalType.toJson
+ "id" -> obj.intervention.id.toJson,
+ "name" -> obj.intervention.name.toJson,
+ "typeId" -> obj.intervention.typeId.toJson,
+ "dosage" -> obj.intervention.dosage.toJson,
+ "isActive" -> obj.intervention.isActive.toJson,
+ "arms" -> obj.arms.map(_.armId).toJson,
+ "trialId" -> obj.intervention.trialId.toJson,
+ "originalName" -> obj.intervention.originalName.toJson,
+ "originalDosage" -> obj.intervention.originalDosage.toJson,
+ "originalType" -> obj.intervention.originalType.toJson
)
}
@@ -30,8 +30,8 @@ object intervention {
.get("typeId")
.map(_.convertTo[LongId[InterventionType]])
- val description = fields
- .get("description")
+ val dosage = fields
+ .get("dosage")
.map(_.convertTo[String])
val isActive = fields
@@ -46,7 +46,7 @@ object intervention {
orig.copy(
intervention = origIntervention.copy(
typeId = typeId.orElse(origIntervention.typeId),
- description = description.getOrElse(origIntervention.description),
+ dosage = dosage.getOrElse(origIntervention.dosage),
isActive = isActive.getOrElse(origIntervention.isActive)
),
arms = arms.getOrElse(orig.arms)
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/providerttype.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/providerttype.scala
new file mode 100644
index 0000000..385feb2
--- /dev/null
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/providerttype.scala
@@ -0,0 +1,12 @@
+package xyz.driver.pdsuidomain.formats.json.sprayformats
+
+import spray.json._
+import xyz.driver.pdsuidomain.entities.ProviderType
+
+object providertype {
+ import DefaultJsonProtocol._
+ import common._
+
+ implicit val providerTypeFormat: RootJsonFormat[ProviderType] = jsonFormat2(ProviderType.apply)
+
+}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/recordissue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/recordissue.scala
index 4ae04d0..4ac5f6d 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/recordissue.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/sprayformats/recordissue.scala
@@ -63,17 +63,6 @@ object recordissue {
case _ => deserializationError(s"Expected Json Object as MedicalRecordIssue, but got $json")
}
- implicit val recordIssueWriter = new JsonWriter[MedicalRecordIssue] {
- override def write(obj: MedicalRecordIssue) = JsObject(
- "id" -> obj.id.toJson,
- "startPage" -> obj.startPage.toJson,
- "endPage" -> obj.endPage.toJson,
- "text" -> obj.text.toJson,
- "lastUpdate" -> obj.lastUpdate.toJson,
- "userId" -> obj.userId.toJson,
- "isDraft" -> obj.isDraft.toJson,
- "archiveRequired" -> obj.archiveRequired.toJson
- )
- }
+ implicit val recordIssueFormat = jsonFormat9(MedicalRecordIssue.apply)
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue/ApiTrialIssue.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue/ApiTrialIssue.scala
index 852c4f6..c9475c6 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue/ApiTrialIssue.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trialissue/ApiTrialIssue.scala
@@ -4,20 +4,37 @@ import java.time.{ZoneId, ZonedDateTime}
import play.api.libs.functional.syntax._
import play.api.libs.json._
+import xyz.driver.pdsuicommon.domain._
import xyz.driver.pdsuidomain.entities.TrialIssue
final case class ApiTrialIssue(id: Long,
+ trialId: String,
text: String,
lastUpdate: ZonedDateTime,
userId: String,
isDraft: Boolean,
evidence: String,
archiveRequired: Boolean,
- meta: String)
+ meta: String) {
+
+ def toDomain = TrialIssue(
+ id = LongId(this.id),
+ trialId = StringId(this.trialId),
+ text = this.text,
+ userId = StringId(this.userId),
+ lastUpdate = this.lastUpdate.toLocalDateTime,
+ isDraft = this.isDraft,
+ evidence = this.evidence,
+ archiveRequired = this.archiveRequired,
+ meta = this.meta
+ )
+
+}
object ApiTrialIssue {
implicit val format: Format[ApiTrialIssue] = (
(JsPath \ "id").format[Long] and
+ (JsPath \ "trialId").format[String] and
(JsPath \ "text").format[String] and
(JsPath \ "lastUpdate").format[ZonedDateTime] and
(JsPath \ "userId").format[String] and
@@ -31,6 +48,7 @@ object ApiTrialIssue {
def fromDomain(x: TrialIssue) = ApiTrialIssue(
id = x.id.id,
+ trialId = x.trialId.id,
text = x.text,
lastUpdate = ZonedDateTime.of(x.lastUpdate, ZoneId.of("Z")),
userId = x.userId.id,
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/TrialService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/TrialService.scala
index d140d27..5bd99a8 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/TrialService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/TrialService.scala
@@ -2,13 +2,15 @@ package xyz.driver.pdsuidomain.services
import java.time.LocalDateTime
+import akka.NotUsed
+import akka.stream.scaladsl.Source
+import akka.util.ByteString
import xyz.driver.pdsuicommon.auth.AuthenticatedRequestContext
import xyz.driver.pdsuicommon.db._
import xyz.driver.pdsuicommon.domain.StringId
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
@@ -66,24 +68,6 @@ object TrialService {
extends GetTrialWithLabelsReply with DomainError.AuthorizationError with DefaultAccessDeniedError
}
- sealed trait GetPdfSourceReply
- object GetPdfSourceReply {
- type Error = GetPdfSourceReply with DomainError
-
- final case class Entity(x: PdfSource) extends GetPdfSourceReply
-
- case object AuthorizationError
- extends GetPdfSourceReply with DomainError.AuthorizationError with DefaultAccessDeniedError
-
- case object NotFoundError extends GetPdfSourceReply with DomainError.NotFoundError {
- def userMessage: String = "Trial's PDF hasn't been found"
- }
-
- case object TrialNotFoundError extends GetPdfSourceReply with DomainError.NotFoundError with DefaultNotFoundError
-
- final case class CommonError(userMessage: String) extends GetPdfSourceReply with DomainError
- }
-
sealed trait UpdateReply
object UpdateReply {
type Error = UpdateReply with DomainError
@@ -114,7 +98,7 @@ trait TrialService {
implicit requestContext: AuthenticatedRequestContext): Future[GetTrialWithLabelsReply]
def getPdfSource(trialId: StringId[Trial])(
- implicit requestContext: AuthenticatedRequestContext): Future[GetPdfSourceReply]
+ implicit requestContext: AuthenticatedRequestContext): Future[Source[ByteString, NotUsed]]
def getAll(filter: SearchFilterExpr = SearchFilterExpr.Empty,
sorting: Option[Sorting] = None,
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 7c0e313..3793c1f 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/fake/FakeTrialService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/fake/FakeTrialService.scala
@@ -2,6 +2,9 @@ package xyz.driver.pdsuidomain.services.fake
import java.time.LocalDateTime
+import akka.NotUsed
+import akka.stream.scaladsl.Source
+import akka.util.ByteString
import xyz.driver.core.generators
import xyz.driver.pdsuicommon.auth.AuthenticatedRequestContext
import xyz.driver.pdsuicommon.db._
@@ -44,7 +47,7 @@ class FakeTrialService extends TrialService {
)
def getPdfSource(trialId: StringId[Trial])(
- implicit requestContext: AuthenticatedRequestContext): Future[GetPdfSourceReply] =
+ implicit requestContext: AuthenticatedRequestContext): Future[Source[ByteString, NotUsed]] =
Future.failed(new NotImplementedError("fake pdf download is not implemented"))
def getAll(filter: SearchFilterExpr = SearchFilterExpr.Empty,
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 9f72760..f826b98 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala
@@ -1,6 +1,9 @@
package xyz.driver.pdsuidomain.services.rest
import scala.concurrent.{ExecutionContext, Future}
+import akka.NotUsed
+import akka.stream.scaladsl.Source
+import akka.util.ByteString
import akka.http.scaladsl.marshalling.Marshal
import akka.http.scaladsl.model._
import akka.stream.Materializer
@@ -43,8 +46,15 @@ class RestTrialService(transport: ServiceTransport, baseUri: Uri)(implicit prote
}
def getPdfSource(trialId: StringId[Trial])(
- implicit requestContext: AuthenticatedRequestContext): Future[GetPdfSourceReply] =
- Future.failed(new NotImplementedError("Streaming PDF over network is not supported."))
+ implicit requestContext: AuthenticatedRequestContext): Future[Source[ByteString, NotUsed]] = {
+ val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/trial/${trialId}/source"))
+ for {
+ response <- transport.sendRequestGetResponse(requestContext)(request)
+ reply <- apiResponse[HttpEntity](response)
+ } yield {
+ reply.dataBytes.mapMaterializedValue(_ => NotUsed)
+ }
+ }
def getAll(filter: SearchFilterExpr = SearchFilterExpr.Empty,
sorting: Option[Sorting] = None,