diff --git a/applications/app/controllers/CrosswordsController.scala b/applications/app/controllers/CrosswordsController.scala index 41e2757662d3..48c16256bec4 100644 --- a/applications/app/controllers/CrosswordsController.scala +++ b/applications/app/controllers/CrosswordsController.scala @@ -1,10 +1,10 @@ package controllers +import com.gu.contentapi.client.model.v1.CrosswordType.{Cryptic, Quick} import com.gu.contentapi.client.model.v1.{Crossword, ItemResponse, Content => ApiContent, Section => ApiSection} import common.{Edition, GuLogging, ImplicitControllerExecutionContext} import conf.Static import contentapi.ContentApiClient -import pages.{CrosswordHtmlPage, IndexHtmlPage, PrintableCrosswordHtmlPage} import crosswords.{ AccessibleCrosswordPage, AccessibleCrosswordRows, @@ -14,18 +14,20 @@ import crosswords.{ CrosswordSearchPageWithResults, CrosswordSvg, } +import html.HtmlPageHelpers.ContentCSSFile import model.Cached.{RevalidatableResult, WithoutRevalidationResult} import model._ +import model.dotcomrendering.pageElements.EditionsCrosswordRenderingDataModel +import model.dotcomrendering.{DotcomRenderingDataModel, PageType} import org.joda.time.{DateTime, LocalDate} +import pages.{CrosswordHtmlPage, IndexHtmlPage, PrintableCrosswordHtmlPage} import play.api.data.Forms._ import play.api.data._ -import play.api.mvc.{Action, RequestHeader, Result, _} -import services.{IndexPage, IndexPageItem} -import html.HtmlPageHelpers.ContentCSSFile -import model.dotcomrendering.{DotcomRenderingDataModel, PageType} import play.api.libs.ws.WSClient +import play.api.mvc._ import renderers.DotcomRenderingService import services.dotcomrendering.{CrosswordsPicker, RemoteRender} +import services.{IndexPage, IndexPageItem} import scala.concurrent.Future import scala.concurrent.duration._ @@ -290,17 +292,33 @@ class CrosswordSearchController( case class CrosswordLookup(crosswordType: String, id: Int) } -class CrosswordEditionsController(val controllerComponents: ControllerComponents) - extends BaseController +class CrosswordEditionsController( + val contentApiClient: ContentApiClient, + val controllerComponents: ControllerComponents, + val remoteRenderer: DotcomRenderingService = DotcomRenderingService(), + val wsClient: WSClient, +) extends BaseController with GuLogging with ImplicitControllerExecutionContext { - def digitalEdition: Action[AnyContent] = - Action.async { implicit request => - Future.successful( - Cached(CacheTime.Default)( - RevalidatableResult.Ok("Digital Edition Crossword Entry Point"), - ), - ) - } + def digitalEdition: Action[AnyContent] = Action.async { implicit request => + getCrosswords + .map(parseCrosswords) + .flatMap { + case Some(crosswordPage) => + remoteRenderer.getEditionsCrossword(wsClient, crosswordPage) + case None => Future.successful(NotFound) + } + } + + private lazy val crosswordsQuery = contentApiClient.item("crosswords") + + private def getCrosswords: Future[ItemResponse] = contentApiClient.getResponse(crosswordsQuery) + + private def parseCrosswords(response: ItemResponse): Option[EditionsCrosswordRenderingDataModel] = + for { + results <- response.results + quick <- results.find(_.crossword.exists(_.`type` == Quick)).flatMap(_.crossword) + cryptic <- results.find(_.crossword.exists(_.`type` == Cryptic)).flatMap(_.crossword) + } yield EditionsCrosswordRenderingDataModel(quick, cryptic) } diff --git a/build.sbt b/build.sbt index 611392947a12..afc1bac4d019 100644 --- a/build.sbt +++ b/build.sbt @@ -31,6 +31,7 @@ val common = library("common") eTagCachingS3, nettyCodecHttp2, contentApiClient, + contentApiModelsJson, enumeratumPlayJson, filters, commonsLang, diff --git a/common/app/model/dotcomrendering/pageElements/EditionsCrosswordRenderingDataModel.scala b/common/app/model/dotcomrendering/pageElements/EditionsCrosswordRenderingDataModel.scala new file mode 100644 index 000000000000..92cfff9ec8a3 --- /dev/null +++ b/common/app/model/dotcomrendering/pageElements/EditionsCrosswordRenderingDataModel.scala @@ -0,0 +1,20 @@ +package model.dotcomrendering.pageElements + +import com.gu.contentapi.client.model.v1.Crossword +import com.gu.contentapi.json.CirceEncoders._ +import io.circe.JsonObject +import io.circe.syntax._ + +case class EditionsCrosswordRenderingDataModel( + quick: Crossword, + cryptic: Crossword, +) + +object EditionsCrosswordRenderingDataModel { + def toJson(model: EditionsCrosswordRenderingDataModel): String = { + JsonObject( + "quick" -> model.quick.asJson.dropNullValues, + "cryptic" -> model.cryptic.asJson.dropNullValues, + ).asJson.dropNullValues.noSpaces + } +} diff --git a/common/app/renderers/DotcomRenderingService.scala b/common/app/renderers/DotcomRenderingService.scala index d9cf9b59e0a1..32d7e067a59a 100644 --- a/common/app/renderers/DotcomRenderingService.scala +++ b/common/app/renderers/DotcomRenderingService.scala @@ -1,7 +1,7 @@ package renderers import org.apache.pekko.actor.{ActorSystem => PekkoActorSystem} -import com.gu.contentapi.client.model.v1.{Block, Blocks, Content} +import com.gu.contentapi.client.model.v1.{Block, Blocks, Content, Crossword} import common.{DCRMetrics, GuLogging} import concurrent.CircuitBreakerRegistry import conf.Configuration @@ -10,6 +10,7 @@ import crosswords.CrosswordPageWithContent import http.{HttpPreconnections, ResultWithPreconnectPreload} import model.Cached.{RevalidatableResult, WithoutRevalidationResult} import model.dotcomrendering._ +import model.dotcomrendering.pageElements.EditionsCrosswordRenderingDataModel import model.{ CacheTime, Cached, @@ -417,6 +418,14 @@ class DotcomRenderingService extends GuLogging with ResultWithPreconnectPreload val json = DotcomRenderingDataModel.toJson(dataModel) post(ws, json, Configuration.rendering.articleBaseURL + "/Article", CacheTime.Facia) } + + def getEditionsCrossword( + ws: WSClient, + crosswords: EditionsCrosswordRenderingDataModel, + )(implicit request: RequestHeader): Future[Result] = { + val json = EditionsCrosswordRenderingDataModel.toJson(crosswords) + post(ws, json, Configuration.rendering.articleBaseURL + "/EditionsCrossword", CacheTime.Default) + } } object DotcomRenderingService { diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 29751049d289..e9ea26293b89 100644 --- a/project/Dependencies.scala +++ b/project/Dependencies.scala @@ -32,6 +32,7 @@ object Dependencies { val commonsIo = "commons-io" % "commons-io" % "2.16.1" val cssParser = "net.sourceforge.cssparser" % "cssparser" % "0.9.30" val contentApiClient = "com.gu" %% "content-api-client" % capiVersion + val contentApiModelsJson = "com.gu" %% "content-api-models-json" % "25.1.0" val dfpAxis = "com.google.api-ads" % "dfp-axis" % "5.6.0" val faciaFapiScalaClient = "com.gu" %% "fapi-client-play30" % faciaVersion val identityCookie = "com.gu.identity" %% "identity-cookie" % identityLibVersion