From eb1900e4b8a4b2b5c2607a1f012bc63560fa1b8c Mon Sep 17 00:00:00 2001 From: DanielCliftonGuardian <110032454+DanielCliftonGuardian@users.noreply.github.com> Date: Thu, 14 Nov 2024 18:15:45 +0000 Subject: [PATCH 1/5] WIP --- .../controllers/CrosswordsController.scala | 46 ++++++++++++++----- applications/conf/routes | 1 + .../EditionsCrosswordRenderingDataModel.scala | 40 ++++++++++++++++ 3 files changed, 75 insertions(+), 12 deletions(-) create mode 100644 common/app/model/dotcomrendering/pageElements/EditionsCrosswordRenderingDataModel.scala diff --git a/applications/app/controllers/CrosswordsController.scala b/applications/app/controllers/CrosswordsController.scala index 41e2757662d..fe995c681f9 100644 --- a/applications/app/controllers/CrosswordsController.scala +++ b/applications/app/controllers/CrosswordsController.scala @@ -1,19 +1,13 @@ package controllers +import com.gu.contentapi.client.model.v1.Content.unsafeEmpty.crossword +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, - CrosswordPageWithContent, - CrosswordPageWithSvg, - CrosswordSearchPageNoResult, - CrosswordSearchPageWithResults, - CrosswordSvg, -} +import crosswords.{AccessibleCrosswordPage, AccessibleCrosswordRows, CrosswordPageWithContent, CrosswordPageWithSvg, CrosswordSearchPageNoResult, CrosswordSearchPageWithResults, CrosswordSvg} import model.Cached.{RevalidatableResult, WithoutRevalidationResult} import model._ import org.joda.time.{DateTime, LocalDate} @@ -22,6 +16,8 @@ import play.api.data._ import play.api.mvc.{Action, RequestHeader, Result, _} import services.{IndexPage, IndexPageItem} import html.HtmlPageHelpers.ContentCSSFile +import model.dotcomrendering.pageElements.EditionsCrosswordRenderingDataModel +import model.dotcomrendering.pageElements.EditionsCrosswordRenderingDataModel.toJson import model.dotcomrendering.{DotcomRenderingDataModel, PageType} import play.api.libs.ws.WSClient import renderers.DotcomRenderingService @@ -290,11 +286,12 @@ class CrosswordSearchController( case class CrosswordLookup(crosswordType: String, id: Int) } -class CrosswordEditionsController(val controllerComponents: ControllerComponents) - extends BaseController +class CrosswordEditionsController( + val contentApiClient: ContentApiClient, + val controllerComponents: ControllerComponents, +) extends BaseController with GuLogging with ImplicitControllerExecutionContext { - def digitalEdition: Action[AnyContent] = Action.async { implicit request => Future.successful( @@ -303,4 +300,29 @@ class CrosswordEditionsController(val controllerComponents: ControllerComponents ), ) } + + def getCrosswords: Action[AnyContent] = Action.async { implicit request => + contentApiClient + .getResponse( + contentApiClient.item(s"crosswords"), + ) + .flatMap { response => + val crosswords = for { + results <- response.results + quick <- results.find(_.crossword.exists(_.`type` == Quick)).flatMap(_.crossword) + cryptic <- results.find(_.crossword.exists(_.`type` == Cryptic)).flatMap(_.crossword) + } yield (quick, cryptic) + + crosswords match { + case Some((quick, cryptic)) => + val crosswordPage = EditionsCrosswordRenderingDataModel(quick, cryptic) + Future.successful( + Cached(CacheTime.Default)( + RevalidatableResult.Ok(toJson(crosswordPage)), + ).as("application/json"), + ) + case None => Future.successful(NotFound) + } + } + } } diff --git a/applications/conf/routes b/applications/conf/routes index e17e9272bd6..5de2e9ee519 100644 --- a/applications/conf/routes +++ b/applications/conf/routes @@ -29,6 +29,7 @@ GET /crosswords/lookup # Crosswords digital edition GET /crosswords/digital-edition controllers.CrosswordEditionsController.digitalEdition +GET /crosswordtest controllers.CrosswordEditionsController.getCrosswords # Email paths GET /email/form/$emailType/$listId<[0-9]+> controllers.EmailSignupController.renderForm(emailType: String, listId: Int) diff --git a/common/app/model/dotcomrendering/pageElements/EditionsCrosswordRenderingDataModel.scala b/common/app/model/dotcomrendering/pageElements/EditionsCrosswordRenderingDataModel.scala new file mode 100644 index 00000000000..4a568b7edf7 --- /dev/null +++ b/common/app/model/dotcomrendering/pageElements/EditionsCrosswordRenderingDataModel.scala @@ -0,0 +1,40 @@ +package model.dotcomrendering.pageElements + +import com.gu.contentapi.client.model.v1.Crossword +import model.dotcomrendering.DotcomRenderingDataModel +import model.dotcomrendering.DotcomRenderingUtils.withoutNull +import org.apache.thrift.protocol.TSimpleJSONProtocol +import org.apache.thrift.transport.TIOStreamTransport +import play.api.libs.json.{JsValue, Json, OWrites, Writes} + +case class EditionsCrosswordRenderingDataModel( + quick: Crossword, + cryptic: Crossword, +) + +object EditionsCrosswordRenderingDataModel { + // we Json.parse this into a JsValue to ensure we get the raw JSON + // from the Content API rather than a Json.stringified version + private def contentApiToJsonValue(crossword: Crossword): JsValue = { + val protocolFactory = new TSimpleJSONProtocol.Factory + + val buffer = new java.io.ByteArrayOutputStream + val protocol = protocolFactory.getProtocol(new TIOStreamTransport(buffer)) + + Crossword.encode(crossword, protocol) + Json.parse(new String(buffer.toByteArray, "UTF-8")) + } + implicit val writes: Writes[EditionsCrosswordRenderingDataModel] = + new Writes[EditionsCrosswordRenderingDataModel] { + def writes(model: EditionsCrosswordRenderingDataModel) = { + Json.obj( + "quick" -> contentApiToJsonValue(model.quick), + "cryptic" -> contentApiToJsonValue(model.cryptic), + ) + } + } + def toJson(model: EditionsCrosswordRenderingDataModel): String = { + val jsValue = Json.toJson(model) + Json.stringify(withoutNull(jsValue)) + } +} From d6001625b0dfd7ee1aebcb8685f6030906f0b235 Mon Sep 17 00:00:00 2001 From: DanielCliftonGuardian <110032454+DanielCliftonGuardian@users.noreply.github.com> Date: Fri, 15 Nov 2024 13:12:08 +0000 Subject: [PATCH 2/5] Add to DCR service --- .../app/controllers/CrosswordsController.scala | 13 ++++++++++++- applications/conf/routes | 3 +-- build.sbt | 1 + .../EditionsCrosswordRenderingDataModel.scala | 15 ++++----------- common/app/renderers/DotcomRenderingService.scala | 13 ++++++++++++- project/Dependencies.scala | 1 + 6 files changed, 31 insertions(+), 15 deletions(-) diff --git a/applications/app/controllers/CrosswordsController.scala b/applications/app/controllers/CrosswordsController.scala index fe995c681f9..9d170e53d2b 100644 --- a/applications/app/controllers/CrosswordsController.scala +++ b/applications/app/controllers/CrosswordsController.scala @@ -7,7 +7,15 @@ import common.{Edition, GuLogging, ImplicitControllerExecutionContext} import conf.Static import contentapi.ContentApiClient import pages.{CrosswordHtmlPage, IndexHtmlPage, PrintableCrosswordHtmlPage} -import crosswords.{AccessibleCrosswordPage, AccessibleCrosswordRows, CrosswordPageWithContent, CrosswordPageWithSvg, CrosswordSearchPageNoResult, CrosswordSearchPageWithResults, CrosswordSvg} +import crosswords.{ + AccessibleCrosswordPage, + AccessibleCrosswordRows, + CrosswordPageWithContent, + CrosswordPageWithSvg, + CrosswordSearchPageNoResult, + CrosswordSearchPageWithResults, + CrosswordSvg, +} import model.Cached.{RevalidatableResult, WithoutRevalidationResult} import model._ import org.joda.time.{DateTime, LocalDate} @@ -289,6 +297,8 @@ class CrosswordSearchController( class CrosswordEditionsController( val contentApiClient: ContentApiClient, val controllerComponents: ControllerComponents, + val remoteRenderer: DotcomRenderingService = DotcomRenderingService(), + val wsClient: WSClient, ) extends BaseController with GuLogging with ImplicitControllerExecutionContext { @@ -316,6 +326,7 @@ class CrosswordEditionsController( crosswords match { case Some((quick, cryptic)) => val crosswordPage = EditionsCrosswordRenderingDataModel(quick, cryptic) + remoteRenderer.getEditionsCrossword(wsClient, quick, cryptic) Future.successful( Cached(CacheTime.Default)( RevalidatableResult.Ok(toJson(crosswordPage)), diff --git a/applications/conf/routes b/applications/conf/routes index 5de2e9ee519..2c0e804f64b 100644 --- a/applications/conf/routes +++ b/applications/conf/routes @@ -29,8 +29,7 @@ GET /crosswords/lookup # Crosswords digital edition GET /crosswords/digital-edition controllers.CrosswordEditionsController.digitalEdition -GET /crosswordtest controllers.CrosswordEditionsController.getCrosswords - +GET /crosswordtest controllers.CrosswordEditionsController.getCrosswords # Email paths GET /email/form/$emailType/$listId<[0-9]+> controllers.EmailSignupController.renderForm(emailType: String, listId: Int) GET /email/form/$emailType/:listName controllers.EmailSignupController.renderFormFromName(emailType: String, listName: String) diff --git a/build.sbt b/build.sbt index 611392947a1..afc1bac4d01 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 index 4a568b7edf7..11e938a0235 100644 --- a/common/app/model/dotcomrendering/pageElements/EditionsCrosswordRenderingDataModel.scala +++ b/common/app/model/dotcomrendering/pageElements/EditionsCrosswordRenderingDataModel.scala @@ -1,11 +1,10 @@ package model.dotcomrendering.pageElements import com.gu.contentapi.client.model.v1.Crossword -import model.dotcomrendering.DotcomRenderingDataModel import model.dotcomrendering.DotcomRenderingUtils.withoutNull -import org.apache.thrift.protocol.TSimpleJSONProtocol -import org.apache.thrift.transport.TIOStreamTransport -import play.api.libs.json.{JsValue, Json, OWrites, Writes} +import play.api.libs.json.{JsValue, Json, Writes} +import com.gu.contentapi.json.CirceEncoders._ +import io.circe.syntax._ case class EditionsCrosswordRenderingDataModel( quick: Crossword, @@ -16,13 +15,7 @@ object EditionsCrosswordRenderingDataModel { // we Json.parse this into a JsValue to ensure we get the raw JSON // from the Content API rather than a Json.stringified version private def contentApiToJsonValue(crossword: Crossword): JsValue = { - val protocolFactory = new TSimpleJSONProtocol.Factory - - val buffer = new java.io.ByteArrayOutputStream - val protocol = protocolFactory.getProtocol(new TIOStreamTransport(buffer)) - - Crossword.encode(crossword, protocol) - Json.parse(new String(buffer.toByteArray, "UTF-8")) + Json.parse(crossword.asJson.toString()) } implicit val writes: Writes[EditionsCrosswordRenderingDataModel] = new Writes[EditionsCrosswordRenderingDataModel] { diff --git a/common/app/renderers/DotcomRenderingService.scala b/common/app/renderers/DotcomRenderingService.scala index d9cf9b59e0a..5b8ce3b78bd 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,16 @@ class DotcomRenderingService extends GuLogging with ResultWithPreconnectPreload val json = DotcomRenderingDataModel.toJson(dataModel) post(ws, json, Configuration.rendering.articleBaseURL + "/Article", CacheTime.Facia) } + + def getEditionsCrossword( + ws: WSClient, + quickCrossword: Crossword, + crypticCrossword: Crossword, + )(implicit request: RequestHeader): Future[Result] = { + val dataModel = EditionsCrosswordRenderingDataModel(quickCrossword, crypticCrossword) + val json = EditionsCrosswordRenderingDataModel.toJson(dataModel) + post(ws, json, Configuration.rendering.articleBaseURL + "/EditionsCrossword", CacheTime.Facia) + } } object DotcomRenderingService { diff --git a/project/Dependencies.scala b/project/Dependencies.scala index 29751049d28..e9ea26293b8 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 From 115f994fbee5e0c4f2f0802e0e15c7ddd6ecb32e Mon Sep 17 00:00:00 2001 From: DanielCliftonGuardian <110032454+DanielCliftonGuardian@users.noreply.github.com> Date: Fri, 15 Nov 2024 16:59:29 +0000 Subject: [PATCH 3/5] Send to dcr --- .../controllers/CrosswordsController.scala | 49 +++++++------------ applications/conf/routes | 2 +- .../EditionsCrosswordRenderingDataModel.scala | 23 ++------- .../renderers/DotcomRenderingService.scala | 6 +-- 4 files changed, 26 insertions(+), 54 deletions(-) diff --git a/applications/app/controllers/CrosswordsController.scala b/applications/app/controllers/CrosswordsController.scala index 9d170e53d2b..3b52eadc9e5 100644 --- a/applications/app/controllers/CrosswordsController.scala +++ b/applications/app/controllers/CrosswordsController.scala @@ -302,38 +302,25 @@ class CrosswordEditionsController( ) 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 getCrosswords: Action[AnyContent] = Action.async { implicit request => - contentApiClient - .getResponse( - contentApiClient.item(s"crosswords"), - ) - .flatMap { response => - val crosswords = for { - results <- response.results - quick <- results.find(_.crossword.exists(_.`type` == Quick)).flatMap(_.crossword) - cryptic <- results.find(_.crossword.exists(_.`type` == Cryptic)).flatMap(_.crossword) - } yield (quick, cryptic) - - crosswords match { - case Some((quick, cryptic)) => - val crosswordPage = EditionsCrosswordRenderingDataModel(quick, cryptic) - remoteRenderer.getEditionsCrossword(wsClient, quick, cryptic) - Future.successful( - Cached(CacheTime.Default)( - RevalidatableResult.Ok(toJson(crosswordPage)), - ).as("application/json"), - ) - case None => Future.successful(NotFound) - } + 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/applications/conf/routes b/applications/conf/routes index 2c0e804f64b..e17e9272bd6 100644 --- a/applications/conf/routes +++ b/applications/conf/routes @@ -29,7 +29,7 @@ GET /crosswords/lookup # Crosswords digital edition GET /crosswords/digital-edition controllers.CrosswordEditionsController.digitalEdition -GET /crosswordtest controllers.CrosswordEditionsController.getCrosswords + # Email paths GET /email/form/$emailType/$listId<[0-9]+> controllers.EmailSignupController.renderForm(emailType: String, listId: Int) GET /email/form/$emailType/:listName controllers.EmailSignupController.renderFormFromName(emailType: String, listName: String) diff --git a/common/app/model/dotcomrendering/pageElements/EditionsCrosswordRenderingDataModel.scala b/common/app/model/dotcomrendering/pageElements/EditionsCrosswordRenderingDataModel.scala index 11e938a0235..92cfff9ec8a 100644 --- a/common/app/model/dotcomrendering/pageElements/EditionsCrosswordRenderingDataModel.scala +++ b/common/app/model/dotcomrendering/pageElements/EditionsCrosswordRenderingDataModel.scala @@ -1,9 +1,8 @@ package model.dotcomrendering.pageElements import com.gu.contentapi.client.model.v1.Crossword -import model.dotcomrendering.DotcomRenderingUtils.withoutNull -import play.api.libs.json.{JsValue, Json, Writes} import com.gu.contentapi.json.CirceEncoders._ +import io.circe.JsonObject import io.circe.syntax._ case class EditionsCrosswordRenderingDataModel( @@ -12,22 +11,10 @@ case class EditionsCrosswordRenderingDataModel( ) object EditionsCrosswordRenderingDataModel { - // we Json.parse this into a JsValue to ensure we get the raw JSON - // from the Content API rather than a Json.stringified version - private def contentApiToJsonValue(crossword: Crossword): JsValue = { - Json.parse(crossword.asJson.toString()) - } - implicit val writes: Writes[EditionsCrosswordRenderingDataModel] = - new Writes[EditionsCrosswordRenderingDataModel] { - def writes(model: EditionsCrosswordRenderingDataModel) = { - Json.obj( - "quick" -> contentApiToJsonValue(model.quick), - "cryptic" -> contentApiToJsonValue(model.cryptic), - ) - } - } def toJson(model: EditionsCrosswordRenderingDataModel): String = { - val jsValue = Json.toJson(model) - Json.stringify(withoutNull(jsValue)) + 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 5b8ce3b78bd..36aabed2010 100644 --- a/common/app/renderers/DotcomRenderingService.scala +++ b/common/app/renderers/DotcomRenderingService.scala @@ -421,11 +421,9 @@ class DotcomRenderingService extends GuLogging with ResultWithPreconnectPreload def getEditionsCrossword( ws: WSClient, - quickCrossword: Crossword, - crypticCrossword: Crossword, + crosswords: EditionsCrosswordRenderingDataModel, )(implicit request: RequestHeader): Future[Result] = { - val dataModel = EditionsCrosswordRenderingDataModel(quickCrossword, crypticCrossword) - val json = EditionsCrosswordRenderingDataModel.toJson(dataModel) + val json = EditionsCrosswordRenderingDataModel.toJson(crosswords) post(ws, json, Configuration.rendering.articleBaseURL + "/EditionsCrossword", CacheTime.Facia) } } From f6b8b9a1b76b56cd2446013377dd00ca3d162258 Mon Sep 17 00:00:00 2001 From: DanielCliftonGuardian <110032454+DanielCliftonGuardian@users.noreply.github.com> Date: Wed, 20 Nov 2024 12:35:28 +0000 Subject: [PATCH 4/5] Update CrosswordsController.scala --- .../app/controllers/CrosswordsController.scala | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/applications/app/controllers/CrosswordsController.scala b/applications/app/controllers/CrosswordsController.scala index 3b52eadc9e5..48c16256bec 100644 --- a/applications/app/controllers/CrosswordsController.scala +++ b/applications/app/controllers/CrosswordsController.scala @@ -1,12 +1,10 @@ package controllers -import com.gu.contentapi.client.model.v1.Content.unsafeEmpty.crossword 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, @@ -16,20 +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.pageElements.EditionsCrosswordRenderingDataModel -import model.dotcomrendering.pageElements.EditionsCrosswordRenderingDataModel.toJson -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._ From cc8dd30194319ffd2a08e6c30f40909b98f9a567 Mon Sep 17 00:00:00 2001 From: DanielCliftonGuardian <110032454+DanielCliftonGuardian@users.noreply.github.com> Date: Wed, 20 Nov 2024 13:51:50 +0000 Subject: [PATCH 5/5] Use CacheTime.Default --- common/app/renderers/DotcomRenderingService.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/app/renderers/DotcomRenderingService.scala b/common/app/renderers/DotcomRenderingService.scala index 36aabed2010..32d7e067a59 100644 --- a/common/app/renderers/DotcomRenderingService.scala +++ b/common/app/renderers/DotcomRenderingService.scala @@ -424,7 +424,7 @@ class DotcomRenderingService extends GuLogging with ResultWithPreconnectPreload crosswords: EditionsCrosswordRenderingDataModel, )(implicit request: RequestHeader): Future[Result] = { val json = EditionsCrosswordRenderingDataModel.toJson(crosswords) - post(ws, json, Configuration.rendering.articleBaseURL + "/EditionsCrossword", CacheTime.Facia) + post(ws, json, Configuration.rendering.articleBaseURL + "/EditionsCrossword", CacheTime.Default) } }