aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVlad Uspensky <v.uspenskiy@icloud.com>2018-01-23 17:37:35 -0800
committerGitHub <noreply@github.com>2018-01-23 17:37:35 -0800
commitcf397367e2d8e0da371aae22a2d41578b8f48e44 (patch)
tree7440d630fea2205102ac7d40995b5588f0cdd3f9
parent1fa8b54fee10c09485a2d098ddb5e0013f4205b2 (diff)
parent61bb1951da84446b7c81ea56884476fa1237a91e (diff)
downloadrest-query-cf397367e2d8e0da371aae22a2d41578b8f48e44.tar.gz
rest-query-cf397367e2d8e0da371aae22a2d41578b8f48e44.tar.bz2
rest-query-cf397367e2d8e0da371aae22a2d41578b8f48e44.zip
Merge pull request #77 from drivergroup/TRIAL-192v0.15.2
TRIAL-192, TRIAL-159 Trial model simplification to support Trial Sync…
-rw-r--r--build.sbt5
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/db/PostgresContext.scala72
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/pdf/PdfRenderer.scala12
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/pdf/WkHtmlToPdfRenderer.scala105
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/entities/Intervention.scala16
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/entities/ScrapedTrial.scala81
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/entities/Trial.scala16
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/fakes/entities/trialcuration.scala2
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/formats/json/trial.scala3
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/ScrapedTrialsService.scala53
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/TrialService.scala7
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/fake/FakeTrialService.scala12
-rw-r--r--src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala24
-rw-r--r--src/test/scala/xyz/driver/pdsuicommon/Mocks.scala61
-rw-r--r--src/test/scala/xyz/driver/pdsuicommon/pdf/MockPdfRenderer.scala25
15 files changed, 60 insertions, 434 deletions
diff --git a/build.sbt b/build.sbt
index b016378..8f2198d 100644
--- a/build.sbt
+++ b/build.sbt
@@ -11,10 +11,9 @@ lazy val core = (project in file("."))
"com.lihaoyi" %% "fastparse" % "1.0.0",
"com.typesafe.akka" %% "akka-http" % "10.0.10",
"com.typesafe.scala-logging" %% "scala-logging" % "3.5.0",
- "io.getquill" %% "quill-jdbc" % "1.2.1",
"io.github.cloudify" %% "spdf" % "1.4.0",
- "xyz.driver" %% "core" % "1.6.5",
- "xyz.driver" %% "domain-model" % "0.19.4",
+ "xyz.driver" %% "core" % "1.6.12",
+ "xyz.driver" %% "domain-model" % "0.21.16",
"ch.qos.logback" % "logback-classic" % "1.1.7",
"com.fasterxml.jackson.datatype" % "jackson-datatype-jsr310" % "2.8.4",
"com.github.spullara.mustache.java" % "scala-extensions-2.11" % "0.9.4",
diff --git a/src/main/scala/xyz/driver/pdsuicommon/db/PostgresContext.scala b/src/main/scala/xyz/driver/pdsuicommon/db/PostgresContext.scala
deleted file mode 100644
index 0098a64..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/db/PostgresContext.scala
+++ /dev/null
@@ -1,72 +0,0 @@
-package xyz.driver.pdsuicommon.db
-
-import java.io.Closeable
-import java.time.{LocalDateTime, ZoneOffset}
-import java.util.UUID
-import java.util.concurrent.Executors
-import javax.sql.DataSource
-
-import io.getquill._
-import xyz.driver.pdsuicommon.concurrent.MdcExecutionContext
-import xyz.driver.pdsuicommon.db.PostgresContext.Settings
-import xyz.driver.pdsuicommon.domain.UuidId
-import xyz.driver.pdsuicommon.logging._
-
-import scala.concurrent.ExecutionContext
-import scala.util.control.NonFatal
-import scala.util.{Failure, Success, Try}
-
-object PostgresContext extends PhiLogging {
-
- final case class Settings(connection: com.typesafe.config.Config,
- connectionAttemptsOnStartup: Int,
- threadPoolSize: Int)
-
- def apply(settings: Settings): PostgresContext = {
- // Prevent leaking credentials to a log
- Try(JdbcContextConfig(settings.connection).dataSource) match {
- case Success(dataSource) => new PostgresContext(dataSource, settings)
- case Failure(NonFatal(e)) =>
- logger.error(phi"Can not load dataSource, error: ${Unsafe(e.getClass.getName)}")
- throw new IllegalArgumentException("Can not load dataSource from config. Check your database and config", e)
- }
- }
-
-}
-
-class PostgresContext(val dataSource: DataSource with Closeable, settings: Settings)
- extends PostgresJdbcContext[SnakeCase](dataSource) with TransactionalContext {
-
- private val tpe = Executors.newFixedThreadPool(settings.threadPoolSize)
-
- implicit val executionContext: ExecutionContext = {
- val orig = ExecutionContext.fromExecutor(tpe)
- MdcExecutionContext.from(orig)
- }
-
- override def close(): Unit = {
- super.close()
- tpe.shutdownNow()
- }
-
- /**
- * Usable for QueryBuilder's extractors
- */
- def timestampToLocalDateTime(timestamp: java.sql.Timestamp): LocalDateTime = {
- LocalDateTime.ofInstant(timestamp.toInstant, ZoneOffset.UTC)
- }
-
- implicit def encodeUuidId[T] = MappedEncoding[UuidId[T], String](_.toString)
- implicit def decodeUuidId[T] = MappedEncoding[String, UuidId[T]] { uuid =>
- UuidId[T](UUID.fromString(uuid))
- }
-
- def decodeOptUuidId[T] = MappedEncoding[Option[String], Option[UuidId[T]]] {
- case Some(x) => Option(x).map(y => UuidId[T](UUID.fromString(y)))
- case None => None
- }
-
- implicit def decodeUuid[T] = MappedEncoding[String, UUID] { uuid =>
- UUID.fromString(uuid)
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/pdf/PdfRenderer.scala b/src/main/scala/xyz/driver/pdsuicommon/pdf/PdfRenderer.scala
deleted file mode 100644
index 93be2cc..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/pdf/PdfRenderer.scala
+++ /dev/null
@@ -1,12 +0,0 @@
-package xyz.driver.pdsuicommon.pdf
-
-import java.nio.file.Path
-
-trait PdfRenderer {
-
- def render(html: String, documentName: String, force: Boolean = false): Path
-
- def delete(documentName: String): Unit
-
- def getPath(fileName: String): Path
-}
diff --git a/src/main/scala/xyz/driver/pdsuicommon/pdf/WkHtmlToPdfRenderer.scala b/src/main/scala/xyz/driver/pdsuicommon/pdf/WkHtmlToPdfRenderer.scala
deleted file mode 100644
index 8141b7f..0000000
--- a/src/main/scala/xyz/driver/pdsuicommon/pdf/WkHtmlToPdfRenderer.scala
+++ /dev/null
@@ -1,105 +0,0 @@
-package xyz.driver.pdsuicommon.pdf
-
-import java.io.IOException
-import java.nio.file._
-
-import io.github.cloudify.scala.spdf._
-import xyz.driver.pdsuicommon.logging._
-import xyz.driver.pdsuicommon.pdf.WkHtmlToPdfRenderer.Settings
-
-object WkHtmlToPdfRenderer {
-
- final case class Settings(downloadsDir: String) {
-
- lazy val downloadsPath: Path = getPathFrom(downloadsDir)
-
- private def getPathFrom(x: String): Path = {
- val dirPath =
- if (x.startsWith("/")) Paths.get(x)
- else {
- val workingDir = Paths.get(".")
- workingDir.resolve(x)
- }
-
- dirPath.toAbsolutePath.normalize()
- }
- }
-}
-
-class WkHtmlToPdfRenderer(settings: Settings) extends PdfRenderer with PhiLogging {
-
- private val pdf = Pdf(new PdfConfig {
- disableJavascript := true
- disableExternalLinks := true
- disableInternalLinks := true
- printMediaType := Some(true)
- orientation := Portrait
- pageSize := "A4"
- lowQuality := true
- })
-
- override def render(html: String, documentName: String, force: Boolean = false): Path = {
- checkedCreate(html, documentName, force)
- }
-
- override def delete(documentName: String): Unit = {
- logger.trace(phi"delete(${Unsafe(documentName)})")
-
- val file = getPath(documentName)
- logger.debug(phi"File: $file")
- if (Files.deleteIfExists(file)) {
- logger.info(phi"Deleted")
- } else {
- logger.warn(phi"Doesn't exist")
- }
- }
-
- override def getPath(documentName: String): Path = {
- settings.downloadsPath.resolve(s"$documentName.pdf").toAbsolutePath
- }
-
- protected def checkedCreate[SourceT: SourceDocumentLike](src: SourceT, fileName: String, force: Boolean): Path = {
- logger.trace(phi"checkedCreate(fileName=${Unsafe(fileName)}, force=$force)")
-
- val dest = getPath(fileName)
- logger.debug(phi"Destination file: $dest")
-
- if (force || !dest.toFile.exists()) {
- logger.trace(phi"Force refresh the file")
- val newDocPath = forceCreate(src, dest)
- logger.info(phi"Updated")
- newDocPath
- } else if (dest.toFile.exists()) {
- logger.trace(phi"Already exists")
- dest
- } else {
- logger.trace(phi"The file does not exist")
- val newDocPath = forceCreate(src, dest)
- logger.info(phi"Created")
- newDocPath
- }
- }
-
- protected def forceCreate[SourceT: SourceDocumentLike](src: SourceT, dest: Path): Path = {
- logger.trace(phi"forceCreate[${Unsafe(src.getClass.getName)}](dest=$dest)")
-
- val destTemp = Files.createTempFile("driver", ".pdf")
- val destTempFile = destTemp.toFile
-
- Files.createDirectories(dest.getParent)
-
- val retCode = pdf.run(src, destTempFile)
- lazy val pdfSize = destTempFile.length()
- if (retCode != 0) {
- // Try to google "wkhtmltopdf returns {retCode}"
- throw new IOException(s"Can create the document, the return code is $retCode")
- } else if (pdfSize == 0) {
- // Anything could happen, e.g. https://github.com/wkhtmltopdf/wkhtmltopdf/issues/2540
- throw new IOException("The pdf is empty")
- } else {
- logger.debug(phi"Size: ${Unsafe(pdfSize)}B")
- Files.move(destTemp, dest, StandardCopyOption.REPLACE_EXISTING)
- dest
- }
- }
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/Intervention.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/Intervention.scala
index 5e743b7..be51e4f 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/entities/Intervention.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/entities/Intervention.scala
@@ -16,12 +16,6 @@ sealed trait InterventionType {
object InterventionType {
- final case object RadiationTherapy extends InterventionType {
- val id: LongId[InterventionType] = LongId[InterventionType](1)
- val name: String = "Radiation therapy"
- val deliveryMethods: Set[DeliveryMethod] = commonMethods
- }
-
final case object Chemotherapy extends InterventionType {
val id: LongId[InterventionType] = LongId[InterventionType](2)
val name: String = "Chemotherapy"
@@ -40,12 +34,6 @@ object InterventionType {
val deliveryMethods: Set[DeliveryMethod] = commonMethods
}
- final case object Surgery extends InterventionType {
- val id: LongId[InterventionType] = LongId[InterventionType](5)
- val name: String = "Surgery"
- val deliveryMethods: Set[DeliveryMethod] = commonMethods
- }
-
final case object HormoneTherapy extends InterventionType {
val id: LongId[InterventionType] = LongId[InterventionType](6)
val name: String = "Hormone therapy"
@@ -152,7 +140,7 @@ object InterventionType {
}
}
- val commonMethods = Set[DeliveryMethod](
+ val commonMethods: Set[DeliveryMethod] = Set[DeliveryMethod](
IntravenousInfusionIV,
IntramuscularInjection,
SubcutaneousInjection,
@@ -166,11 +154,9 @@ object InterventionType {
)
val All: Map[LongId[InterventionType], InterventionType] = Map[LongId[InterventionType], InterventionType](
- LongId[InterventionType](1) -> RadiationTherapy,
LongId[InterventionType](2) -> Chemotherapy,
LongId[InterventionType](3) -> TargetedTherapy,
LongId[InterventionType](4) -> Immunotherapy,
- LongId[InterventionType](5) -> Surgery,
LongId[InterventionType](6) -> HormoneTherapy,
LongId[InterventionType](7) -> Other,
LongId[InterventionType](8) -> Radiation,
diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/ScrapedTrial.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/ScrapedTrial.scala
deleted file mode 100644
index e7ee1cb..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/entities/ScrapedTrial.scala
+++ /dev/null
@@ -1,81 +0,0 @@
-package xyz.driver.pdsuidomain.entities
-
-import java.time.LocalDateTime
-import java.util.UUID
-
-import xyz.driver.pdsuicommon.logging._
-import xyz.driver.pdsuicommon.domain.UuidId
-
-final case class ScrapedStudyDesign(value: String)
-
-final case class ScrapedOverall(affiliation: String,
- status: String,
- facilityName: Option[String],
- firstName: Option[String],
- lastName: Option[String],
- phone: Option[String],
- phoneExt: Option[String],
- email: Option[String],
- isBackup: Boolean)
-
-final case class ScrapedInterventionType(value: String)
-
-final case class ScrapedIntervention(name: String,
- kind: ScrapedInterventionType,
- description: Option[String],
- isSynonym: Boolean)
-
-object ScrapedIntervention {
-
- implicit def toPhiString(x: ScrapedIntervention): PhiString =
- phi"ScrapedIntervention(${Unsafe(x.name)})"
-}
-
-final case class ScrapedArm(name: String, kind: Option[String], interventions: Set[ScrapedIntervention])
-
-object ScrapedArm {
-
- implicit def toPhiString(x: ScrapedArm): PhiString = {
- import x._
- phi"ScrapedArm(name=${Unsafe(name)}, inverventions=$interventions)"
- }
-}
-
-final case class ScrapedTrialChecksum(eligibilityCriteria: String,
- briefSummary: String,
- detailedDescription: String,
- armDescription: String)
-
-object ScrapedTrialChecksum {
-
- implicit def toPhiString(x: ScrapedTrialChecksum): PhiString = {
- import x._
- phi"ScrapedTrialChecksum(eligibilityCriteria=${Unsafe(eligibilityCriteria)}, briefSummary=${Unsafe(briefSummary)}, " +
- phi"detailedDescription=${Unsafe(detailedDescription)}, armDescription=${Unsafe(armDescription)}"
- }
-}
-
-object ScrapedTrial {
-
- implicit def toPhiString(x: ScrapedTrial): PhiString = {
- import x._
- phi"ScrapedTrial(rawId=$rawId, nctId=${Unsafe(nctId)}, arms=$arms, checksum=$checksum)"
- }
-}
-
-final case class ScrapedTrial(rawId: UuidId[ScrapedTrial],
- createdAt: LocalDateTime,
- disease: String,
- nctId: String,
- nctUuid: UUID,
- title: Option[String],
- startDate: Option[LocalDateTime],
- phase: String,
- studyDesign: Option[ScrapedStudyDesign],
- overall: Set[ScrapedOverall],
- // // see ClinicalTrialRaw
- // trialHtml: String,
- // eligibilityText: String,
- lastReviewed: LocalDateTime,
- arms: Set[ScrapedArm],
- checksum: ScrapedTrialChecksum)
diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/Trial.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/Trial.scala
index cb75803..55c0e96 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/entities/Trial.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/entities/Trial.scala
@@ -49,6 +49,18 @@ object StudyDesign {
}
}
+object TrialCreationRequest {
+
+ implicit def toPhiString(x: TrialCreationRequest): PhiString = phi"${Unsafe(x.toString)}"
+}
+
+final case class TrialCreationRequest(id: UuidId[Trial],
+ nctId: String,
+ title: Option[String],
+ phase: String,
+ studyDesign: Option[String],
+ lastReviewed: LocalDateTime)
+
object Trial {
sealed trait Status {
@@ -67,7 +79,7 @@ object Trial {
case object Flagged extends Status
case object Archived extends Status
- val All = Set[Status](
+ val All: Set[Status] = Set[Status](
New,
ReviewSummary,
Summarized,
@@ -79,7 +91,7 @@ object Trial {
Archived
)
- val AllPrevious = Set[Status](New, ReviewSummary, Summarized, ReviewCriteria)
+ val AllPrevious: Set[Status] = Set[Status](New, ReviewSummary, Summarized, ReviewCriteria)
implicit def toPhiString(x: Status): PhiString = Unsafe(Utils.getClassSimpleName(x.getClass))
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/trialcuration.scala b/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/trialcuration.scala
index 1e4ad51..925a019 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/trialcuration.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/fakes/entities/trialcuration.scala
@@ -137,11 +137,9 @@ object trialcuration {
def nextStudyDesign(): StudyDesign = generators.oneOf[StudyDesign](StudyDesign.All: _*)
def nextInterventionType(): InterventionType = generators.oneOf[InterventionType](
- RadiationTherapy,
Chemotherapy,
TargetedTherapy,
Immunotherapy,
- Surgery,
HormoneTherapy,
Other,
Radiation,
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial.scala
index 0b5de6b..c04cf28 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial.scala
@@ -181,4 +181,7 @@ object trial {
case _ => deserializationError(s"Expected Json Object as Trial, but got $json")
}
+ implicit val trialCreationRequestFormat: RootJsonFormat[TrialCreationRequest] =
+ jsonFormat6(TrialCreationRequest.apply)
+
}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/ScrapedTrialsService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/ScrapedTrialsService.scala
deleted file mode 100644
index 233495e..0000000
--- a/src/main/scala/xyz/driver/pdsuidomain/services/ScrapedTrialsService.scala
+++ /dev/null
@@ -1,53 +0,0 @@
-package xyz.driver.pdsuidomain.services
-
-import xyz.driver.pdsuicommon.error.DomainError
-import xyz.driver.pdsuidomain.entities.ScrapedTrial
-
-import scala.concurrent.Future
-
-object ScrapedTrialsService {
-
- sealed trait GetRawTrialReply
- object GetRawTrialReply {
- type Error = GetRawTrialReply with DomainError
-
- final case class TrialRawEntity(rawTrial: ScrapedTrial) extends GetRawTrialReply
-
- case object NotFoundError extends GetRawTrialReply with DomainError.NotFoundError {
- override def userMessage: String = "Raw clinical trial not found"
- }
- }
-
- sealed trait GetRawTrialOptReply
- object GetRawTrialOptReply {
- final case class TrialRawEntity(rawTrial: Option[ScrapedTrial]) extends GetRawTrialOptReply
- }
-
- sealed trait GetAllRawTrialsExceptReply
- object GetAllRawTrialsExceptReply {
- final case class MultipleRawTrials(rawTrials: Seq[ScrapedTrial]) extends GetAllRawTrialsExceptReply
- }
-
- sealed trait GetHtmlForReply
- object GetHtmlForReply {
- type TrialHtmlMap = Map[String, String]
-
- /**
- * @param trialHtmlMap nctId -> html
- */
- final case class HtmlMap(trialHtmlMap: TrialHtmlMap) extends GetHtmlForReply
- }
-}
-
-trait ScrapedTrialsService {
-
- import ScrapedTrialsService._
-
- def getRawTrial(nctId: String): Future[GetRawTrialReply]
-
- def getRawTrialOpt(nctId: String): Future[GetRawTrialOptReply]
-
- def getAllRawTrialsExcept(nctIds: Seq[String], limit: Int): Future[GetAllRawTrialsExceptReply]
-
- def getHtmlFor(nctIds: Set[String]): Future[GetHtmlForReply]
-}
diff --git a/src/main/scala/xyz/driver/pdsuidomain/services/TrialService.scala b/src/main/scala/xyz/driver/pdsuidomain/services/TrialService.scala
index 4d61342..9ae1c10 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/TrialService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/TrialService.scala
@@ -12,7 +12,7 @@ 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, TrialCreationRequest}
import xyz.driver.pdsuidomain.entities.export.trial.ExportTrialWithLabels
import scala.concurrent.Future
@@ -121,6 +121,9 @@ trait TrialService {
def getPdfSource(trialId: StringId[Trial])(
implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[Source[ByteString, NotUsed]]
+ def getHtmlSource(trialId: StringId[Trial])(
+ implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[Source[ByteString, NotUsed]]
+
def getAll(filter: SearchFilterExpr = SearchFilterExpr.Empty,
sorting: Option[Sorting] = None,
pagination: Option[Pagination] = None)(
@@ -150,4 +153,6 @@ trait TrialService {
def unassign(origTrial: Trial)(
implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[UpdateReply]
+ def addTrial(trial: TrialCreationRequest)(
+ implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[Trial]
}
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 7d44309..221e56c 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/fake/FakeTrialService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/fake/FakeTrialService.scala
@@ -13,7 +13,7 @@ import xyz.driver.entities.users.AuthUserInfo
import xyz.driver.pdsuicommon.db._
import xyz.driver.pdsuicommon.domain.{LongId, StringId, UuidId}
import xyz.driver.pdsuidomain.entities.export.trial.{ExportTrialArm, ExportTrialLabelCriterion, ExportTrialWithLabels}
-import xyz.driver.pdsuidomain.entities.{Criterion, EligibilityArm, Trial}
+import xyz.driver.pdsuidomain.entities._
import xyz.driver.pdsuidomain.services.TrialService
import scala.concurrent.Future
@@ -52,7 +52,12 @@ class FakeTrialService extends TrialService {
def getPdfSource(trialId: StringId[Trial])(
implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]
): Future[Source[ByteString, NotUsed]] =
- Future.failed(new NotImplementedError("fake pdf download is not implemented"))
+ Future.failed(new NotImplementedError("fake PDF download is not implemented"))
+
+ def getHtmlSource(trialId: StringId[Trial])(
+ implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]
+ ): Future[Source[ByteString, NotUsed]] =
+ Future.failed(new NotImplementedError("fake HTML download is not implemented"))
def getAll(filter: SearchFilterExpr = SearchFilterExpr.Empty,
sorting: Option[Sorting] = None,
@@ -125,4 +130,7 @@ class FakeTrialService extends TrialService {
implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[UpdateReply] =
update(origTrial, origTrial)
+ def addTrial(newTrial: TrialCreationRequest)(
+ implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[Trial] =
+ Future.successful(trial)
}
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 6650d51..94e1c63 100644
--- a/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala
+++ b/src/main/scala/xyz/driver/pdsuidomain/services/rest/RestTrialService.scala
@@ -73,6 +73,18 @@ class RestTrialService(transport: ServiceTransport, baseUri: Uri)(implicit prote
}
}
+ def getHtmlSource(trialId: StringId[Trial])(
+ implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]
+ ): Future[Source[ByteString, NotUsed]] = {
+ val request = HttpRequest(HttpMethods.GET, endpointUri(baseUri, s"/v1/trial/$trialId/source.html"))
+ 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,
pagination: Option[Pagination] = None)(
@@ -146,4 +158,16 @@ class RestTrialService(transport: ServiceTransport, baseUri: Uri)(implicit prote
def unassign(origTrial: Trial)(
implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[UpdateReply] =
singleAction(origTrial, "unassign")
+
+ override def addTrial(trial: TrialCreationRequest)(
+ implicit requestContext: AuthorizedServiceRequestContext[AuthUserInfo]): Future[Trial] = {
+ for {
+ entity <- Marshal(trial).to[RequestEntity]
+ request = HttpRequest(HttpMethods.POST, endpointUri(baseUri, s"/v1/trial/${trial.nctId}")).withEntity(entity)
+ response <- transport.sendRequestGetResponse(requestContext)(request)
+ reply <- apiResponse[Trial](response)
+ } yield {
+ reply
+ }
+ }
}
diff --git a/src/test/scala/xyz/driver/pdsuicommon/Mocks.scala b/src/test/scala/xyz/driver/pdsuicommon/Mocks.scala
deleted file mode 100644
index 699020c..0000000
--- a/src/test/scala/xyz/driver/pdsuicommon/Mocks.scala
+++ /dev/null
@@ -1,61 +0,0 @@
-package xyz.driver.pdsuicommon
-
-import java.io.{Closeable, PrintWriter}
-import java.net.URL
-import java.sql.Connection
-import java.util.logging.Logger
-import javax.sql.DataSource
-
-import xyz.driver.pdsuicommon.db.SlickQueryBuilder.TableData
-import xyz.driver.pdsuicommon.db._
-import xyz.driver.pdsuicommon.http.HttpFetcher
-
-import scala.concurrent.Future
-
-class MockDataSource extends DataSource with Closeable {
- override def getConnection: Connection = throw new NotImplementedError("MockDataSource.getConnection")
- override def getConnection(username: String, password: String): Connection = {
- throw new NotImplementedError(s"MockDataSource.getConnection($username, $password)")
- }
- override def close(): Unit = throw new NotImplementedError("MockDataSource.close")
- override def setLogWriter(out: PrintWriter): Unit = throw new NotImplementedError("MockDataSource.setLogWriter")
- override def getLoginTimeout: Int = throw new NotImplementedError("MockDataSource.getLoginTimeout")
- override def setLoginTimeout(seconds: Int): Unit = throw new NotImplementedError("MockDataSource.setLoginTimeout")
- override def getParentLogger: Logger = throw new NotImplementedError("MockDataSource.getParentLogger")
- override def getLogWriter: PrintWriter = throw new NotImplementedError("MockDataSource.getLogWriter")
- override def unwrap[T](iface: Class[T]): T = throw new NotImplementedError("MockDataSource.unwrap")
- override def isWrapperFor(iface: Class[_]): Boolean = throw new NotImplementedError("MockDataSource.isWrapperFor")
-}
-
-class MockFactory()(implicit val sqlContext: PostgresContext) {
- val MockHttpFetcher: HttpFetcher = { (url: URL) =>
- Future.successful(Array.empty[Byte])
- }
-}
-
-object MockQueryBuilder {
-
- type MockRunnerIn = (SearchFilterExpr, Sorting, Option[Pagination])
- type MockRunnerOut[T] = Future[Seq[T]]
- type MockCountRunnerOut = SlickQueryBuilder.CountResult
-
- def apply[T](matcher: PartialFunction[MockRunnerIn, MockRunnerOut[T]])(
- countMatcher: PartialFunction[MockRunnerIn, MockCountRunnerOut])(
- implicit context: PostgresContext): SlickQueryBuilder[T] = {
-
- val runner: SlickQueryBuilder.Runner[T] = { parameters =>
- matcher((parameters.filter, parameters.sorting, parameters.pagination))
- }
-
- val countRunner: SlickQueryBuilder.CountRunner = { parameters =>
- countMatcher((parameters.filter, parameters.sorting, parameters.pagination))
- }
-
- val parameters = SlickPostgresQueryBuilderParameters(
- databaseName = "test",
- tableData = TableData("", None, Set.empty[String]),
- links = Map.empty
- )
- new SlickPostgresQueryBuilder(parameters)(runner, countRunner)
- }
-}
diff --git a/src/test/scala/xyz/driver/pdsuicommon/pdf/MockPdfRenderer.scala b/src/test/scala/xyz/driver/pdsuicommon/pdf/MockPdfRenderer.scala
deleted file mode 100644
index 8dfd29c..0000000
--- a/src/test/scala/xyz/driver/pdsuicommon/pdf/MockPdfRenderer.scala
+++ /dev/null
@@ -1,25 +0,0 @@
-package xyz.driver.pdsuicommon.pdf
-
-import java.nio.file.{Path, Paths}
-
-import xyz.driver.pdsuicommon.logging._
-
-object MockPdfRenderer extends PdfRenderer with PhiLogging {
-
- private lazy val defaultDocument: Path = {
- val uri = getClass.getResource("/pdf/example.pdf").toURI
- Paths.get(uri)
- }
-
- override def render(html: String, documentName: String, force: Boolean = false): Path = {
- logger.trace(phi"render(html, documentName=${Unsafe(documentName)})")
- defaultDocument
- }
-
- override def delete(documentName: String): Unit = {
- logger.trace(phi"delete(${Unsafe(documentName)})")
- }
-
- override def getPath(documentName: String): Path = defaultDocument
-
-}