app/model/editions/EditionsIssue.scala (96 lines of code) (raw):
package model.editions
import java.time.{LocalDate, ZoneId}
import model.editions
import model.editions.PublishAction.PublishAction
import play.api.libs.json.{Json, OWrites}
import scalikejdbc.WrappedResultSet
object PublishAction extends Enumeration {
type PublishAction = Value
// Assigning values
val preview: editions.PublishAction.Value = Value("preview")
val proof: editions.PublishAction.Value = Value("proof")
val publish: editions.PublishAction.Value = Value("publish")
}
case class EditionsIssue(
id: String,
edition: Edition,
platform: CuratedPlatform,
timezoneId: String,
issueDate: LocalDate,
createdOn: Long,
createdBy: String,
createdEmail: String,
launchedOn: Option[Long],
launchedBy: Option[String],
launchedEmail: Option[String],
fronts: List[EditionsFront],
supportsProofing: Boolean
) {
// This is a no-op placeholder which matches the UK Daily Edition value.
// It should never be needed because the Editions Templates object should always
// contain a matching Edition. It should (TODO) eventually go away.
private val defaultOffset = 3
def toPreviewIssue: PublishableIssue =
toPublishableIssue("preview", PublishAction.preview)
def toPublishableIssue(
version: String,
action: PublishAction
): PublishableIssue = PublishableIssue(
action,
id,
edition,
edition,
issueDate,
version,
if (action == PublishAction.publish)
// publish does not need or want config because by definition we are publishing
// only the previously provided version. We do not want to be able to change content.
List()
else
fronts
.filterNot(_.isHidden) // drop hidden fronts
.map(_.toPublishedFront) // convert
.filterNot(
_.collections.isEmpty
), // drop fronts that contain no collections
EditionsAppTemplates.templates
.get(edition)
.map(_.notificationUTCOffset)
.getOrElse(defaultOffset),
EditionsAppTemplates.templates.get(edition).map(_.topic)
)
def toSkeleton = EditionsIssueSkeleton(
issueDate,
ZoneId.of(timezoneId),
fronts.map(_.toSkeleton)
)
}
object EditionsIssue {
implicit val writes: OWrites[EditionsIssue] = Json.writes[EditionsIssue]
def fromRow(
rs: WrappedResultSet,
prefix: String = ""
): Either[String, EditionsIssue] = {
val edition = Edition.withName(rs.string(prefix + "name"))
val maybePlatform = AllTemplates.templates.get(edition) match {
case Some(template) => Right(template.platform)
case None => Left(s"No template found for edition $edition")
}
maybePlatform.map { platform =>
EditionsIssue(
id = rs.string(prefix + "id"),
edition = Edition.withName(rs.string(prefix + "name")),
platform = platform,
timezoneId = rs.string(prefix + "timezone_id"),
issueDate = rs.localDate(prefix + "issue_date"),
createdOn =
rs.zonedDateTime(prefix + "created_on").toInstant.toEpochMilli,
createdBy = rs.string(prefix + "created_by"),
createdEmail = rs.string(prefix + "created_email"),
launchedOn = rs
.zonedDateTimeOpt(prefix + "launched_on")
.map(_.toInstant.toEpochMilli),
launchedBy = rs.stringOpt(prefix + "launched_by"),
launchedEmail = rs.stringOpt(prefix + "launched_email"),
fronts = Nil,
supportsProofing = EditionsAppTemplates.templates.contains(
edition
) // proofing is supported by Editions but not Feast
)
}
}
}