app/model/editions/EditionsFront.scala (104 lines of code) (raw):

package model.editions import org.postgresql.util.PGobject import play.api.libs.json.{Json, OFormat, OWrites} import scalikejdbc.WrappedResultSet object EditionsFrontMetadata { implicit val format: OFormat[EditionsFrontMetadata] = Json.format[EditionsFrontMetadata] } case class EditionsFrontMetadata( nameOverride: Option[String], swatch: Option[Swatch] ) { def toPGobject: PGobject = { val pgo = new PGobject() pgo.setType("jsonb") pgo.setValue(Json.toJson(this).toString()) pgo } } case class EditionsFront( id: String, displayName: String, index: Int, isSpecial: Boolean, isHidden: Boolean, updatedOn: Option[Long], updatedBy: Option[String], updatedEmail: Option[String], metadata: Option[EditionsFrontMetadata], collections: List[EditionsCollection] ) { def toPublishedFront: PublishedFront = { val name = getName val swatch = metadata .collect { case EditionsFrontMetadata(_, Some(swatch)) => swatch } .getOrElse(Swatch.Neutral) PublishedFront( id, name, collections .filterNot(_.isHidden) // drop hidden collections .map(_.toPublishedCollection) // convert .filterNot(_.items.isEmpty), // drop collections that contain no items swatch ) } def toSkeleton: EditionsFrontSkeleton = EditionsFrontSkeleton( name = displayName, collections = collections.map(_.toSkeleton), presentation = metadata .flatMap(_.swatch) .map(FrontPresentation.apply) .getOrElse(FrontPresentation(Swatch.Neutral)), hidden = isHidden, isSpecial = isSpecial ) def getName = metadata .collect { case EditionsFrontMetadata(Some(overrideName), _) => overrideName } .getOrElse(displayName) } object EditionsFront { implicit val writes: OWrites[EditionsFront] = Json.writes[EditionsFront] def fromRow(rs: WrappedResultSet, prefix: String = ""): EditionsFront = { EditionsFront( rs.string(prefix + "id"), rs.string(prefix + "name"), rs.int(prefix + "index"), rs.boolean(prefix + "is_special"), rs.boolean(prefix + "is_hidden"), rs.zonedDateTimeOpt(prefix + "updated_on").map(_.toInstant.toEpochMilli), rs.stringOpt(prefix + "updated_by"), rs.stringOpt(prefix + "updated_email"), rs.stringOpt(prefix + "metadata") .map(s => Json.parse(s).validate[EditionsFrontMetadata].get), Nil ) } def fromRowOpt( rs: WrappedResultSet, prefix: String = "" ): Option[EditionsFront] = { for { id <- rs.stringOpt(prefix + "id") name <- rs.stringOpt(prefix + "name") index <- rs.intOpt(prefix + "index") isSpecial <- rs.booleanOpt(prefix + "is_special") isHidden <- rs.booleanOpt(prefix + "is_hidden") } yield EditionsFront( id, name, index, isSpecial, isHidden, rs.zonedDateTimeOpt(prefix + "updated_on").map(_.toInstant.toEpochMilli), rs.stringOpt(prefix + "updated_by"), rs.stringOpt(prefix + "updated_email"), rs.stringOpt(prefix + "metadata") .map(s => Json.parse(s).validate[EditionsFrontMetadata].get), Nil ) } }