app/model/editions/client/EditionsClientCollection.scala (174 lines of code) (raw):
package model.editions.client
import play.api.libs.json.{Json, OFormat}
import services.editions.prefills.CapiQueryTimeWindow
import model.editions.EditionsCard
import model.editions.EditionsArticle
import model.editions.{
CapiPrefillQuery,
EditionsCollection,
EditionsRecipe,
EditionsChef,
EditionsFeastCollection,
CardType
}
import model.editions.EditionsFeastCollectionItem
// Ideally the frontend can be changed so we don't have this weird modelling!
case class EditionsClientCard(
id: String,
cardType: Option[CardType],
frontPublicationDate: Long,
meta: Option[ClientCardMetadata] = None
)
object EditionsClientCard {
implicit val format: OFormat[EditionsClientCard] =
Json.format[EditionsClientCard]
def fromCard(card: EditionsCard): EditionsClientCard = card match {
case EditionsArticle(id, addedOn, metadata) =>
EditionsClientCard(
id = "internal-code/page/" + id,
Some(CardType.Article),
addedOn,
metadata.map(ClientCardMetadata.fromCardMetadata)
)
case EditionsRecipe(id, addedOn) =>
EditionsClientCard(
id,
Some(CardType.Recipe),
addedOn
)
case EditionsChef(id, addedOn, metadata) =>
EditionsClientCard(
id,
Some(CardType.Chef),
addedOn,
metadata.map(ClientCardMetadata.fromCardMetadata)
)
case EditionsFeastCollection(id, addedOn, metadata) =>
EditionsClientCard(
id,
Some(CardType.FeastCollection),
addedOn,
metadata.map(ClientCardMetadata.fromCardMetadata)
)
}
def toCard(card: EditionsClientCard): EditionsCard = card.cardType match {
case Some(CardType.Article) | None =>
val id = card.id.split("/").last
EditionsArticle(
id,
card.frontPublicationDate,
card.meta.map(_.toArticleMetadata)
)
case Some(CardType.Recipe) =>
EditionsRecipe(
card.id,
card.frontPublicationDate
)
case Some(CardType.Chef) =>
EditionsChef(
card.id,
card.frontPublicationDate,
card.meta.map(_.toChefMetadata)
)
case Some(CardType.FeastCollection) =>
EditionsFeastCollection(
card.id,
card.frontPublicationDate,
card.meta.map(_.toFeastCollectionMetadata)
)
}
}
case class EditionsSupportingClientCard(
id: String,
cardType: Option[CardType],
frontPublicationDate: Long,
meta: Option[ClientCardMetadata] = None
)
object EditionsSupportingClientCard {
implicit def format: OFormat[EditionsSupportingClientCard] =
Json.format[EditionsSupportingClientCard]
def fromFeastCollectionItem(item: EditionsFeastCollectionItem) = item match {
case EditionsRecipe(id, addedOn) =>
EditionsSupportingClientCard(id, Some(CardType.Recipe), addedOn)
case EditionsChef(id, addedOn, metadata) =>
EditionsSupportingClientCard(
id,
Some(CardType.Chef),
addedOn,
metadata.map(ClientCardMetadata.fromCardMetadata)
)
}
def toFeastCollectionItem(supportingCard: EditionsSupportingClientCard) =
supportingCard.cardType match {
case Some(CardType.Recipe) =>
EditionsRecipe(supportingCard.id, supportingCard.frontPublicationDate)
case Some(CardType.Chef) =>
EditionsChef(
supportingCard.id,
supportingCard.frontPublicationDate,
supportingCard.meta.map(_.toChefMetadata)
)
}
}
case class EditionsClientCollection(
id: String,
displayName: String,
isHidden: Boolean,
lastUpdated: Option[Long],
updatedBy: Option[String],
updatedEmail: Option[String],
prefill: Option[CapiPrefillQuery],
contentPrefillTimeWindow: Option[CapiQueryTimeWindow],
items: List[EditionsClientCard],
targetedRegions: Option[List[String]],
excludedRegions: Option[List[String]]
)
object EditionsClientCollection {
implicit val collectionFormat: OFormat[EditionsClientCollection] =
Json.format[EditionsClientCollection]
}
case class EditionsFrontendCollectionWrapper(
id: String,
collection: EditionsClientCollection
)
object EditionsFrontendCollectionWrapper {
implicit def collectionWrapperFormat
: OFormat[EditionsFrontendCollectionWrapper] =
Json.format[EditionsFrontendCollectionWrapper]
def fromCollection(
collection: EditionsCollection
): EditionsFrontendCollectionWrapper = {
EditionsFrontendCollectionWrapper(
collection.id,
EditionsClientCollection(
collection.id,
collection.displayName,
collection.isHidden,
collection.lastUpdated,
collection.updatedBy,
collection.updatedEmail,
collection.prefill,
collection.contentPrefillTimeWindow,
collection.items.map(EditionsClientCard.fromCard),
collection.targetedRegions,
collection.excludedRegions
)
)
}
def toCollection(
frontendCollection: EditionsFrontendCollectionWrapper
): EditionsCollection = {
EditionsCollection(
frontendCollection.id,
frontendCollection.collection.displayName,
frontendCollection.collection.isHidden,
frontendCollection.collection.lastUpdated,
frontendCollection.collection.updatedBy,
frontendCollection.collection.updatedEmail,
frontendCollection.collection.prefill,
frontendCollection.collection.contentPrefillTimeWindow,
frontendCollection.collection.items.map(EditionsClientCard.toCard),
frontendCollection.collection.targetedRegions,
frontendCollection.collection.excludedRegions
)
}
}