From 0ad4117ff589b4503cdb0d41e95da1496a47b4c4 Mon Sep 17 00:00:00 2001 From: Emma Imber Date: Mon, 1 Sep 2025 11:29:14 +0100 Subject: [PATCH 01/11] Add product element type and decoders Co-authored-by: Oliver Abrahams --- .../gu/contentapi/json/CirceDecoders.scala | 2 + .../gu/contentapi/json/CirceEncoders.scala | 2 + models/src/main/thrift/content/v1.thrift | 44 +++++++++++++++++++ 3 files changed, 48 insertions(+) diff --git a/json/src/main/scala/com/gu/contentapi/json/CirceDecoders.scala b/json/src/main/scala/com/gu/contentapi/json/CirceDecoders.scala index 60fabb2..54544a1 100644 --- a/json/src/main/scala/com/gu/contentapi/json/CirceDecoders.scala +++ b/json/src/main/scala/com/gu/contentapi/json/CirceDecoders.scala @@ -238,4 +238,6 @@ object CirceDecoders { implicit val pillarsResponseDecoder: Decoder[PillarsResponse] = deriveDecoder implicit val embedReachDecoder: Decoder[EmbedReach] = deriveDecoder implicit val linkElementFieldsDecoder: Decoder[LinkElementFields] = deriveDecoder + implicit val statisticDecoder: Decoder[Statistic] = deriveDecoder + implicit val productElementFieldsDecoder: Decoder[ProductElementFields] = deriveDecoder } diff --git a/json/src/main/scala/com/gu/contentapi/json/CirceEncoders.scala b/json/src/main/scala/com/gu/contentapi/json/CirceEncoders.scala index d713773..5fce2e8 100644 --- a/json/src/main/scala/com/gu/contentapi/json/CirceEncoders.scala +++ b/json/src/main/scala/com/gu/contentapi/json/CirceEncoders.scala @@ -187,6 +187,8 @@ object CirceEncoders { implicit val pillarsResponseEncoder: Encoder[PillarsResponse] = deriveEncoder implicit val embedReachEncoder: Encoder[EmbedReach] = deriveEncoder implicit val linkElementFieldsEncoder: Encoder[LinkElementFields] = deriveEncoder + implicit val statisticEncoder: Encoder[Statistic] = deriveEncoder + implicit val productElementFieldsEncoder: Encoder[ProductElementFields] = deriveEncoder def genDateTimeEncoder(truncate: Boolean = true): Encoder[CapiDateTime] = Encoder.instance[CapiDateTime] { capiDateTime => val dateTime: OffsetDateTime = OffsetDateTime.parse(capiDateTime.iso8601) diff --git a/models/src/main/thrift/content/v1.thrift b/models/src/main/thrift/content/v1.thrift index 0f04ce8..1516a2e 100644 --- a/models/src/main/thrift/content/v1.thrift +++ b/models/src/main/thrift/content/v1.thrift @@ -152,6 +152,8 @@ enum ElementType { TIMELINE = 24 LINK = 25 + + PRODUCT = 26 } enum TagType { @@ -961,6 +963,46 @@ struct TimelineElementFields { 1: required list sections; } +struct Statistic { + 1: optional string name, + + 2: optional string value, +} + +struct ProductElementFields { + 1: optional string productName; + + 2: optional string brandName; + + 3: optional string primaryHeading; + + 4: optional string secondaryHeading; + + 5: optional string starRating; + + 6: optional string primaryProductUrl; + + 7: optional string primaryCta; + + 8: optional string primaryRetailer; + + 9: optional string primaryPrice; + + 10: optional string secondaryProductUrl; + + 11: optional string secondaryCta; + + 12: optional string secondaryRetailer; + + 13: optional string secondaryPrice; + + 14: optional list statistics; + + 15: optional CartoonImage image; + + 16: optional list content; +} + struct BlockElement { 1: required ElementType type @@ -1023,6 +1065,8 @@ struct BlockElement { 27: optional TimelineElementFields timelineTypeData 28: optional LinkElementFields linkTypeData + + 29: optional ProductElementFields productTypeData } struct MembershipPlaceholder { From e5ad069e9776589f860480dbf0619b63574852eb Mon Sep 17 00:00:00 2001 From: ollie_abrahams Date: Tue, 9 Sep 2025 13:30:45 +0100 Subject: [PATCH 02/11] add Product Display Type --- models/src/main/thrift/content/v1.thrift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/models/src/main/thrift/content/v1.thrift b/models/src/main/thrift/content/v1.thrift index 1516a2e..58e582a 100644 --- a/models/src/main/thrift/content/v1.thrift +++ b/models/src/main/thrift/content/v1.thrift @@ -911,6 +911,11 @@ enum ListType { MULTI_BYLINE = 4, } +enum ProductDisplayType { + INLINE_WITH_PRODUCT_CARD = 0, + INLINE_ONLY = 1, +} + struct ListItem { 1: required list elements = []; @@ -1001,6 +1006,8 @@ struct ProductElementFields { 15: optional CartoonImage image; 16: optional list content; + + 17: required ProductDisplayType displayType; } struct BlockElement { From d74031259fb026b024afd9b58c4f4f5ff71d55e2 Mon Sep 17 00:00:00 2001 From: ollie_abrahams Date: Tue, 16 Sep 2025 09:40:39 +0100 Subject: [PATCH 03/11] add temp Product type --- models/src/main/thrift/content/v1.thrift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/src/main/thrift/content/v1.thrift b/models/src/main/thrift/content/v1.thrift index 58e582a..4e66304 100644 --- a/models/src/main/thrift/content/v1.thrift +++ b/models/src/main/thrift/content/v1.thrift @@ -1073,7 +1073,7 @@ struct BlockElement { 28: optional LinkElementFields linkTypeData - 29: optional ProductElementFields productTypeData + 29: optional ProductElementFields tempProductTypeData } struct MembershipPlaceholder { From 873da3a9f6be83868631fc1ab7311916040d21e7 Mon Sep 17 00:00:00 2001 From: Emma Imber Date: Wed, 17 Sep 2025 12:04:51 +0100 Subject: [PATCH 04/11] Use BlockElement type for nested product content --- models/src/main/thrift/content/v1.thrift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models/src/main/thrift/content/v1.thrift b/models/src/main/thrift/content/v1.thrift index 4e66304..ac79c16 100644 --- a/models/src/main/thrift/content/v1.thrift +++ b/models/src/main/thrift/content/v1.thrift @@ -1005,7 +1005,7 @@ struct ProductElementFields { 15: optional CartoonImage image; - 16: optional list content; + 16: optional list content; 17: required ProductDisplayType displayType; } From 5008ad8a0929b3e01f7cfa25933b8cbf9998913c Mon Sep 17 00:00:00 2001 From: ollie_abrahams Date: Fri, 26 Sep 2025 14:51:24 +0100 Subject: [PATCH 05/11] update Image type --- models/src/main/thrift/content/v1.thrift | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/models/src/main/thrift/content/v1.thrift b/models/src/main/thrift/content/v1.thrift index ac79c16..efedefe 100644 --- a/models/src/main/thrift/content/v1.thrift +++ b/models/src/main/thrift/content/v1.thrift @@ -1003,13 +1003,19 @@ struct ProductElementFields { 14: optional list statistics; - 15: optional CartoonImage image; + 15: optional Image image; 16: optional list content; 17: required ProductDisplayType displayType; } +struct Image { + 1: required list assets; + + 2: required ImageElementFields fields; +} + struct BlockElement { 1: required ElementType type From a4ac8309feb0611cf24c9f0f89e2860c290603f3 Mon Sep 17 00:00:00 2001 From: ollie_abrahams Date: Fri, 26 Sep 2025 15:03:17 +0100 Subject: [PATCH 06/11] update encoders and decoders --- .../main/scala/com/gu/contentapi/json/CirceDecoders.scala | 5 +++-- .../main/scala/com/gu/contentapi/json/CirceEncoders.scala | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/json/src/main/scala/com/gu/contentapi/json/CirceDecoders.scala b/json/src/main/scala/com/gu/contentapi/json/CirceDecoders.scala index 54544a1..4b67dc4 100644 --- a/json/src/main/scala/com/gu/contentapi/json/CirceDecoders.scala +++ b/json/src/main/scala/com/gu/contentapi/json/CirceDecoders.scala @@ -4,7 +4,7 @@ import io.circe._ import io.circe.generic.semiauto._ import com.gu.contentapi.client.model.v1._ import com.gu.contentapi.client.model.schemaorg.{SchemaOrg, SchemaRecipe, AuthorInfo, RecipeStep} -import com.gu.contentatom.thrift.atom._ +import com.gu.contentatom.thrift.ato2m._ import com.gu.contentatom.{thrift => contentatom} import com.gu.contententity.thrift.entity._ import com.gu.contententity.{thrift => contententity} @@ -161,7 +161,7 @@ object CirceDecoders { implicit val resultBucketsDecoder: Decoder[quiz.ResultBuckets] = deriveDecoder implicit val resultBucketDecoder: Decoder[quiz.ResultBucket] = deriveDecoder implicit val mediaAtomDecoder: Decoder[media.MediaAtom] = deriveDecoder - implicit val imageDecoder: Decoder[contentatom.Image] = deriveDecoder + implicit val atomImageDecoder: Decoder[contentatom.Image] = deriveDecoder implicit val imageAssetDecoder: Decoder[contentatom.ImageAsset] = deriveDecoder implicit val imageAssetDimensionsDecoder: Decoder[contentatom.ImageAssetDimensions] = deriveDecoder implicit val mediaAssetDecoder: Decoder[media.Asset] = deriveDecoder @@ -239,5 +239,6 @@ object CirceDecoders { implicit val embedReachDecoder: Decoder[EmbedReach] = deriveDecoder implicit val linkElementFieldsDecoder: Decoder[LinkElementFields] = deriveDecoder implicit val statisticDecoder: Decoder[Statistic] = deriveDecoder + implicit val imageDecoder: Decoder[Image] = deriveDecoder implicit val productElementFieldsDecoder: Decoder[ProductElementFields] = deriveDecoder } diff --git a/json/src/main/scala/com/gu/contentapi/json/CirceEncoders.scala b/json/src/main/scala/com/gu/contentapi/json/CirceEncoders.scala index 5fce2e8..72745fd 100644 --- a/json/src/main/scala/com/gu/contentapi/json/CirceEncoders.scala +++ b/json/src/main/scala/com/gu/contentapi/json/CirceEncoders.scala @@ -110,7 +110,7 @@ object CirceEncoders { implicit val resultBucketsEncoder: Encoder[quiz.ResultBuckets] = deriveEncoder implicit val resultBucketEncoder: Encoder[quiz.ResultBucket] = deriveEncoder implicit val mediaAtomEncoder: Encoder[media.MediaAtom] = deriveEncoder - implicit val imageEncoder: Encoder[contentatom.Image] = deriveEncoder + implicit val atomImageEncoder: Encoder[contentatom.Image] = deriveEncoder implicit val imageAssetEncoder: Encoder[contentatom.ImageAsset] = deriveEncoder implicit val imageAssetDimensionsEncoder: Encoder[contentatom.ImageAssetDimensions] = deriveEncoder implicit val mediaAssetEncoder: Encoder[media.Asset] = deriveEncoder @@ -188,6 +188,7 @@ object CirceEncoders { implicit val embedReachEncoder: Encoder[EmbedReach] = deriveEncoder implicit val linkElementFieldsEncoder: Encoder[LinkElementFields] = deriveEncoder implicit val statisticEncoder: Encoder[Statistic] = deriveEncoder + implicit val imageEncoder: Encoder[Image] = deriveEncoder implicit val productElementFieldsEncoder: Encoder[ProductElementFields] = deriveEncoder def genDateTimeEncoder(truncate: Boolean = true): Encoder[CapiDateTime] = Encoder.instance[CapiDateTime] { capiDateTime => From 0e14aebe371d76d85b1a821105604218b55601cb Mon Sep 17 00:00:00 2001 From: ollie_abrahams Date: Fri, 26 Sep 2025 15:19:29 +0100 Subject: [PATCH 07/11] update encoders and decoders --- .../main/scala/com/gu/contentapi/json/CirceDecoders.scala | 6 +++--- .../main/scala/com/gu/contentapi/json/CirceEncoders.scala | 4 ++-- models/src/main/thrift/content/v1.thrift | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/json/src/main/scala/com/gu/contentapi/json/CirceDecoders.scala b/json/src/main/scala/com/gu/contentapi/json/CirceDecoders.scala index 4b67dc4..c8ed0a8 100644 --- a/json/src/main/scala/com/gu/contentapi/json/CirceDecoders.scala +++ b/json/src/main/scala/com/gu/contentapi/json/CirceDecoders.scala @@ -4,7 +4,7 @@ import io.circe._ import io.circe.generic.semiauto._ import com.gu.contentapi.client.model.v1._ import com.gu.contentapi.client.model.schemaorg.{SchemaOrg, SchemaRecipe, AuthorInfo, RecipeStep} -import com.gu.contentatom.thrift.ato2m._ +import com.gu.contentatom.thrift.atom._ import com.gu.contentatom.{thrift => contentatom} import com.gu.contententity.thrift.entity._ import com.gu.contententity.{thrift => contententity} @@ -161,7 +161,7 @@ object CirceDecoders { implicit val resultBucketsDecoder: Decoder[quiz.ResultBuckets] = deriveDecoder implicit val resultBucketDecoder: Decoder[quiz.ResultBucket] = deriveDecoder implicit val mediaAtomDecoder: Decoder[media.MediaAtom] = deriveDecoder - implicit val atomImageDecoder: Decoder[contentatom.Image] = deriveDecoder + implicit val imageDecoder: Decoder[contentatom.Image] = deriveDecoder implicit val imageAssetDecoder: Decoder[contentatom.ImageAsset] = deriveDecoder implicit val imageAssetDimensionsDecoder: Decoder[contentatom.ImageAssetDimensions] = deriveDecoder implicit val mediaAssetDecoder: Decoder[media.Asset] = deriveDecoder @@ -239,6 +239,6 @@ object CirceDecoders { implicit val embedReachDecoder: Decoder[EmbedReach] = deriveDecoder implicit val linkElementFieldsDecoder: Decoder[LinkElementFields] = deriveDecoder implicit val statisticDecoder: Decoder[Statistic] = deriveDecoder - implicit val imageDecoder: Decoder[Image] = deriveDecoder + implicit val productImageDecoder: Decoder[ProductImage] = deriveDecoder implicit val productElementFieldsDecoder: Decoder[ProductElementFields] = deriveDecoder } diff --git a/json/src/main/scala/com/gu/contentapi/json/CirceEncoders.scala b/json/src/main/scala/com/gu/contentapi/json/CirceEncoders.scala index 72745fd..d81a0f7 100644 --- a/json/src/main/scala/com/gu/contentapi/json/CirceEncoders.scala +++ b/json/src/main/scala/com/gu/contentapi/json/CirceEncoders.scala @@ -110,7 +110,7 @@ object CirceEncoders { implicit val resultBucketsEncoder: Encoder[quiz.ResultBuckets] = deriveEncoder implicit val resultBucketEncoder: Encoder[quiz.ResultBucket] = deriveEncoder implicit val mediaAtomEncoder: Encoder[media.MediaAtom] = deriveEncoder - implicit val atomImageEncoder: Encoder[contentatom.Image] = deriveEncoder + implicit val imageEncoder: Encoder[contentatom.Image] = deriveEncoder implicit val imageAssetEncoder: Encoder[contentatom.ImageAsset] = deriveEncoder implicit val imageAssetDimensionsEncoder: Encoder[contentatom.ImageAssetDimensions] = deriveEncoder implicit val mediaAssetEncoder: Encoder[media.Asset] = deriveEncoder @@ -188,7 +188,7 @@ object CirceEncoders { implicit val embedReachEncoder: Encoder[EmbedReach] = deriveEncoder implicit val linkElementFieldsEncoder: Encoder[LinkElementFields] = deriveEncoder implicit val statisticEncoder: Encoder[Statistic] = deriveEncoder - implicit val imageEncoder: Encoder[Image] = deriveEncoder + implicit val productImageEncoder: Encoder[ProductImage] = deriveEncoder implicit val productElementFieldsEncoder: Encoder[ProductElementFields] = deriveEncoder def genDateTimeEncoder(truncate: Boolean = true): Encoder[CapiDateTime] = Encoder.instance[CapiDateTime] { capiDateTime => diff --git a/models/src/main/thrift/content/v1.thrift b/models/src/main/thrift/content/v1.thrift index 20f4b93..3bb7561 100644 --- a/models/src/main/thrift/content/v1.thrift +++ b/models/src/main/thrift/content/v1.thrift @@ -1017,14 +1017,14 @@ struct ProductElementFields { 14: optional list statistics; - 15: optional Image image; + 15: optional ProductImage image; 16: optional list content; 17: required ProductDisplayType displayType; } -struct Image { +struct ProductImage { 1: required list assets; 2: required ImageElementFields fields; From 83047398a8708a5ea968f1ee2c1f1d930acebcd2 Mon Sep 17 00:00:00 2001 From: ollie_abrahams Date: Fri, 3 Oct 2025 11:16:38 +0100 Subject: [PATCH 08/11] update Product Image --- models/src/main/thrift/content/v1.thrift | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/models/src/main/thrift/content/v1.thrift b/models/src/main/thrift/content/v1.thrift index 3bb7561..54c04f9 100644 --- a/models/src/main/thrift/content/v1.thrift +++ b/models/src/main/thrift/content/v1.thrift @@ -1025,9 +1025,29 @@ struct ProductElementFields { } struct ProductImage { - 1: required list assets; + /** Caption of the image */ + 1: optional string caption; - 2: required ImageElementFields fields; + /** Display credit for the image */ + 2: optional bool displayCredit; + + /** Source of the image */ + 3: optional string source; + + /** Caption of the image */ + 4: optional string photographer; + + /** Alt text of the image */ + 5: optional string alt; + + /** Media id of the image */ + 6: optional string mediaId; + + /** Media url for the image */ + 7: optional string file; + + /** Suppliers reference of the image */ + 8: optional string suppliersReference; } struct BlockElement { From 88693c5b99bf6aa4df04f58681de0dc5bf75121f Mon Sep 17 00:00:00 2001 From: Emma Imber Date: Tue, 7 Oct 2025 16:20:44 +0100 Subject: [PATCH 09/11] Align product image with flexible-model --- models/src/main/thrift/content/v1.thrift | 52 ++++++++++++------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/models/src/main/thrift/content/v1.thrift b/models/src/main/thrift/content/v1.thrift index 54c04f9..72e377a 100644 --- a/models/src/main/thrift/content/v1.thrift +++ b/models/src/main/thrift/content/v1.thrift @@ -988,6 +988,32 @@ struct Statistic { 2: optional string value, } +struct ProductImage { + /** Caption of the image */ + 1: optional string caption; + + /** Display credit for the image */ + 2: optional bool displayCredit; + + /** Source of the image */ + 3: optional string source; + + /** Caption of the image */ + 4: optional string photographer; + + /** Alt text of the image */ + 5: optional string alt; + + /** The id of the image in the media api */ + 6: optional string mediaId; + + /** The url of the image file */ + 7: optional string file; + + /** Suppliers reference of the image */ + 8: optional string suppliersReference; +} + struct ProductElementFields { 1: optional string productName; @@ -1024,32 +1050,6 @@ struct ProductElementFields { 17: required ProductDisplayType displayType; } -struct ProductImage { - /** Caption of the image */ - 1: optional string caption; - - /** Display credit for the image */ - 2: optional bool displayCredit; - - /** Source of the image */ - 3: optional string source; - - /** Caption of the image */ - 4: optional string photographer; - - /** Alt text of the image */ - 5: optional string alt; - - /** Media id of the image */ - 6: optional string mediaId; - - /** Media url for the image */ - 7: optional string file; - - /** Suppliers reference of the image */ - 8: optional string suppliersReference; -} - struct BlockElement { 1: required ElementType type From c1c37df63b17bb7c3501baebe63d9b68b11add62 Mon Sep 17 00:00:00 2001 From: Emma Imber Date: Wed, 15 Oct 2025 16:53:13 +0100 Subject: [PATCH 10/11] Update model to use array of product CTAs and add PRODUCT_CARD_ONLY display --- .../gu/contentapi/json/CirceDecoders.scala | 3 +- .../gu/contentapi/json/CirceEncoders.scala | 3 +- models/src/main/thrift/content/v1.thrift | 39 +++++++++---------- 3 files changed, 22 insertions(+), 23 deletions(-) diff --git a/json/src/main/scala/com/gu/contentapi/json/CirceDecoders.scala b/json/src/main/scala/com/gu/contentapi/json/CirceDecoders.scala index c8ed0a8..4c5bcf4 100644 --- a/json/src/main/scala/com/gu/contentapi/json/CirceDecoders.scala +++ b/json/src/main/scala/com/gu/contentapi/json/CirceDecoders.scala @@ -238,7 +238,8 @@ object CirceDecoders { implicit val pillarsResponseDecoder: Decoder[PillarsResponse] = deriveDecoder implicit val embedReachDecoder: Decoder[EmbedReach] = deriveDecoder implicit val linkElementFieldsDecoder: Decoder[LinkElementFields] = deriveDecoder - implicit val statisticDecoder: Decoder[Statistic] = deriveDecoder + implicit val productCustomAttributeDecoder: Decoder[ProductCustomAttribute] = deriveDecoder + implicit val productCtaDecoder: Decoder[ProductCTA] = deriveDecoder implicit val productImageDecoder: Decoder[ProductImage] = deriveDecoder implicit val productElementFieldsDecoder: Decoder[ProductElementFields] = deriveDecoder } diff --git a/json/src/main/scala/com/gu/contentapi/json/CirceEncoders.scala b/json/src/main/scala/com/gu/contentapi/json/CirceEncoders.scala index d81a0f7..d66319f 100644 --- a/json/src/main/scala/com/gu/contentapi/json/CirceEncoders.scala +++ b/json/src/main/scala/com/gu/contentapi/json/CirceEncoders.scala @@ -187,7 +187,8 @@ object CirceEncoders { implicit val pillarsResponseEncoder: Encoder[PillarsResponse] = deriveEncoder implicit val embedReachEncoder: Encoder[EmbedReach] = deriveEncoder implicit val linkElementFieldsEncoder: Encoder[LinkElementFields] = deriveEncoder - implicit val statisticEncoder: Encoder[Statistic] = deriveEncoder + implicit val productCustomAttributeEncoder: Encoder[ProductCustomAttribute] = deriveEncoder + implicit val productCtaEncoder: Encoder[ProductCTA] = deriveEncoder implicit val productImageEncoder: Encoder[ProductImage] = deriveEncoder implicit val productElementFieldsEncoder: Encoder[ProductElementFields] = deriveEncoder diff --git a/models/src/main/thrift/content/v1.thrift b/models/src/main/thrift/content/v1.thrift index 72e377a..94fbb7d 100644 --- a/models/src/main/thrift/content/v1.thrift +++ b/models/src/main/thrift/content/v1.thrift @@ -928,6 +928,7 @@ enum ListType { enum ProductDisplayType { INLINE_WITH_PRODUCT_CARD = 0, INLINE_ONLY = 1, + PRODUCT_CARD_ONLY = 2, } struct ListItem { @@ -982,7 +983,17 @@ struct TimelineElementFields { 1: required list sections; } -struct Statistic { +struct ProductCTA { + 1: optional string url; + + 2: optional string text; + + 3: optional string retailer; + + 4: optional string price; +} + +struct ProductCustomAttribute { 1: optional string name, 2: optional string value, @@ -1023,31 +1034,17 @@ struct ProductElementFields { 4: optional string secondaryHeading; - 5: optional string starRating; - - 6: optional string primaryProductUrl; - - 7: optional string primaryCta; - - 8: optional string primaryRetailer; - - 9: optional string primaryPrice; - - 10: optional string secondaryProductUrl; - - 11: optional string secondaryCta; - - 12: optional string secondaryRetailer; + 5: required ProductDisplayType displayType; - 13: optional string secondaryPrice; + 6: optional string starRating; - 14: optional list statistics; + 7: optional list productCtas; - 15: optional ProductImage image; + 8: optional list customAttributes; - 16: optional list content; + 9: optional ProductImage image; - 17: required ProductDisplayType displayType; + 10: optional list content; } struct BlockElement { From 19edb5e882ede0d67d7d85d609650b085d2964d7 Mon Sep 17 00:00:00 2001 From: ollie_abrahams Date: Fri, 17 Oct 2025 14:42:11 +0100 Subject: [PATCH 11/11] update Product Image --- models/src/main/thrift/content/v1.thrift | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/models/src/main/thrift/content/v1.thrift b/models/src/main/thrift/content/v1.thrift index 94fbb7d..7f24a53 100644 --- a/models/src/main/thrift/content/v1.thrift +++ b/models/src/main/thrift/content/v1.thrift @@ -1023,6 +1023,18 @@ struct ProductImage { /** Suppliers reference of the image */ 8: optional string suppliersReference; + + /** Type of the image */ + 9: optional string imageType; + + /** height for the image */ + 10: optional i32 height; + + /** width for the image */ + 11: optional i32 width; + + /** Credit for the image */ + 12: optional string credit; } struct ProductElementFields {