diff options
Diffstat (limited to 'src/main/scala/xyz/driver/pdsuidomain/formats/json/trial')
3 files changed, 137 insertions, 0 deletions
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiPartialTrial.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiPartialTrial.scala new file mode 100644 index 0000000..0dc1446 --- /dev/null +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiPartialTrial.scala @@ -0,0 +1,44 @@ +package xyz.driver.pdsuidomain.formats.json.trial + +import java.util.UUID + +import xyz.driver.pdsuicommon.domain.{LongId, UuidId} +import xyz.driver.pdsuidomain.entities.Trial +import org.davidbild.tristate.Tristate +import org.davidbild.tristate.contrib.play.ToJsPathOpsFromJsPath +import play.api.libs.functional.syntax._ +import play.api.libs.json._ + +final case class ApiPartialTrial(hypothesisId: Tristate[UUID], + studyDesignId: Tristate[Long], + overview: Tristate[String], + title: Tristate[String]) { + + def applyTo(orig: Trial): Trial = { + orig.copy( + hypothesisId = hypothesisId.map(UuidId(_)).cata(Some(_), None, orig.hypothesisId), + studyDesignId = studyDesignId.map(LongId(_)).cata(Some(_), None, orig.studyDesignId), + overview = overview.cata(Some(_), None, orig.overview), + title = title.cata(Some(_).getOrElse(""), "", orig.title) + ) + } +} + +object ApiPartialTrial { + + private val reads: Reads[ApiPartialTrial] = ( + (JsPath \ "hypothesisId").readTristate[UUID] and + (JsPath \ "studyDesignId").readTristate[Long] and + (JsPath \ "overview").readTristate[String] and + (JsPath \ "title").readTristate[String] + ) (ApiPartialTrial.apply _) + + private val writes: Writes[ApiPartialTrial] = ( + (JsPath \ "hypothesisId").writeTristate[UUID] and + (JsPath \ "studyDesignId").writeTristate[Long] and + (JsPath \ "overview").writeTristate[String] and + (JsPath \ "title").writeTristate[String] + ) (unlift(ApiPartialTrial.unapply)) + + implicit val format: Format[ApiPartialTrial] = Format(reads, writes) +} diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiTrial.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiTrial.scala new file mode 100644 index 0000000..3267617 --- /dev/null +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/ApiTrial.scala @@ -0,0 +1,63 @@ +package xyz.driver.pdsuidomain.formats.json.trial + +import java.time.{ZoneId, ZonedDateTime} +import java.util.UUID + +import xyz.driver.pdsuidomain.entities.Trial +import play.api.libs.functional.syntax._ +import play.api.libs.json._ + +final case class ApiTrial(id: String, + lastUpdate: Option[ZonedDateTime], + status: String, + assignee: Option[Long], + previousStatus: Option[String], + previousAssignee: Option[Long], + condition: Option[String], + phase: Option[String], + hypothesisId: Option[UUID], + studyDesignId: Option[Long], + isPartner: Boolean, + overview: Option[String], + overviewTemplate: String, + isUpdated: Boolean, + title: String) + +object ApiTrial { + + implicit val format: Format[ApiTrial] = ( + (JsPath \ "id").format[String] and + (JsPath \ "lastUpdate").formatNullable[ZonedDateTime] and + (JsPath \ "status").format[String] and + (JsPath \ "assignee").formatNullable[Long] and + (JsPath \ "previousStatus").formatNullable[String] and + (JsPath \ "previousAssignee").formatNullable[Long] and + (JsPath \ "condition").formatNullable[String] and + (JsPath \ "phase").formatNullable[String] and + (JsPath \ "hypothesisId").formatNullable[UUID] and + (JsPath \ "studyDesignId").formatNullable[Long] and + (JsPath \ "isPartner").format[Boolean] and + (JsPath \ "overview").formatNullable[String] and + (JsPath \ "overviewTemplate").format[String] and + (JsPath \ "isUpdated").format[Boolean] and + (JsPath \ "title").format[String] + ) (ApiTrial.apply, unlift(ApiTrial.unapply)) + + def fromDomain(trial: Trial): ApiTrial = ApiTrial( + id = trial.id.id, + status = TrialStatus.statusToString(trial.status), + assignee = trial.assignee.map(_.id), + previousStatus = trial.previousStatus.map(TrialStatus.statusToString), + previousAssignee = trial.previousAssignee.map(_.id), + lastUpdate = Option(ZonedDateTime.of(trial.lastUpdate, ZoneId.of("Z"))), + condition = Option(trial.condition.toString), + phase = Option(trial.phase), + hypothesisId = trial.hypothesisId.map(_.id), + studyDesignId = trial.studyDesignId.map(_.id), + isPartner = trial.isPartner, + overview = trial.overview, + overviewTemplate = trial.overviewTemplate, + isUpdated = trial.isUpdated, + title = trial.title + ) +} diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/TrialStatus.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/TrialStatus.scala new file mode 100644 index 0000000..49bcbcb --- /dev/null +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/trial/TrialStatus.scala @@ -0,0 +1,30 @@ +package xyz.driver.pdsuidomain.formats.json.trial + +import xyz.driver.pdsuidomain.entities.Trial.Status + +object TrialStatus { + + val statusFromString: PartialFunction[String, Status] = { + case "New" => Status.New + case "ReviewSummary" => Status.ReviewSummary + case "Summarized" => Status.Summarized + case "PendingUpdate" => Status.PendingUpdate + case "Update" => Status.Update + case "ReviewCriteria" => Status.ReviewCriteria + case "Done" => Status.Done + case "Flagged" => Status.Flagged + case "Archived" => Status.Archived + } + + def statusToString(x: Status): String = x match { + case Status.New => "New" + case Status.ReviewSummary => "ReviewSummary" + case Status.Summarized => "Summarized" + case Status.PendingUpdate => "PendingUpdate" + case Status.Update => "Update" + case Status.ReviewCriteria => "ReviewCriteria" + case Status.Done => "Done" + case Status.Flagged => "Flagged" + case Status.Archived => "Archived" + } +} |