diff options
Diffstat (limited to 'src/main/scala/xyz/driver/pdsuidomain')
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, |