in fapi-client/src/main/scala/com/gu/facia/api/contentapi/ContentApi.scala [116:149]
def linkSnapBrandingsByEdition(capiClient: ContentApiClient, linkSnapsRequest: LinkSnapsRequest, itemQueries: ItemQueries = ItemQueries)
(implicit ec: ExecutionContext): Response[Map[String, BrandingByEdition]] = {
def toIdAndUri(snap: (String, String)): Option[(String, URI)] = Try { new URI(snap._2) } match {
case Success(uri) => Some(snap._1 -> uri)
case Failure(exception) =>
// Swallow the error at this point rather than failing fast, and log.
logger.error(s"Failed to parse URI ${snap._2} of snap ${snap._1}", exception)
None
}
def isPossibleSectionFrontOrTagPage(snap: (String, URI)): Boolean = {
val uri = snap._2
!uri.isAbsolute && !uri.getPath.contains('+')
}
def brandingsFromResponse(response: ItemResponse): BrandingByEdition =
response.section.map(_.brandingByEdition) orElse response.tag.map(_.brandingByEdition) getOrElse Map.empty
Response.Async.Right {
Future.traverse(linkSnapsRequest.snaps.toSeq.flatMap(toIdAndUri).filter(isPossibleSectionFrontOrTagPage)) {
case (id, uri) =>
val query = itemQueries.brandingQueryFromSnapUri(uri)
val response = capiClient.getResponse(query)
response.failed.foreach { case NonFatal(e) =>
logger.warn(s"Failed to get response for link snap query '$query'", e)
}
response.map(brandingsFromResponse).map(id -> _)
}.map(_.toMap)
.recoverWith { case NonFatal(e) =>
Future.successful(Map.empty[String, BrandingByEdition])
}
}
}