app/model/Sponsorship.scala (103 lines of code) (raw):

package model import com.amazonaws.services.dynamodbv2.document.Item import ai.x.play.json.Jsonx import ai.x.play.json.Encoders.encoder import ai.x.play.json.implicits.optionWithNull import org.joda.time.DateTime import helpers.JodaDateTimeFormat._ import play.api.Logging import play.api.libs.json._ import play.api.libs.functional.syntax._ import repositories.{SectionRepository, TagRepository, TagLookupCache} import com.gu.tagmanagement.{Sponsorship => ThriftSponsorship, SponsorshipTargeting => ThriftSponsorshipTargeting, SponsorshipType, SponsorshipPackage} import scala.util.control.NonFatal case class SponsorshipTargeting(publishedSince: Option[DateTime], validEditions: Option[List[String]]) { def asThrift: ThriftSponsorshipTargeting = ThriftSponsorshipTargeting( publishedSince = publishedSince.map(_.getMillis), validEditions = validEditions ) } object SponsorshipTargeting { implicit val sponsorshipTargetingFormat: Format[SponsorshipTargeting] = Jsonx.formatCaseClass[SponsorshipTargeting] } case class Sponsorship ( id: Long, validFrom: Option[DateTime], validTo: Option[DateTime], status: String, sponsorshipType: String, sponsorshipPackage: Option[String], sponsorName: String, sponsorLogo: Image, highContrastSponsorLogo: Option[Image], sponsorLink: String, aboutLink: Option[String], tags: Option[List[Long]], sections: Option[List[Long]], targeting: Option[SponsorshipTargeting]) { def toItem = Item.fromJSON(Json.toJson(this).toString()) private def sponsorshipPackageAsThrift(s: String) = SponsorshipPackage.valueOf( s.replace("-", "") // convert us-exclusive to usexclusive ) def asThrift: ThriftSponsorship = ThriftSponsorship( id = id, sponsorshipType = SponsorshipType.valueOf(sponsorshipType).get, sponsorshipPackage = sponsorshipPackage.flatMap(sponsorshipPackageAsThrift), sponsorName = sponsorName, sponsorLogo = sponsorLogo.asThrift, highContrastSponsorLogo = highContrastSponsorLogo.map(_.asThrift), sponsorLink = sponsorLink, aboutLink = aboutLink, targeting = targeting.map(_.asThrift), validFrom = validFrom.map(_.getMillis), validTo = validTo.map(_.getMillis) ) } object Sponsorship extends Logging { implicit val sponsorshipFormat: Format[Sponsorship] = Jsonx.formatCaseClass[Sponsorship] def fromJson(json: JsValue) = json.as[Sponsorship] def fromItem(item: Item) = try { Json.parse(item.toJSON).as[Sponsorship] } catch { case NonFatal(e) => { logger.error(s"failed to load sponsorship ${item.toJSON}", e) throw e } } } case class DenormalisedSponsorship ( id: Long, validFrom: Option[DateTime], validTo: Option[DateTime], status: String, sponsorshipType: String, sponsorshipPackage: Option[String], sponsorName: String, sponsorLogo: Image, highContrastSponsorLogo: Option[Image], sponsorLink: String, aboutLink: Option[String], tags: Option[List[Tag]], sections: Option[List[Section]], targeting: Option[SponsorshipTargeting]) object DenormalisedSponsorship { implicit val denormalisedSponsorshipFormat: OFormat[DenormalisedSponsorship] = Jsonx.formatCaseClass[DenormalisedSponsorship] def apply(s: Sponsorship): DenormalisedSponsorship = { new DenormalisedSponsorship( id = s.id, validFrom = s.validFrom, validTo = s.validTo, status = s.status, sponsorshipType = s.sponsorshipType, sponsorshipPackage = s.sponsorshipPackage, sponsorName = s.sponsorName, sponsorLogo = s.sponsorLogo, highContrastSponsorLogo = s.highContrastSponsorLogo, sponsorLink = s.sponsorLink, aboutLink = s.aboutLink, tags = s.tags.map(_.flatMap(TagLookupCache.getTag)), sections = s.sections.map(_.flatMap(SectionRepository.getSection)), targeting = s.targeting ) } }