package xyz.driver.pdsuidomain.formats.json import java.time.LocalDateTime import spray.json.{RootJsonReader, _} import xyz.driver.core.{Id, auth} import xyz.driver.core.auth.User import xyz.driver.core.json._ import xyz.driver.pdsuicommon.domain.{LongId, StringId} import xyz.driver.pdsuidomain.entities._ object trialissue { import DefaultJsonProtocol._ import common._ private def deserializationErrorFieldMessage(field: String, json: JsValue)(implicit className: String) = { deserializationError(s"$className json object do not contain '$field' field: $json") } private def deserializationErrorEntityMessage(json: JsValue)(implicit className: String) = { deserializationError(s"Expected Json Object as $className, but got $json") } def applyUpdateToTrialIssue(json: JsValue, orig: TrialIssue): TrialIssue = { json.asJsObject.getFields("text", "evidence", "archiveRequired", "meta") match { case Seq(text, evidence, archiveRequired, meta) => orig.copy( text = text.convertTo[String], evidence = evidence.convertTo[String], archiveRequired = archiveRequired.convertTo[Boolean], meta = meta.convertTo[String] ) case _ => deserializationError(s"Expected Json Object as partial TrialIssue, but got $json") } } def jsValueToTrialIssue(json: JsValue, trialId: StringId[Trial], userId: xyz.driver.core.Id[User]): TrialIssue = { json.asJsObject.getFields("text", "evidence", "meta") match { case Seq(text, evidence, meta) => TrialIssue( id = json.asJsObject.fields.get("id").flatMap(_.convertTo[Option[LongId[TrialIssue]]]).getOrElse(LongId(0)), userId = userId, trialId = trialId, lastUpdate = LocalDateTime.MIN, isDraft = true, text = text.convertTo[String], evidence = evidence.convertTo[String], archiveRequired = false, meta = meta.convertTo[String] ) case _ => deserializationError(s"Expected Json Object as TrialIssue, but got $json") } } implicit val trialIssueWriter = new RootJsonWriter[TrialIssue] { override def write(obj: TrialIssue) = JsObject( "id" -> obj.id.toJson, "text" -> obj.text.toJson, "lastUpdate" -> obj.lastUpdate.toJson, "userId" -> obj.userId.toJson, "isDraft" -> obj.isDraft.toJson, "evidence" -> obj.evidence.toJson, "archiveRequired" -> obj.archiveRequired.toJson, "meta" -> obj.meta.toJson ) } def trialIssueReader(trialId: StringId[Trial]): RootJsonReader[TrialIssue] = new RootJsonReader[TrialIssue] { implicit val className: String = "TrialIssue" override def read(json: JsValue): TrialIssue = json match { case JsObject(fields) => val id = fields .get("id") .map(_.convertTo[LongId[TrialIssue]]) .getOrElse(deserializationErrorFieldMessage("id", json)) val text = fields .get("text") .map(_.convertTo[String]) .getOrElse(deserializationErrorFieldMessage("text", json)) val lastUpdate = fields .get("lastUpdate") .map(_.convertTo[LocalDateTime]) .getOrElse(deserializationErrorFieldMessage("lastUpdate", json)) val userId = fields .get("userId") .map(_.convertTo[Id[auth.User]]) .getOrElse(deserializationErrorFieldMessage("userId", json)) val isDraft = fields .get("isDraft") .map(_.convertTo[Boolean]) .getOrElse(deserializationErrorFieldMessage("isDraft", json)) val evidence = fields .get("evidence") .map(_.convertTo[String]) .getOrElse(deserializationErrorFieldMessage("evidence", json)) val archiveRequired = fields .get("archiveRequired") .map(_.convertTo[Boolean]) .getOrElse(deserializationErrorFieldMessage("archiveRequired", json)) val meta = fields .get("meta") .map(_.convertTo[String]) .getOrElse(deserializationErrorFieldMessage("meta", json)) TrialIssue( id = id, userId = userId, trialId = trialId, lastUpdate = lastUpdate, isDraft = isDraft, text = text, evidence = evidence, archiveRequired = archiveRequired, meta = meta ) case _ => deserializationErrorEntityMessage(json) } } }