app/models/BannerDesign.scala (117 lines of code) (raw):

package models import io.circe.{Decoder, Encoder} import io.circe.generic.extras.Configuration import io.circe.generic.extras.semiauto.{deriveEnumerationDecoder, deriveEnumerationEncoder} sealed trait BannerDesignStatus object BannerDesignStatus { case object Live extends BannerDesignStatus case object Draft extends BannerDesignStatus implicit val customConfig: Configuration = Configuration.default.withDefaults implicit val statusEncoder = deriveEnumerationEncoder[BannerDesignStatus] implicit val statusDecoder = deriveEnumerationDecoder[BannerDesignStatus] } case class HeaderImage( mobileUrl: String, tabletUrl: String, desktopUrl: String, altText: String ) sealed trait FontSize object FontSize { case object small extends FontSize case object medium extends FontSize case object large extends FontSize implicit val decoder: Decoder[FontSize] = deriveEnumerationDecoder[FontSize] implicit val encoder: Encoder[FontSize] = deriveEnumerationEncoder[FontSize] } case class Font(size: FontSize) case class Fonts(heading: Font) sealed trait BannerDesignVisual object BannerDesignVisual { case class Image( kind: String = "Image", mobileUrl: String, tabletUrl: String, desktopUrl: String, altText: String ) extends BannerDesignVisual case class ChoiceCards( kind: String = "ChoiceCards", buttonColour: Option[HexColour], buttonTextColour: Option[HexColour], buttonBorderColour: Option[HexColour], buttonSelectColour: Option[HexColour], buttonSelectTextColour: Option[HexColour], buttonSelectBorderColour: Option[HexColour] ) extends BannerDesignVisual import io.circe.generic.extras.auto._ implicit val customConfig: Configuration = Configuration.default.withDiscriminator("kind") implicit val encoder = Encoder[BannerDesignVisual] implicit val decoder = Decoder[BannerDesignVisual] } case class HexColour( r: String, g: String, b: String, kind: String, ) case class BannerDesignBasicColours( background: HexColour, bodyText: HexColour, headerText: HexColour, articleCountText: HexColour, logo: HexColour ) case class BannerDesignHighlightedTextColours( text: HexColour, highlight: HexColour ) case class CtaStateDesign( text: HexColour, background: HexColour, border: Option[HexColour] ) case class CtaDesign( default: CtaStateDesign, hover: CtaStateDesign ) case class TickerDesign( text: HexColour, //deprecated filledProgress: HexColour, progressBarBackground: HexColour, goalMarker: HexColour, //deprecated headlineColour: Option[HexColour], //new totalColour: Option[HexColour], //new goalColour: Option[HexColour] //new ) object TickerDesign { import io.circe.generic.auto._ implicit val encoder = Encoder[TickerDesign] // Modify the Decoder to use existing values for the new fields val normalDecoder = Decoder[TickerDesign] implicit val decoder = normalDecoder.map(design => { val headlineColour = design.headlineColour.getOrElse(design.text) val totalColour = design.totalColour.getOrElse(design.text) val goalColour = design.goalColour.getOrElse(design.text) design.copy( headlineColour = Some(headlineColour), totalColour = Some(totalColour), goalColour = Some(goalColour)) }) } case class BannerDesignColours( basic: BannerDesignBasicColours, highlightedText: BannerDesignHighlightedTextColours, primaryCta: CtaDesign, secondaryCta: CtaDesign, closeButton: CtaDesign, ticker: TickerDesign ) case class BannerDesign( name: String, status: BannerDesignStatus, visual: Option[BannerDesignVisual], headerImage: Option[HeaderImage], colours: BannerDesignColours, lockStatus: Option[LockStatus], fonts: Option[Fonts], )