From d79db1bd17dd99fd01fd9f8a55d9b326dfec379d Mon Sep 17 00:00:00 2001 From: Andy Gallagher Date: Fri, 3 May 2024 17:23:26 +0100 Subject: [PATCH] Add root-level fields to the Feast payload that we need in order to know where to publish it --- app/model/FeastAppModel.scala | 15 +++++++++++++-- .../publishing/FeastPublicationTarget.scala | 14 ++++++++++---- .../publishing/FeastPublicationTargetTest.scala | 6 +++--- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/app/model/FeastAppModel.scala b/app/model/FeastAppModel.scala index 52594f912e8..3dc4492d93b 100644 --- a/app/model/FeastAppModel.scala +++ b/app/model/FeastAppModel.scala @@ -1,7 +1,10 @@ package model +import model.editions.Edition import play.api.libs.json._ +import java.time.LocalDate + object FeastAppModel { sealed trait ContainerItem @@ -12,7 +15,15 @@ object FeastAppModel { case class SubCollection(byline:Option[String], darkPalette:Option[Palette], image:Option[String], body:Option[String], title:String, lightPalette:Option[Palette], recipes:Seq[String]) extends ContainerItem case class FeastAppContainer(id:String, title:String, body:Option[String], items:Seq[ContainerItem]) - type FeastAppCuration = Map[String, IndexedSeq[FeastAppContainer]] + //type FeastAppCuration = Map[String, IndexedSeq[FeastAppContainer]] + + case class FeastAppCuration( + id:String, + edition:Edition, + issueDate:LocalDate, + version:String, + fronts:Map[String,IndexedSeq[FeastAppContainer]] + ) implicit val recipeIdentifierFormat:Format[RecipeIdentifier] = Json.format[RecipeIdentifier] implicit val recipeFormat:Format[Recipe] = Json.format[Recipe] @@ -31,6 +42,6 @@ object FeastAppModel { } ) implicit val feastAppContainerFormat:Format[FeastAppContainer] = Json.format[FeastAppContainer] - //No explicit formatter required for the root level, because it's just a map + implicit val feastAppCurationFormat:Format[FeastAppCuration] = Json.format[FeastAppCuration] } diff --git a/app/services/editions/publishing/FeastPublicationTarget.scala b/app/services/editions/publishing/FeastPublicationTarget.scala index 3161a2318bc..00657de9014 100644 --- a/app/services/editions/publishing/FeastPublicationTarget.scala +++ b/app/services/editions/publishing/FeastPublicationTarget.scala @@ -39,10 +39,16 @@ class FeastPublicationTarget(snsClient:AmazonSNS, config: ApplicationConfigurati ) def transformContent(source: PublishableIssue): FeastAppCuration = { - source.fronts.map(f=>{ - (transformName(f.name), f.collections.map(transformCollections).toIndexedSeq) - }) - }.toMap + FeastAppCuration( + id=source.id, + issueDate=source.issueDate, + edition=source.edition, + version=source.version, + fronts=source.fronts.map(f=>{ + (transformName(f.name), f.collections.map(transformCollections).toIndexedSeq) + }).toMap + ) + } override def putIssue(issue: PublishableIssue, key: Option[String]=None): Unit = { val outputKey = key.getOrElse(EditionsBucket.createKey(issue)) diff --git a/test/services/editions/publishing/FeastPublicationTargetTest.scala b/test/services/editions/publishing/FeastPublicationTargetTest.scala index a6fe89bea7d..90a4cde2f84 100644 --- a/test/services/editions/publishing/FeastPublicationTargetTest.scala +++ b/test/services/editions/publishing/FeastPublicationTargetTest.scala @@ -124,8 +124,8 @@ class FeastPublicationTargetTest extends FreeSpec with Matchers with MockitoSuga val toTest = new FeastPublicationTarget(mockSNS, conf, mockTSG) val result = toTest.transformContent(incoming) - result.contains("all-recipes") shouldBe true - val allRecipesFront = result("all-recipes") + result.fronts.contains("all-recipes") shouldBe true + val allRecipesFront = result.fronts("all-recipes") allRecipesFront.length shouldBe 1 allRecipesFront.head.title shouldBe "Dish of the day" allRecipesFront.head.body shouldBe Some("") //this is just how the `body` field is currently rendered @@ -165,7 +165,7 @@ class FeastPublicationTargetTest extends FreeSpec with Matchers with MockitoSuga topic=None ) - val serializedVersion = """{"all-recipes":[{"id":"98e89761-fdf0-4903-b49d-2af7d66fc930","title":"Dish of the day","body":"","items":[{"recipe":{"id":"123456"}}]}]}""" + val serializedVersion = """{"id":"123456ABCD","edition":"feast-northern-hemisphere","issueDate":"2024-05-03","version":"v1","fronts":{"all-recipes":[{"id":"98e89761-fdf0-4903-b49d-2af7d66fc930","title":"Dish of the day","body":"","items":[{"recipe":{"id":"123456"}}]}]}}""" val mockSNS = mock[AmazonSNSClient] when(mockSNS.publish(any[PublishRequest])).thenReturn(new PublishResult())