app/story_packages/util/ContentUpgrade.scala (57 lines of code) (raw):
package story_packages.util
import com.gu.contentapi.client.model.v1.Content
import com.gu.contentapi.json.CirceDecoders._
import com.gu.facia.api.utils.{CardStyle, ResolvedMetaData}
import com.gu.facia.client.models.TrailMetaData
import io.circe.{Json, parser}
import org.json4s.JValue
import org.json4s.JsonAST._
import org.json4s.JsonDSL._
import org.json4s.jackson.JsonMethods
import scala.util.{Failure, Success, Try}
/** Helper for Facia tool - passes over the JSON that is proxied, adding in defaults */
object ContentUpgrade {
val ContentFields = Seq(
"content",
"results",
"relatedContent",
"editorsPicks",
"mostViewed",
"storyPackage",
"leadContent"
)
def rewriteBody(body: String) = {
JsonMethods.compact(JsonMethods.render(upgradeResponse(JsonMethods.parse(body))))
}
def upgradeResponse(json: JValue) = {
json \ "response" match {
case jsObject: JObject =>
JObject("response" -> (jsObject ~ JObject(ContentFields flatMap { field =>
jsObject \ field match {
case JArray(items) => Some(field -> JArray(items.map(upgradeItem)))
case item: JObject => Some(field -> upgradeItem(item))
case _ => None
}
}: _*)))
case x => x
}
}
def upgradeItem(json: JValue): JValue = {
Try({
val jsonString = JsonMethods.compact(JsonMethods.render(json))
val maybeParsedJson: Option[Json] = parser.parse(jsonString).toOption
val maybeCapiContent: Option[Content] = maybeParsedJson.flatMap(json => json.as[Content].toOption)
(json, maybeCapiContent) match {
case (jsObject: JObject, Some(content)) =>
val cardStyle = CardStyle(content, TrailMetaData.empty)
val metaDataMap: Map[String, Boolean] = ResolvedMetaData.toMap(ResolvedMetaData.fromContent(content, cardStyle))
jsObject ~ ("frontsMeta" ->
("defaults" -> metaDataMap) ~
("tone" -> cardStyle.toneString))
case _ => json
}
}) match {
case Success(capiItem) => capiItem
case Failure(_) => json
}
}
}