common/app/model/facia/PressedCollection.scala (110 lines of code) (raw):
package model.facia
import com.gu.commercial.branding.ContainerBranding
import com.gu.facia.api.{FAPI, models => fapi}
import com.gu.facia.api.models.GroupsConfig
import com.gu.facia.api.utils.BoostLevel.Boost
import com.gu.facia.api.utils.{BoostLevel, ContainerBrandingFinder}
import com.gu.facia.client.models.{Branded, TargetedTerritory}
import common.Edition
import model.pressed._
import org.joda.time.DateTime
import services.CollectionConfigWithId
case class PressedCollection(
id: String,
displayName: String,
curated: List[PressedContent],
backfill: List[PressedContent],
treats: List[PressedContent],
lastUpdated: Option[DateTime],
href: Option[String],
description: Option[String],
collectionType: String,
uneditable: Boolean,
showTags: Boolean,
showSections: Boolean,
hideKickers: Boolean,
showDateHeader: Boolean,
showLatestUpdate: Boolean,
config: CollectionConfig,
hasMore: Boolean,
targetedTerritory: Option[TargetedTerritory],
) {
lazy val isEmpty: Boolean = curated.isEmpty && backfill.isEmpty && treats.isEmpty
lazy val adFree = {
copy(
curated = curated.filterNot(_.isPaidFor),
backfill = backfill.filterNot(_.isPaidFor),
treats = treats.filterNot(_.isPaidFor),
)
}
def withoutTrailTextOnTail: PressedCollection =
(curated, backfill) match {
case (curatedHead :: tail, _) =>
copy(curated = curatedHead :: tail.map(_.withoutTrailText), backfill = backfill.map(_.withoutTrailText))
case (_, backfillHead :: tail) => copy(backfill = backfillHead :: tail.map(_.withoutTrailText))
case _ => this
}
def totalSize: Int = curated.size + backfill.size
lazy val withDefaultBoostLevels = {
val (defaultBoostCurated, defaultBoostBackfill) = FAPI
.applyDefaultBoostLevelsAndGroups[PressedContent](
groupsConfig = config.groupsConfig,
collectionType = config.collectionType,
contents = curated ++ backfill,
getBoostLevel = _.display.boostLevel.getOrElse(BoostLevel.Default),
setBoostLevel = (content, level) => content.withBoostLevel(Some(level)),
setGroup = (content, group) => content.withCard(content.card.copy(group = group)),
)
.splitAt(curated.length)
copy(curated = defaultBoostCurated, backfill = defaultBoostBackfill)
}
def lite(visible: Int): PressedCollection = {
val liteCurated = curated.take(visible)
val liteBackfill = backfill.take(visible - liteCurated.length)
val hasMore = curatedPlusBackfillDeduplicated.length > visible
copy(curated = liteCurated, backfill = liteBackfill, hasMore = hasMore)
}
def full(visible: Int): PressedCollection = {
val hasMore = curatedPlusBackfillDeduplicated.length > visible
copy(hasMore = hasMore)
}
lazy val collectionConfigWithId = CollectionConfigWithId(id, config)
lazy val curatedPlusBackfillDeduplicated = (curated ++ backfill).distinctBy { c =>
c.properties.maybeContentId.getOrElse(c.card.id)
}
lazy val distinct = curatedPlusBackfillDeduplicated.distinctBy(_.header.url)
def branding(edition: Edition): Option[ContainerBranding] = {
ContainerBrandingFinder.findBranding(
isConfiguredForBranding = config.metadata.exists(_.contains(Branded)),
optBrandings = curatedPlusBackfillDeduplicated.map(_.branding(edition)).toSet,
)
}
}
object PressedCollection {
def fromCollectionWithCuratedAndBackfill(
collection: com.gu.facia.api.models.Collection,
curated: List[PressedContent],
backfill: List[PressedContent],
treats: List[PressedContent],
): PressedCollection =
PressedCollection(
collection.id,
collection.displayName,
curated,
backfill,
treats,
collection.lastUpdated,
collection.href,
collection.collectionConfig.description,
collection.collectionConfig.collectionType,
collection.collectionConfig.uneditable,
collection.collectionConfig.showTags,
collection.collectionConfig.showSections,
collection.collectionConfig.hideKickers,
collection.collectionConfig.showDateHeader,
collection.collectionConfig.showLatestUpdate,
CollectionConfig.make(collection.collectionConfig),
hasMore = false,
collection.collectionConfig.targetedTerritory,
)
}