Skip to content

Instantly share code, notes, and snippets.

@edwardGunawan
edwardGunawan / Update.scala
Created August 26, 2021 07:35
How to Turn Your Domain Model into DynamoDB AttributeValue
sealed trait Update
case class UpdateRefund(`type` = "updateStatus", additionalData:Option[String], status: Option[String]) extends Update
case class UpdateNewPurchase(`type` = "newPurchase", additionalData:Option[String], amount: Option[Double]) extends Update
@edwardGunawan
edwardGunawan / statusSchemaWIthConstant.scala
Created August 26, 2021 07:35
How to Turn Your Domain Model into DynamoDB AttributeValue
val statusSchema = Schema.oneOf[Status] {alt =>
val refundSchema = Schema.record[Refund]{field =>
field.const("type", "refund") *> (field("refundId", _.refundId),
field("refundReason", _.refundReason),
field("timestamp", _.timestamp).map(Instant.parse),
field("amount", _.amount)).mapN((refundId:String, refundreason: String, timestamp:Instant, amount:Double) => Refund(refundId = refundId, refundReason = refundreason, timestamp = timestamp, amount = amount))
}
val paidSchema = Schema.record[Paid]{field =>
field.const("type", "paid") *> (field("timestamp", _.timestamp).map(Instant.parse),
@edwardGunawan
edwardGunawan / statusSchema.scala
Created August 26, 2021 07:34
How to Turn Your Domain Model into DynamoDB AttributeValue
val statusSchema = Schema.oneOf[Status] {alt =>
val refundSchema = Schema.record[Refund]{field =>
(field("refundId", _.refundId),
field("refundReason", _.refundReason),
field("timestamp", _.timestamp).map(Instant.parse),
field("amount", _.amount)).mapN((refundId:String, refundreason: String, timestamp:Instant, amount:Double) => Refund(refundId = refundId, refundReason = refundreason, timestamp = timestamp, amount = amount))
}
val paidSchema = Schema.record[Paid]{field =>
(field("timestamp", _.timestamp).map(Instant.parse),
@edwardGunawan
edwardGunawan / receivedSchema.scala
Created August 26, 2021 07:34
How to Turn Your Domain Model into DynamoDB AttributeValue
def receivedSchema: Schema[Received] = Schema[String].imapErr{s =>
Received.parse(s).toRight(Schema.ReadError(s"$s is not a valid Received value"))
}(_.toString)
@edwardGunawan
edwardGunawan / parse.scala
Created August 26, 2021 07:33
How to Turn Your Domain Model into DynamoDB AttributeValue
def parse(str: String): Option[Received] = str match {
case "Yes" => Some(Yes)
case "No" => Some(No)
case _ => None
}
@edwardGunawan
edwardGunawan / metadataWithRegionSchema.scala
Created August 26, 2021 07:33
How to Turn Your Domain Model into DynamoDB AttributeValue
val metadataSchema: Schema[Metadata] = Schema.record[Metadata]{field =>
(
field("isTest", _.isTest),
field("region", _.region)(regionSchema),
field.opt("sourceOfRequest", _.sourceOfRequest)
).mapN(Metadata.apply)
}
@edwardGunawan
edwardGunawan / regionSchema.scala
Created August 26, 2021 07:32
How to Turn Your Domain Model into DynamoDB AttributeValue
lazy val regionSchema: Schema[Region] = Schema[String].imap(s => Region.of(s))(region => region.toString)
@edwardGunawan
edwardGunawan / MetadataSchema.scala
Created August 26, 2021 07:32
How to Turn Your Domain Model into DynamoDB AttributeValue
val metadataSchema: Schema[Metadata] = Schema.record[Metadata]{field =>
(
field("isTest", _.isTest),
field("region", _.region),
field.opt("sourceOfRequest", _.sourceOfRequest)
).mapN(Metadata.apply)
}
@edwardGunawan
edwardGunawan / OverallInvoice.scala
Created August 26, 2021 07:32
How to Turn Your Domain Model into DynamoDB AttributeValue
case class Invoice(invoiceId: String, orderCode:String, metadata:Metadata, status: Status, isReceived: Received)
@edwardGunawan
edwardGunawan / Received.scala
Created August 26, 2021 07:31
How to Turn Your Domain Model into DynamoDB AttributeValue
sealed trait Received
case object Yes extends Received
case object No extends Received