apicollective / apibuilder

Simple, Comprehensive Tooling for Modern APIs
https://www.apibuilder.io/
MIT License
562 stars 82 forks source link

Union type json readers should check discriminator #911

Open mbryzek opened 1 year ago

jackl commented 1 year ago

One possibility for a fix is to check for the discriminator, for example change

    implicit def jsonReadsBillingExternalEventTransactionDeleted: play.api.libs.json.Reads[TransactionDeleted] = {
      for {
        eventId <- (__ \ "event_id").read[String]
        timestamp <- (__ \ "timestamp").read[_root_.org.joda.time.DateTime]
        organization <- (__ \ "organization").read[String]
        transaction <- (__ \ "transaction").read[io.flow.billing.v0.models.Transaction]
      } yield TransactionDeleted(eventId, timestamp, organization, transaction)
    }

to

    implicit def jsonReadsBillingExternalEventTransactionDeleted: play.api.libs.json.Reads[TransactionDeleted] = {
      for {
        discriminator <- (__ \ "discriminator").read[String]
        eventId <- (__ \ "event_id").read[String]
        timestamp <- (__ \ "timestamp").read[_root_.org.joda.time.DateTime]
        organization <- (__ \ "organization").read[String]
        transaction <- (__ \ "transaction").read[io.flow.billing.v0.models.Transaction]
      } yield if (discriminator == "transaction_deleted")  TransactionDeleted(eventId, timestamp, organization, transaction) else sys.error(s"Invalid discriminator: $discriminator") // possibly JsError instead?
    }