def linkSnapBrandingsByEdition()

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])
      }
    }
  }