sport/app/football/model/DotcomRenderingCricketDataModel.scala (111 lines of code) (raw):
package football.model
import common.{CanonicalLink, Edition}
import conf.Configuration
import cricket.controllers.CricketMatchPage
import cricketModel.{Innings, InningsBatter, InningsBowler, InningsWicket, Match, Team}
import experiments.ActiveExperiments
import model.ApplicationContext
import model.dotcomrendering.DotcomRenderingUtils.{assetURL, withoutNull}
import model.dotcomrendering.{Config, PageFooter, PageType}
import navigation.{FooterLinks, Nav}
import play.api.libs.json.{JsObject, JsValue, Json, Writes}
import play.api.mvc.RequestHeader
import views.support.{CamelCase, JavaScriptPage}
case class DotcomRenderingCricketDataModel(
cricketMatch: Match,
nav: Nav,
editionId: String,
guardianBaseURL: String,
config: JsObject,
pageFooter: PageFooter,
isAdFreeUser: Boolean,
contributionsServiceUrl: String,
canonicalUrl: String,
pageId: String,
)
object DotcomRenderingCricketDataModel {
def apply(
page: CricketMatchPage,
)(implicit
request: RequestHeader,
context: ApplicationContext,
): DotcomRenderingCricketDataModel = {
val edition = Edition(request)
val nav = Nav(page, edition)
val pageType: PageType = PageType(page, request, context)
val switches: Map[String, Boolean] = conf.switches.Switches.all
.filter(_.exposeClientSide)
.foldLeft(Map.empty[String, Boolean])((acc, switch) => {
acc + (CamelCase.fromHyphenated(switch.name) -> switch.isSwitchedOn)
})
val config = Config(
switches = switches,
abTests = ActiveExperiments.getJsMap(request),
ampIframeUrl = assetURL("data/vendor/amp-iframe.html"),
googletagUrl = Configuration.googletag.jsLocation,
stage = common.Environment.stage,
frontendAssetsFullURL = Configuration.assets.fullURL(common.Environment.stage),
)
val combinedConfig: JsObject = {
val jsPageConfig: Map[String, JsValue] =
JavaScriptPage.getMap(page, Edition(request), pageType.isPreview, request)
Json.toJsObject(config).deepMerge(JsObject(jsPageConfig))
}
DotcomRenderingCricketDataModel(
page.theMatch,
nav = nav,
editionId = edition.id,
guardianBaseURL = Configuration.site.host,
config = combinedConfig,
pageFooter = PageFooter(FooterLinks.getFooterByEdition(edition)),
isAdFreeUser = views.support.Commercial.isAdFree(request),
contributionsServiceUrl = Configuration.contributionsService.url,
canonicalUrl = CanonicalLink(request, page.metadata.webUrl),
pageId = page.metadata.id,
)
}
implicit val dotcomRenderingCricketDataModelFormat: Writes[DotcomRenderingCricketDataModel] =
Json.writes[DotcomRenderingCricketDataModel]
def toJson(model: DotcomRenderingCricketDataModel): JsValue = {
val jsValue = Json.toJson(model)
withoutNull(jsValue)
}
}
object CricketScoreBoardDataModel {
private def getTeam(team: Team) = {
Json.obj(
"name" -> team.name,
"home" -> team.home,
)
}
private def getFallOfWicket(inningsWicket: InningsWicket) = {
Json.obj(
"order" -> inningsWicket.order,
)
}
private def getInnings(innings: Innings) = {
Json.obj(
"order" -> innings.order,
"battingTeam" -> innings.battingTeam,
"runsScored" -> innings.runsScored,
"declared" -> innings.declared,
"forfeited" -> innings.forfeited,
"fallOfWicket" -> innings.fallOfWicket.map(getFallOfWicket),
"overs" -> innings.overs,
)
}
def getMatch(theMatch: Match): JsObject = {
Json.obj(
"matchId" -> theMatch.matchId,
"competitionName" -> theMatch.competitionName,
"venueName" -> theMatch.venueName,
"teams" -> theMatch.teams.map(getTeam),
"innings" -> theMatch.innings.map(getInnings),
"gameDate" -> theMatch.gameDate,
)
}
def toJson(theMatch: Match): JsValue = {
val jsValue = Json.toJson(getMatch(theMatch))
withoutNull(jsValue)
}
}