app/model/editions/EditionsCollection.scala (132 lines of code) (raw):

package model.editions import org.postgresql.util.PGobject import java.time.{Instant, ZonedDateTime} import play.api.libs.json.{Json, OFormat} import scalikejdbc.WrappedResultSet import services.editions.prefills.CapiQueryTimeWindow case class EditionsCollection( id: String, displayName: String, isHidden: Boolean, lastUpdated: Option[Long], updatedBy: Option[String], updatedEmail: Option[String], prefill: Option[CapiPrefillQuery], contentPrefillTimeWindow: Option[CapiQueryTimeWindow], items: List[EditionsCard], targetedRegions: Option[List[String]], excludedRegions: Option[List[String]] ) { def toPublishedCollection: PublishedCollection = PublishedCollection( id, displayName, items.collect { case article: EditionsArticle => EditionsArticle.toPublishedArticle(article) } ) def toSkeleton: EditionsCollectionSkeleton = EditionsCollectionSkeleton( name = displayName, items = items.map(_.toSkeleton), prefill = prefill, hidden = isHidden, capiQueryTimeWindow = contentPrefillTimeWindow.getOrElse( CapiQueryTimeWindow(Instant.now, Instant.now) ) ) private def listToPgJson(input: List[String]): PGobject = { val metaDataParam = new PGobject() metaDataParam.setType("jsonb") metaDataParam.setValue(Json.toJson(input).toString()) metaDataParam } def targetedRegionsPG() = targetedRegions.map(listToPgJson) def excludedRegionsPG() = excludedRegions.map(listToPgJson) } object EditionsCollection { implicit val format: OFormat[EditionsCollection] = Json.format[EditionsCollection] def fromRow(rs: WrappedResultSet, prefix: String = ""): EditionsCollection = { val capiPrefillQuery: Option[CapiPrefillQuery] = createMaybeCapiPrefillQuery( rs.stringOpt(prefix + "prefill"), rs.stringOpt(prefix + "path_type") ) val contentPrefillTimeWindow = createMaybeCapiQueryTime( rs.zonedDateTimeOpt("content_prefill_window_start"), rs.zonedDateTimeOpt("content_prefill_window_end") ) EditionsCollection( rs.string(prefix + "id"), rs.string(prefix + "name"), rs.boolean(prefix + "is_hidden"), rs.zonedDateTimeOpt(prefix + "updated_on").map(_.toInstant.toEpochMilli), rs.stringOpt(prefix + "updated_by"), rs.stringOpt(prefix + "updated_email"), capiPrefillQuery, contentPrefillTimeWindow, Nil, rs.stringOpt(prefix + "targeted_regions") .map(s => Json.parse(s).validate[List[String]].get), rs.stringOpt(prefix + "excluded_regions") .map(s => Json.parse(s).validate[List[String]].get) ) } private def createMaybeCapiPrefillQuery( maybePrefill: Option[String], maybePathType: Option[String] ): Option[CapiPrefillQuery] = { (maybePrefill, maybePathType) match { case (Some(prefill), Some(pathType)) => Some(CapiPrefillQuery(prefill, PathType.withName(pathType))) case _ => None } } private def createMaybeCapiQueryTime( maybeStart: Option[ZonedDateTime], maybeEnd: Option[ZonedDateTime] ): Option[CapiQueryTimeWindow] = { (maybeStart, maybeEnd) match { case (Some(start), Some(end)) => Some(CapiQueryTimeWindow(start.toInstant, end.toInstant)) case _ => None } } def fromRowOpt( rs: WrappedResultSet, prefix: String = "" ): Option[EditionsCollection] = { for { id <- rs.stringOpt(prefix + "id") name <- rs.stringOpt(prefix + "name") isHidden <- rs.booleanOpt(prefix + "is_hidden") } yield { val capiPrefillQuery: Option[CapiPrefillQuery] = createMaybeCapiPrefillQuery( rs.stringOpt(prefix + "prefill"), rs.stringOpt(prefix + "path_type") ) val contentPrefillTimeWindow = createMaybeCapiQueryTime( rs.zonedDateTimeOpt(prefix + "content_prefill_window_start"), rs.zonedDateTimeOpt(prefix + "content_prefill_window_end") ) EditionsCollection( id, name, isHidden, rs.zonedDateTimeOpt(prefix + "updated_on") .map(_.toInstant.toEpochMilli), rs.stringOpt(prefix + "updated_by"), rs.stringOpt(prefix + "updated_email"), capiPrefillQuery, contentPrefillTimeWindow, Nil, rs.stringOpt(prefix + "targeted_regions") .map(s => Json.parse(s).validate[List[String]].get), rs.stringOpt(prefix + "excluded_regions") .map(s => Json.parse(s).validate[List[String]].get) ) } } }