sport/app/cricket/controllers/CricketMatchController.scala (90 lines of code) (raw):
package cricket.controllers
import common._
import conf.Configuration
import cricketModel.Match
import conf.cricketPa.{CricketTeam, CricketTeams}
import football.model.{CricketScoreBoardDataModel, DotcomRenderingCricketDataModel}
import implicits.{HtmlFormat, JsonFormat}
import jobs.CricketStatsJob
import model.Cached.RevalidatableResult
import model._
import play.api.libs.json.Json
import play.api.libs.ws.WSClient
import play.api.mvc.{Action, AnyContent, BaseController, ControllerComponents, RequestHeader, Result}
import renderers.DotcomRenderingService
import services.dotcomrendering.{CricketPagePicker, RemoteRender}
import scala.concurrent.Future
import scala.concurrent.Future.successful
case class CricketMatchPage(theMatch: Match, matchId: String, team: CricketTeam) extends StandalonePage {
override val metadata = MetaData.make(
id = s"/sport/cricket/match/$matchId/${team.wordsForUrl}",
section = Some(SectionId.fromId("cricket")),
webTitle = s"${theMatch.competitionName}, ${theMatch.venueName}",
)
}
class CricketMatchController(
cricketStatsJob: CricketStatsJob,
val controllerComponents: ControllerComponents,
val wsClient: WSClient,
)(implicit
context: ApplicationContext,
) extends BaseController
with GuLogging
with ImplicitControllerExecutionContext {
val remoteRenderer: DotcomRenderingService = DotcomRenderingService()
def renderMatchIdJson(date: String, teamId: String): Action[AnyContent] = renderMatchId(date, teamId)
def renderMatchScoreboardJson(date: String, teamId: String): Action[AnyContent] =
Action { implicit request =>
CricketTeams
.byWordsForUrl(teamId)
.flatMap { team =>
cricketStatsJob.findMatch(team, date).map { matchData =>
val page = CricketMatchPage(matchData, date, team)
Cached(60) {
JsonComponent(
"match" -> CricketScoreBoardDataModel.toJson(page.theMatch),
"scorecardUrl" -> (Configuration.site.host + page.metadata.id),
)
}
}
}
.getOrElse(NoCache(NotFound))
}
def renderMatchId(date: String, teamId: String): Action[AnyContent] =
Action.async { implicit request =>
CricketTeams
.byWordsForUrl(teamId)
.flatMap { team =>
cricketStatsJob.findMatch(team, date).map { matchData =>
val page = CricketMatchPage(matchData, date, team)
renderMatch(page)
}
}
.getOrElse(successful(NoCache(NotFound)))
}
private def renderMatch(
page: CricketMatchPage,
)(implicit request: RequestHeader, context: ApplicationContext): Future[Result] = {
val tier = CricketPagePicker.getTier()
request.getRequestFormat match {
case JsonFormat if request.forceDCR =>
val model = DotcomRenderingCricketDataModel(page)
successful(Cached(CacheTime.Cricket)(JsonComponent.fromWritable(model)))
case JsonFormat =>
successful(Cached(CacheTime.Cricket) {
JsonComponent(
"summary" -> cricket.views.html.fragments
.cricketMatchSummary(page.theMatch, page.metadata.id)
.toString,
)
})
case HtmlFormat if tier == RemoteRender =>
val model = DotcomRenderingCricketDataModel(page)
remoteRenderer.getCricketPage(wsClient, DotcomRenderingCricketDataModel.toJson(model))
case _ =>
successful(Cached(CacheTime.Cricket) {
RevalidatableResult.Ok(cricket.views.html.cricketMatch(page))
})
}
}
}