From 7c684d8e44ad72004fe20bc743484429cca39142 Mon Sep 17 00:00:00 2001 From: Jens Schulze Date: Thu, 3 Apr 2025 00:21:17 +0200 Subject: [PATCH] fix Delivery discriminators --- .../com/commercetools/api/json/ApiModule.java | 3 ++ .../subscription/DeliveryPayloadMixin.java | 16 +++++++ .../com/commercetools/MessagePayloadTest.java | 42 ++++++++++++++++++- 3 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/models/subscription/DeliveryPayloadMixin.java diff --git a/commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ApiModule.java b/commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ApiModule.java index 929707f3815..99b6cc17260 100644 --- a/commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ApiModule.java +++ b/commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/json/ApiModule.java @@ -6,6 +6,8 @@ import com.commercetools.api.models.product.AttributeImpl; import com.commercetools.api.models.product_search.ProductSearchFacetResult; +import com.commercetools.api.models.subscription.DeliveryPayload; +import com.commercetools.api.models.subscription.DeliveryPayloadMixin; import com.commercetools.api.models.type.FieldContainerImpl; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.module.SimpleModule; @@ -63,5 +65,6 @@ public ApiModule(ModuleOptions options) { addDeserializer(FieldContainerImpl.class, new CustomFieldDeserializer(customFieldAsDateString, customFieldNumberAsDouble, customFieldTypes)); } + setMixInAnnotation(DeliveryPayload.class, DeliveryPayloadMixin.class); } } diff --git a/commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/models/subscription/DeliveryPayloadMixin.java b/commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/models/subscription/DeliveryPayloadMixin.java new file mode 100644 index 00000000000..dfc40ea8f8d --- /dev/null +++ b/commercetools/commercetools-sdk-java-api/src/main/java/com/commercetools/api/models/subscription/DeliveryPayloadMixin.java @@ -0,0 +1,16 @@ + +package com.commercetools.api.models.subscription; + +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.databind.annotation.JsonDeserialize; + +@JsonSubTypes({ + @JsonSubTypes.Type(value = com.commercetools.api.models.subscription.MessageDeliveryPayloadImpl.class, name = MessageDeliveryPayload.MESSAGE), + @JsonSubTypes.Type(value = com.commercetools.api.models.subscription.ResourceCreatedDeliveryPayloadImpl.class, name = ResourceCreatedDeliveryPayload.RESOURCE_CREATED), + @JsonSubTypes.Type(value = com.commercetools.api.models.subscription.ResourceDeletedDeliveryPayloadImpl.class, name = ResourceDeletedDeliveryPayload.RESOURCE_DELETED), + @JsonSubTypes.Type(value = com.commercetools.api.models.subscription.ResourceUpdatedDeliveryPayloadImpl.class, name = ResourceUpdatedDeliveryPayload.RESOURCE_UPDATED) }) +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.EXISTING_PROPERTY, property = "notificationType", defaultImpl = DeliveryPayloadImpl.class, visible = true) +@JsonDeserialize(as = DeliveryPayloadImpl.class) +public class DeliveryPayloadMixin { +} diff --git a/commercetools/commercetools-sdk-java-api/src/test/java/com/commercetools/MessagePayloadTest.java b/commercetools/commercetools-sdk-java-api/src/test/java/com/commercetools/MessagePayloadTest.java index 2e329ac3791..08e6328baf3 100644 --- a/commercetools/commercetools-sdk-java-api/src/test/java/com/commercetools/MessagePayloadTest.java +++ b/commercetools/commercetools-sdk-java-api/src/test/java/com/commercetools/MessagePayloadTest.java @@ -9,8 +9,7 @@ import com.commercetools.api.models.message.CustomerLastNameSetMessagePayload; import com.commercetools.api.models.message.MessagePayload; import com.commercetools.api.models.message.OrderCreatedMessagePayload; -import com.commercetools.api.models.subscription.DeliveryPayload; -import com.commercetools.api.models.subscription.MessageDeliveryPayload; +import com.commercetools.api.models.subscription.*; import io.vrap.rmf.base.client.utils.json.JsonUtils; @@ -19,6 +18,45 @@ public class MessagePayloadTest { + @Test + public void delivery() { + String messagePayload = "{\n" + " \"notificationType\":\"Message\",\n" + + " \"projectKey\":\"\",\n" + " \"id\":\"\",\n" + " \"version\":1,\n" + + " \"sequenceNumber\":2,\n" + " \"resource\":{\n" + " \"typeId\":\"customer\",\n" + + " \"id\":\"\"\n" + " },\n" + " \"resourceVersion\":2,\n" + + " \"resourceUserProvidedIdentifiers\":{},\n" + " \"type\":\"CustomerLastNameSet\",\n" + + " \"lastName\":\"Doe\",\n" + " \"createdAt\":\"2022-10-25T13:30:09.760Z\",\n" + + " \"lastModifiedAt\":\"2022-10-25T13:30:09.760Z\"\n" + "}"; + SubscriptionNotification deserializedObject = JsonUtils.fromJsonString(messagePayload, + SubscriptionNotification.class); + Assertions.assertThat(deserializedObject).isInstanceOf(MessageDeliveryPayload.class); + + deserializedObject = JsonUtils.fromJsonString(messagePayload, DeliveryPayload.class); + Assertions.assertThat(deserializedObject).isInstanceOf(MessageDeliveryPayload.class); + + String eventPayload = "{\n" + " \"id\": \"3b364ca2-cbe5-42b4-a85a-37d4e57d659e\",\n" + + " \"notificationType\": \"Event\",\n" + " \"type\": \"ImportContainerCreated\",\n" + + " \"resourceType\": \"import-api\",\n" + " \"data\": {\n" + " \"version\": 1,\n" + + " \"key\": \"my-import-container\",\n" + " \"createdAt\": \"2025-03-26T17:28:20.376Z\",\n" + + " \"lastModifiedAt\": \"2025-03-26T17:28:20.376Z\"\n" + " },\n" + + " \"createdAt\": \"2025-03-26T17:28:20.397Z\"\n" + "}\n"; + deserializedObject = JsonUtils.fromJsonString(eventPayload, SubscriptionNotification.class); + Assertions.assertThat(deserializedObject).isInstanceOf(EventDeliveryPayload.class); + + String changePayload = "{\n" + " \"notificationType\":\"ResourceCreated\",\n" + + " \"projectKey\":\"\",\n" + " \"resource\":{\n" + " \"typeId\":\"product\",\n" + + " \"id\":\"\"\n" + " },\n" + " \"resourceUserProvidedIdentifiers\":{\n" + + " \"key\":\"example-product-key\",\n" + " \"slug\":{\n" + " \"en\":\"example-slug\"\n" + + " }\n" + " },\n" + " \"version\":1,\n" + " \"modifiedAt\":\"2022-10-25T13:23:05.384Z\"\n" + + "}\n"; + deserializedObject = JsonUtils.fromJsonString(changePayload, SubscriptionNotification.class); + Assertions.assertThat(deserializedObject).isInstanceOf(ResourceCreatedDeliveryPayload.class); + + deserializedObject = JsonUtils.fromJsonString(changePayload, DeliveryPayload.class); + Assertions.assertThat(deserializedObject).isInstanceOf(ResourceCreatedDeliveryPayload.class); + + } + @Test public void deserializeOrderCreatedMessageFromString() throws IOException { String payload = "{\"type\": \"OrderCreated\", \"order\": {}}";