common/app/views/support/JavaScriptPage.scala (85 lines of code) (raw):
package views.support
import com.gu.commercial.display.AdTargetParam.toMap
import com.madgag.scala.collection.decorators.MapDecorator
import common.Edition
import common.Maps.RichMap
import common.commercial.EditionAdTargeting._
import conf.Configuration.environment
import conf.Configuration
import model._
import play.api.libs.json._
import model.IpsosTags.getScriptTag
import model.dotcomrendering.DotcomRenderingUtils.assetURL
import play.api.mvc.RequestHeader
import views.support.Commercial.isAdFree
import common.CommercialBundle
object JavaScriptPage {
def get(page: Page, edition: Edition, isPreview: Boolean, request: RequestHeader): JsValue =
Json.toJson(getMap(page, edition, isPreview, request))
def getMap(page: Page, edition: Edition, isPreview: Boolean, request: RequestHeader): Map[String, JsValue] = {
val metaData = page.metadata
val content: Option[Content] = Page.getContent(page).map(_.content)
val pageData = Configuration.javascript.pageData mapKeys { key =>
CamelCase.fromHyphenated(key.split('.').lastOption.getOrElse(""))
}
val config = (Configuration.javascript.config ++ pageData).mapV(JsString.apply)
val sponsorshipType = for {
commercial <- page.metadata.commercial
branding <- commercial.branding(edition)
} yield "sponsorshipType" -> JsString(branding.brandingType.name)
val allowUserGeneratedContent = content.exists(_.allowUserGeneratedContent)
val requiresMembershipAccess = content.exists(_.metadata.requiresMembershipAccess)
val membershipAccess = content.flatMap(_.metadata.membershipAccess).getOrElse("")
val cardStyle = content.map(_.cardStyle.toneString).getOrElse("")
val nonRefreshableLineItemIds: JsArray = {
val ids: Seq[Long] = metaData.commercial.map(_.nonRefreshableLineItemIds) getOrElse Nil
JsArray(ids map (id => JsNumber(id)))
}
val commercialMetaData = Map(
"dfpHost" -> JsString("pubads.g.doubleclick.net"),
"hasPageSkin" -> JsBoolean(metaData.hasPageSkin(request)),
"hasLiveBlogTopAd" -> JsBoolean(metaData.hasLiveBlogTopAd(request, content)),
"hasSurveyAd" -> JsBoolean(metaData.hasSurveyAd(request)),
"shouldHideAdverts" -> JsBoolean(page match {
case c: ContentPage if c.item.content.shouldHideAdverts => true
case _: CommercialExpiryPage => true
case _ => false
}),
"sharedAdTargeting" -> Json.toJson(toMap(metaData.commercial.map(_.adTargeting(edition)) getOrElse Set.empty)),
"pbIndexSites" -> Json.toJson(metaData.commercial.flatMap(_.prebidIndexSites).getOrElse(Set.empty)),
"isSensitive" -> JsBoolean(page.metadata.sensitive),
) ++ sponsorshipType
val journalismMetaData = Map(
"calloutsUrl" -> JsString(Configuration.journalism.calloutsUrl),
)
val javascriptConfig = page match {
case c: ContentPage => c.getJavascriptConfig
case s: StandalonePage => s.getJavascriptConfig
case _ => Map()
}
val ipsos = if (page.metadata.isFront) getScriptTag(page.metadata.id) else getScriptTag(page.metadata.sectionId)
val commercialBundleUrl = Configuration.commercial.overrideCommercialBundleUrl
.getOrElse(CommercialBundle.bundleUrl)
javascriptConfig ++ config ++ commercialMetaData ++ journalismMetaData ++ Map(
("edition", JsString(edition.id)),
("ajaxUrl", JsString(Configuration.ajax.url)),
// TODO: decide whether the value for `isDev` should be
// `environment.isDev` instead
("isDev", JsBoolean(!environment.isProd)),
("isProd", JsBoolean(Configuration.environment.isProd)),
("idUrl", JsString(Configuration.id.url)),
("mmaUrl", JsString(Configuration.id.mmaUrl)),
("beaconUrl", JsString(Configuration.debug.beaconUrl)),
("assetsPath", JsString(Configuration.assets.path)),
("isPreview", JsBoolean(isPreview)),
("allowUserGeneratedContent", JsBoolean(allowUserGeneratedContent)),
("requiresMembershipAccess", JsBoolean(requiresMembershipAccess)),
("membershipAccess", JsString(membershipAccess)),
("idWebAppUrl", JsString(Configuration.id.oauthUrl)),
("cardStyle", JsString(cardStyle)),
("brazeApiKey", JsString(Configuration.braze.apiKey)),
("ipsosTag", JsString(ipsos)),
("isAdFree", JsBoolean(isAdFree(request))),
("commercialBundleUrl", JsString(commercialBundleUrl)),
("stage", JsString(Configuration.environment.stage)),
)
}.toMap
}