aboutsummaryrefslogblamecommitdiff
path: root/src/main/scala/xyz/driver/pdsuidomain/formats/json/documentissue.scala
blob: d17a45ca59c35c429ea8bf2ab145f1a076e8b89f (plain) (tree)
1
2
3
4
5
6
7
8
                                           



                              
                                

                                           































                                                                                                                      


                                                                               






                                                                                                             
                                                                                

                                                                        
 
                      
                                       




                                         
                                  






                                                                                             
                                                                                                    

 
package xyz.driver.pdsuidomain.formats.json

import java.time.LocalDateTime

import spray.json._
import xyz.driver.core.auth.User
import xyz.driver.core.json._
import xyz.driver.pdsuicommon.domain.LongId
import xyz.driver.pdsuidomain.entities._

object documentissue {
  import DefaultJsonProtocol._
  import common._

  def applyUpdateToDocumentIssue(json: JsValue, orig: DocumentIssue): DocumentIssue = json match {
    case JsObject(fields) =>
      val text = fields
        .get("text")
        .map(_.convertTo[String])
        .getOrElse(deserializationError(s"DocumentIssue json object does not contain `text` field: $json"))

      val archiveRequired = fields
        .get("archiveRequired")
        .map(_.convertTo[Boolean])
        .getOrElse(deserializationError(s"DocumentIssue json object does not contain `archiveRequired` field: $json"))

      val startPage = fields.get("startPage").map(_.convertTo[Double])
      val endPage   = fields.get("endPage").map(_.convertTo[Double])

      orig.copy(
        text = text,
        archiveRequired = archiveRequired,
        startPage = startPage,
        endPage = endPage
      )

    case _ => deserializationError(s"Expected Json Object as partial DocumentIssue, but got $json")

  }

  def jsValueToDocumentIssue(json: JsValue,
                             documentId: LongId[Document],
                             userId: xyz.driver.core.Id[User]): DocumentIssue =
    json match {
      case JsObject(fields) =>
        val text = fields
          .get("text")
          .map(_.convertTo[String])
          .getOrElse(deserializationError(s"DocumentIssue json object does not contain `text` field: $json"))

        val id        = fields.get("id").map(_.convertTo[LongId[DocumentIssue]])
        val startPage = fields.get("startPage").map(_.convertTo[Double])
        val endPage   = fields.get("endPage").map(_.convertTo[Double])

        DocumentIssue(
          id = id.getOrElse(LongId(0)),
          userId = userId,
          documentId = documentId,
          lastUpdate = LocalDateTime.MIN,
          isDraft = true,
          text = text,
          archiveRequired = false,
          startPage = startPage,
          endPage = endPage
        )

      case _ => deserializationError(s"Expected Json Object as DocumentIssue, but got $json")
    }

  implicit val documentIssueFormat: RootJsonFormat[DocumentIssue] = jsonFormat9(DocumentIssue.apply)

}