in fapi-client/src/main/scala/com/gu/facia/api/models/collection.scala [60:111]
def contentFrom(collection: Collection,
content: Set[Content],
snapContent: Map[String, Option[Content]] = Map.empty,
linkSnapBrandingsByEdition: Map[String, BrandingByEdition],
from: Collection => List[Trail]): List[FaciaContent] = {
// if content is not in the set it was most likely filtered out by the CAPI query, so exclude it
// note that this does not currently deal with e.g. snaps
def resolveTrail(trail: Trail, index: Int): Option[FaciaContent] = {
val boostLevel = trail.safeMeta.boostLevel
val isSplash = isSplashCard(trail, index, collection.collectionConfig.collectionType)
val maxItems = maxSupportingItems(isSplash, collection.collectionConfig.collectionType, boostLevel.getOrElse("default") )
content.find { c =>
trail.id.endsWith("/" + c.fields.flatMap(_.internalPageCode).getOrElse(throw new RuntimeException("No internal page code")))
}
.map { content =>
trail.safeMeta.supporting
.map(_.flatMap(resolveSupportingContent))
.map(supportingItems => CuratedContent.fromTrailAndContentWithSupporting(content, trail.safeMeta, Option(trail.frontPublicationDate), supportingItems.take(maxItems), collection.collectionConfig))
.getOrElse(CuratedContent.fromTrailAndContent(content, trail.safeMeta, Option(trail.frontPublicationDate), collection.collectionConfig))}
.orElse {
snapContent
.find{case (id, _) => trail.id == id}
.map(c => LatestSnap.fromTrailAndContent(trail, c._2))}
.orElse {
linkSnapBrandingsByEdition
.find {
case (id, _) => trail.id == id
}.flatMap {
case (_, brandingByEdition) => Snap.maybeFromTrailAndBrandings(trail, brandingByEdition)
}
.orElse { Snap.maybeFromTrail(trail) }
}
}
def resolveSupportingContent(supportingItem: SupportingItem): Option[FaciaContent] = {
content.find { c =>
supportingItem.id.endsWith("/" + c.fields.flatMap(_.internalPageCode).getOrElse(throw new RuntimeException("No internal page code")))
}
.map { content => SupportingCuratedContent.fromTrailAndContent(content, supportingItem.safeMeta, supportingItem.frontPublicationDate, collection.collectionConfig)}
.orElse {
snapContent
.find{case (id, _) => supportingItem.id == id}
.map(c => LatestSnap.fromSupportingItemAndContent(supportingItem, c._2))}
.orElse{ Snap.maybeFromSupportingItem(supportingItem)}}
for {
(trail, index) <- from(collection).zipWithIndex
content <- resolveTrail(trail, index)
} yield content
}