diff options
author | vlad <vlad@driver.xyz> | 2017-06-27 17:13:02 -0700 |
---|---|---|
committer | vlad <vlad@driver.xyz> | 2017-06-27 17:13:02 -0700 |
commit | 5832f63b84d7388441d1200f2442dc1e9de0225c (patch) | |
tree | 32f63acdc920c14effc3d0d2822c05c125ad49e4 /src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiUpdateCriterion.scala | |
parent | 9dd50590d4c8f8b9442d7c21ddd1def9dd453d5e (diff) | |
download | rest-query-5832f63b84d7388441d1200f2442dc1e9de0225c.tar.gz rest-query-5832f63b84d7388441d1200f2442dc1e9de0225c.tar.bz2 rest-query-5832f63b84d7388441d1200f2442dc1e9de0225c.zip |
All PDS UI domain models, API case classes, service traits and necessary utils moved to pdsui-commonv0.1.11
Diffstat (limited to 'src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiUpdateCriterion.scala')
-rw-r--r-- | src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiUpdateCriterion.scala | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiUpdateCriterion.scala b/src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiUpdateCriterion.scala new file mode 100644 index 0000000..c73c3ef --- /dev/null +++ b/src/main/scala/xyz/driver/pdsuidomain/formats/json/criterion/ApiUpdateCriterion.scala @@ -0,0 +1,56 @@ +package xyz.driver.pdsuidomain.formats.json.criterion + +import xyz.driver.pdsuicommon.domain.LongId +import xyz.driver.pdsuicommon.json.Serialization.seqJsonFormat +import xyz.driver.pdsuidomain.entities.{Arm, Criterion} +import org.davidbild.tristate._ +import org.davidbild.tristate.contrib.play.ToJsPathOpsFromJsPath +import play.api.libs.functional.syntax._ +import play.api.libs.json._ +import xyz.driver.pdsuidomain.formats.json.label.ApiCriterionLabel +import xyz.driver.pdsuidomain.services.CriterionService.RichCriterion + +final case class ApiUpdateCriterion(meta: Tristate[String], + arms: Tristate[Seq[Long]], + text: Option[String], + isCompound: Option[Boolean], + labels: Tristate[Seq[ApiCriterionLabel]]) { + + def applyTo(orig: RichCriterion): RichCriterion = RichCriterion( + criterion = applyTo(orig.criterion), + armIds = arms.cata(_.map(LongId[Arm]), Seq.empty, orig.armIds), + labels = labels.cata(_.map(_.toDomain(orig.criterion.id)), Seq.empty, orig.labels) + ) + + private def applyTo(orig: Criterion): Criterion = Criterion( + id = orig.id, + meta = meta.cata(identity, "{}", orig.meta), + text = text.orElse(orig.text), + isCompound = isCompound.getOrElse(orig.isCompound), + trialId = orig.trialId + ) +} + +object ApiUpdateCriterion { + + private val reads: Reads[ApiUpdateCriterion] = ( + (JsPath \ "meta").readTristate(Reads { x => JsSuccess(Json.stringify(x)) }).map { + case Tristate.Present("{}") => Tristate.Absent + case x => x + } and + (JsPath \ "arms").readTristate(seqJsonFormat[Long]) and + (JsPath \ "text").readNullable[String] and + (JsPath \ "isCompound").readNullable[Boolean] and + (JsPath \ "labels").readTristate(seqJsonFormat[ApiCriterionLabel]) + ) (ApiUpdateCriterion.apply _) + + private val writes: Writes[ApiUpdateCriterion] = ( + (JsPath \ "meta").writeTristate(Writes[String](Json.parse)) and + (JsPath \ "arms").writeTristate(seqJsonFormat[Long]) and + (JsPath \ "text").writeNullable[String] and + (JsPath \ "isCompound").writeNullable[Boolean] and + (JsPath \ "labels").writeTristate(seqJsonFormat[ApiCriterionLabel]) + ) (unlift(ApiUpdateCriterion.unapply)) + + implicit val format: Format[ApiUpdateCriterion] = Format(reads, writes) +} |