From 6747b5dabfececf64ec596ec830f979404445f47 Mon Sep 17 00:00:00 2001 From: vlad Date: Wed, 17 Jan 2018 15:57:08 -0800 Subject: TRIAL-192, TRIAL-159 Trial model simplification to support Trial Synchronizer removal and the InterventionType's update for TRIAL-159 --- .../driver/pdsuidomain/entities/Intervention.scala | 16 +---- .../driver/pdsuidomain/entities/ScrapedTrial.scala | 81 ---------------------- .../xyz/driver/pdsuidomain/entities/Trial.scala | 16 ++++- .../pdsuidomain/fakes/entities/trialcuration.scala | 2 - .../driver/pdsuidomain/formats/json/trial.scala | 4 ++ .../services/ScrapedTrialsService.scala | 53 -------------- .../driver/pdsuidomain/services/TrialService.scala | 7 +- .../services/fake/FakeTrialService.scala | 12 +++- .../services/rest/RestTrialService.scala | 24 +++++++ 9 files changed, 59 insertions(+), 156 deletions(-) delete mode 100644 src/main/scala/xyz/driver/pdsuidomain/entities/ScrapedTrial.scala delete mode 100644 src/main/scala/xyz/driver/pdsuidomain/services/ScrapedTrialsService.scala 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..2713b4e 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[StudyDesign], + 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..7bbdda2 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial.scala @@ -12,6 +12,7 @@ object trial { import DefaultJsonProtocol._ import Trial._ import common._ + import studydesign._ implicit val trialStatusFormat: RootJsonFormat[Status] = new EnumJsonFormat[Status]( "New" -> Status.New, @@ -181,4 +182,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 + } + } } -- cgit v1.2.3 From 216c72fedb793e5bdb40c38126b47993bbe25187 Mon Sep 17 00:00:00 2001 From: vlad Date: Wed, 17 Jan 2018 20:02:33 -0800 Subject: TRIAL-192, TRIAL-159 Trial model simplification to support Trial Synchronizer removal and the InterventionType's update for TRIAL-159 --- build.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sbt b/build.sbt index b016378..cc7cc29 100644 --- a/build.sbt +++ b/build.sbt @@ -14,7 +14,7 @@ lazy val core = (project in file(".")) "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" %% "domain-model" % "0.20.0", "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", -- cgit v1.2.3 From 39d3c6bf58d5e386fe0f354e16f487f316e86774 Mon Sep 17 00:00:00 2001 From: vlad Date: Wed, 17 Jan 2018 20:17:05 -0800 Subject: Updating Driver utils --- build.sbt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index cc7cc29..888e17d 100644 --- a/build.sbt +++ b/build.sbt @@ -13,8 +13,8 @@ lazy val core = (project in file(".")) "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.20.0", + "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", -- cgit v1.2.3 From 1cda54833c6083020ba20944319e6fb03ecfd419 Mon Sep 17 00:00:00 2001 From: vlad Date: Thu, 18 Jan 2018 15:42:50 -0800 Subject: Removing Quill completely from the pdsui-common --- build.sbt | 1 - .../driver/pdsuicommon/db/PostgresContext.scala | 72 ---------------------- src/test/scala/xyz/driver/pdsuicommon/Mocks.scala | 61 ------------------ 3 files changed, 134 deletions(-) delete mode 100644 src/main/scala/xyz/driver/pdsuicommon/db/PostgresContext.scala delete mode 100644 src/test/scala/xyz/driver/pdsuicommon/Mocks.scala diff --git a/build.sbt b/build.sbt index 888e17d..8f2198d 100644 --- a/build.sbt +++ b/build.sbt @@ -11,7 +11,6 @@ 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.12", "xyz.driver" %% "domain-model" % "0.21.16", 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/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) - } -} -- cgit v1.2.3 From fc8c61fb50742435322e43a6d484c1fc19945f50 Mon Sep 17 00:00:00 2001 From: vlad Date: Thu, 18 Jan 2018 19:53:52 -0800 Subject: Untyping the original trial's study design --- src/main/scala/xyz/driver/pdsuidomain/entities/Trial.scala | 2 +- src/main/scala/xyz/driver/pdsuidomain/formats/json/trial.scala | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/scala/xyz/driver/pdsuidomain/entities/Trial.scala b/src/main/scala/xyz/driver/pdsuidomain/entities/Trial.scala index 2713b4e..55c0e96 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/entities/Trial.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/entities/Trial.scala @@ -58,7 +58,7 @@ final case class TrialCreationRequest(id: UuidId[Trial], nctId: String, title: Option[String], phase: String, - studyDesign: Option[StudyDesign], + studyDesign: Option[String], lastReviewed: LocalDateTime) object Trial { 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 7bbdda2..c04cf28 100644 --- a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial.scala +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial.scala @@ -12,7 +12,6 @@ object trial { import DefaultJsonProtocol._ import Trial._ import common._ - import studydesign._ implicit val trialStatusFormat: RootJsonFormat[Status] = new EnumJsonFormat[Status]( "New" -> Status.New, -- cgit v1.2.3 From 61bb1951da84446b7c81ea56884476fa1237a91e Mon Sep 17 00:00:00 2001 From: vlad Date: Thu, 18 Jan 2018 20:21:34 -0800 Subject: Removing the PDF Renderer from common --- .../xyz/driver/pdsuicommon/pdf/PdfRenderer.scala | 12 --- .../pdsuicommon/pdf/WkHtmlToPdfRenderer.scala | 105 --------------------- .../driver/pdsuicommon/pdf/MockPdfRenderer.scala | 25 ----- 3 files changed, 142 deletions(-) delete mode 100644 src/main/scala/xyz/driver/pdsuicommon/pdf/PdfRenderer.scala delete mode 100644 src/main/scala/xyz/driver/pdsuicommon/pdf/WkHtmlToPdfRenderer.scala delete mode 100644 src/test/scala/xyz/driver/pdsuicommon/pdf/MockPdfRenderer.scala 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/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 - -} -- cgit v1.2.3