/** * Generated by API Builder - https://www.apibuilder.io * Service version: 1.0.0-dev * User agent: apibuilder app.apibuilder.io/helicalmoment/zola-takehome/1.0.0-dev/http4s_0_22 */ package org.helicalmoment.zola.takehome.v1.models { /** * An invoice * * @param id Unique identifier for an invoice * @param invoiceNumber The invoice number associated with the invoice * @param poNumber The purchase number associated with the invoice * @param dueDate When invoice payment is due * @param amountCents Total amount of invoice in US cents * @param createdAt Invoice creation timestamp */ final case class Invoice( id: _root_.scala.Option[Int] = None, invoiceNumber: String, poNumber: String, dueDate: _root_.java.time.LocalDate, amountCents: Long, createdAt: _root_.scala.Option[_root_.java.time.Instant] = None ) } package org.helicalmoment.zola.takehome.v1.models { package object json { import io.circe.Decoder._ import io.circe.Encoder._ import scala.language.implicitConversions // See below - Make Scala 2.11 Either monadic import scala.util.Try import io.circe.{Json, JsonObject, Encoder, Decoder, DecodingFailure} import io.circe.syntax._ import org.helicalmoment.zola.takehome.v1.models.json._ // Make Scala 2.11 Either monadic private[v1] implicit def eitherOps[A,B](e: Either[A,B]) = cats.implicits.catsSyntaxEither(e) private[v1] implicit val decodeUUID: Decoder[_root_.java.util.UUID] = Decoder.decodeString.emapTry(str => Try(_root_.java.util.UUID.fromString(str))) private[v1] implicit val encodeUUID: Encoder[_root_.java.util.UUID] = Encoder.encodeString.contramap[_root_.java.util.UUID](uuid => uuid.toString) private[v1] implicit val decodeInstant: Decoder[_root_.java.time.Instant] = Decoder.decodeString.emapTry(str => Try(_root_.java.time.OffsetDateTime.parse(str).toInstant)) private[v1] implicit val encodeInstant: Encoder[_root_.java.time.Instant] = Encoder.encodeString.contramap[_root_.java.time.Instant](_.toString) private[v1] implicit val decodeLocalDate: Decoder[_root_.java.time.LocalDate] = Decoder.decodeString.emapTry(str => Try(_root_.java.time.LocalDate.parse(str))) private[v1] implicit val encodeLocalDate: Encoder[_root_.java.time.LocalDate] = Encoder.encodeString.contramap[_root_.java.time.LocalDate](_.toString) implicit def decodeZolaTakehomeInvoice: Decoder[Invoice] = Decoder.instance { c => for { id <- c.downField("id").as[Option[Int]] invoiceNumber <- c.downField("invoice_number").as[String] poNumber <- c.downField("po_number").as[String] dueDate <- c.downField("due_date").as[_root_.java.time.LocalDate] amountCents <- c.downField("amount_cents").as[Long] createdAt <- c.downField("created_at").as[Option[_root_.java.time.Instant]] } yield { Invoice( id = id, invoiceNumber = invoiceNumber, poNumber = poNumber, dueDate = dueDate, amountCents = amountCents, createdAt = createdAt ) } } implicit def encodeZolaTakehomeInvoice: Encoder[Invoice] = Encoder.instance { t => Json.fromFields(Seq( t.id.map(t => "id" -> t.asJson), Some("invoice_number" -> t.invoiceNumber.asJson), Some("po_number" -> t.poNumber.asJson), Some("due_date" -> t.dueDate.asJson), Some("amount_cents" -> t.amountCents.asJson), t.createdAt.map(t => "created_at" -> t.asJson) ).flatten) } } }