From 7ac54d7e3b0af627833fadf16bdc2dc1c57191ee Mon Sep 17 00:00:00 2001 From: Jean-Pierre Portier Date: Thu, 21 Nov 2024 16:05:29 +0100 Subject: [PATCH 01/10] feat (Core): Form parameters serialization --- .../adapters/DeliveryTimeFormSerializer.java | 11 + .../sdk/core/databind/FormSerializer.java | 6 + .../databind/annotation/FormSerialize.java | 16 ++ .../databind/annotation/PropertiesOrder.java | 14 + .../core/databind/annotation/Property.java | 14 + .../databind/annotation/SinchAnnotation.java | 10 + .../core/databind/multipart/ObjectMapper.java | 127 +++++++++ .../exceptions/SerializationException.java | 33 +++ .../sinch/sdk/core/http/HttpContentType.java | 6 +- .../com/sinch/sdk/core/http/HttpMapper.java | 24 +- .../core/utils/databind/MultiPartMapper.java | 17 ++ .../utils/databind/RFC822FormSerializer.java | 14 + .../databind/multipart/ObjectMapperTest.java | 260 ++++++++++++++++++ .../emails/request/SendEmailRequestTest.java | 127 +++++++++ .../mailgun/v1/emails/request/attachment1.txt | 2 + .../mailgun/v1/emails/request/attachment2.txt | 3 + pom.xml | 2 +- 17 files changed, 682 insertions(+), 4 deletions(-) create mode 100644 client/src/main/com/sinch/sdk/domains/mailgun/api/v1/adapters/DeliveryTimeFormSerializer.java create mode 100644 core/src/main/com/sinch/sdk/core/databind/FormSerializer.java create mode 100644 core/src/main/com/sinch/sdk/core/databind/annotation/FormSerialize.java create mode 100644 core/src/main/com/sinch/sdk/core/databind/annotation/PropertiesOrder.java create mode 100644 core/src/main/com/sinch/sdk/core/databind/annotation/Property.java create mode 100644 core/src/main/com/sinch/sdk/core/databind/annotation/SinchAnnotation.java create mode 100644 core/src/main/com/sinch/sdk/core/databind/multipart/ObjectMapper.java create mode 100644 core/src/main/com/sinch/sdk/core/exceptions/SerializationException.java create mode 100644 core/src/main/com/sinch/sdk/core/utils/databind/MultiPartMapper.java create mode 100644 core/src/main/com/sinch/sdk/core/utils/databind/RFC822FormSerializer.java create mode 100644 core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java create mode 100644 openapi-contracts/src/test/java/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequestTest.java create mode 100644 openapi-contracts/src/test/resources/domains/mailgun/v1/emails/request/attachment1.txt create mode 100644 openapi-contracts/src/test/resources/domains/mailgun/v1/emails/request/attachment2.txt diff --git a/client/src/main/com/sinch/sdk/domains/mailgun/api/v1/adapters/DeliveryTimeFormSerializer.java b/client/src/main/com/sinch/sdk/domains/mailgun/api/v1/adapters/DeliveryTimeFormSerializer.java new file mode 100644 index 000000000..c68d4d28a --- /dev/null +++ b/client/src/main/com/sinch/sdk/domains/mailgun/api/v1/adapters/DeliveryTimeFormSerializer.java @@ -0,0 +1,11 @@ +package com.sinch.sdk.domains.mailgun.api.v1.adapters; + +import com.sinch.sdk.core.databind.FormSerializer; + +public class DeliveryTimeFormSerializer extends FormSerializer { + + @Override + public String serialize(Integer in) { + return String.format("%dh", in); + } +} diff --git a/core/src/main/com/sinch/sdk/core/databind/FormSerializer.java b/core/src/main/com/sinch/sdk/core/databind/FormSerializer.java new file mode 100644 index 000000000..397eba1d0 --- /dev/null +++ b/core/src/main/com/sinch/sdk/core/databind/FormSerializer.java @@ -0,0 +1,6 @@ +package com.sinch.sdk.core.databind; + +public abstract class FormSerializer { + + public abstract Object serialize(T in); +} diff --git a/core/src/main/com/sinch/sdk/core/databind/annotation/FormSerialize.java b/core/src/main/com/sinch/sdk/core/databind/annotation/FormSerialize.java new file mode 100644 index 000000000..da944f481 --- /dev/null +++ b/core/src/main/com/sinch/sdk/core/databind/annotation/FormSerialize.java @@ -0,0 +1,16 @@ +package com.sinch.sdk.core.databind.annotation; + +import com.sinch.sdk.core.databind.FormSerializer; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@SinchAnnotation +public @interface FormSerialize { + + @SuppressWarnings("rawtypes") // to work around JDK8 bug wrt Class-valued annotation properties + Class using(); +} diff --git a/core/src/main/com/sinch/sdk/core/databind/annotation/PropertiesOrder.java b/core/src/main/com/sinch/sdk/core/databind/annotation/PropertiesOrder.java new file mode 100644 index 000000000..9fedef100 --- /dev/null +++ b/core/src/main/com/sinch/sdk/core/databind/annotation/PropertiesOrder.java @@ -0,0 +1,14 @@ +package com.sinch.sdk.core.databind.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@SinchAnnotation +public @interface PropertiesOrder { + + String[] value() default {}; +} diff --git a/core/src/main/com/sinch/sdk/core/databind/annotation/Property.java b/core/src/main/com/sinch/sdk/core/databind/annotation/Property.java new file mode 100644 index 000000000..17cbcd512 --- /dev/null +++ b/core/src/main/com/sinch/sdk/core/databind/annotation/Property.java @@ -0,0 +1,14 @@ +package com.sinch.sdk.core.databind.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +@SinchAnnotation +public @interface Property { + + String value() default ""; +} diff --git a/core/src/main/com/sinch/sdk/core/databind/annotation/SinchAnnotation.java b/core/src/main/com/sinch/sdk/core/databind/annotation/SinchAnnotation.java new file mode 100644 index 000000000..19e91cc55 --- /dev/null +++ b/core/src/main/com/sinch/sdk/core/databind/annotation/SinchAnnotation.java @@ -0,0 +1,10 @@ +package com.sinch.sdk.core.databind.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER}) +@Retention(RetentionPolicy.RUNTIME) +public @interface SinchAnnotation {} diff --git a/core/src/main/com/sinch/sdk/core/databind/multipart/ObjectMapper.java b/core/src/main/com/sinch/sdk/core/databind/multipart/ObjectMapper.java new file mode 100644 index 000000000..b199fbd9a --- /dev/null +++ b/core/src/main/com/sinch/sdk/core/databind/multipart/ObjectMapper.java @@ -0,0 +1,127 @@ +package com.sinch.sdk.core.databind.multipart; + +import com.sinch.sdk.core.databind.FormSerializer; +import com.sinch.sdk.core.databind.annotation.FormSerialize; +import com.sinch.sdk.core.databind.annotation.PropertiesOrder; +import com.sinch.sdk.core.databind.annotation.Property; +import com.sinch.sdk.core.exceptions.SerializationException; +import com.sinch.sdk.core.models.OptionalValue; +import com.sinch.sdk.core.utils.EnumDynamic; +import com.sinch.sdk.core.utils.Pair; +import java.beans.BeanInfo; +import java.beans.IntrospectionException; +import java.beans.Introspector; +import java.beans.MethodDescriptor; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class ObjectMapper { + + public Map serialize(Object value) + throws IntrospectionException, + InvocationTargetException, + IllegalAccessException, + ClassNotFoundException, + NoSuchMethodException, + InstantiationException { + + BeanInfo beanInfo = Introspector.getBeanInfo(value.getClass(), Object.class); + List> serializableProperties = collectSerializableProperties(beanInfo); + return serializeProperties(serializableProperties, value); + } + + private List> collectSerializableProperties(BeanInfo beanInfo) { + + ArrayList> result = new ArrayList<>(); + final MethodDescriptor[] methodDescriptors = beanInfo.getMethodDescriptors(); + + for (MethodDescriptor methodDescriptor : methodDescriptors) { + getPropertyGetter(methodDescriptor.getMethod()).ifPresent(result::add); + } + return sortProperties(beanInfo, result); + } + + private List> sortProperties( + BeanInfo beanInfo, List> properties) { + + PropertiesOrder propertyOrder = + beanInfo.getBeanDescriptor().getBeanClass().getAnnotation(PropertiesOrder.class); + + if (null == propertyOrder) { + return properties; + } + + ArrayList> sorted = new ArrayList<>(properties.size()); + + for (String property : propertyOrder.value()) { + properties.stream() + .filter(p -> p.getLeft().equals(property)) + .findFirst() + .ifPresent(sorted::add); + } + return sorted; + } + + private Optional> getPropertyGetter(Method method) { + + Property property = method.getDeclaredAnnotation(Property.class); + if (null == property) { + return Optional.empty(); + } + return Optional.of(new Pair<>(property.value(), method)); + } + + private Map serializeProperties( + List> serializableProperties, Object object) + throws InvocationTargetException, IllegalAccessException { + Map properties = new LinkedHashMap<>(); + for (Pair property : serializableProperties) { + + serializeProperty(object, property.getRight()) + .ifPresent(v -> properties.put(property.getLeft(), v)); + } + return properties; + } + + private OptionalValue serializeProperty(Object object, Method method) + throws InvocationTargetException, IllegalAccessException { + + OptionalValue propertyValue = (OptionalValue) method.invoke(object); + + if (!propertyValue.isPresent() || null == propertyValue.get()) { + return propertyValue; + } + + Object value = propertyValue.get(); + + FormSerialize formSerialize = method.getDeclaredAnnotation(FormSerialize.class); + if (null != formSerialize) { + value = handleOverriddenSerialization(formSerialize, value); + } + + if (value instanceof EnumDynamic) { + EnumDynamic enumDynamic = (EnumDynamic) value; + return OptionalValue.of((enumDynamic.value().toString())); + } + return OptionalValue.of(value); + } + + private Object handleOverriddenSerialization(FormSerialize formSerialize, Object value) { + try { + Class clazz = Class.forName(formSerialize.using().getName()); + @SuppressWarnings("unchecked") + Constructor> ctor = + (Constructor>) clazz.getConstructor(); + FormSerializer serializer = ctor.newInstance(); + return serializer.serialize(value); + } catch (Exception e) { + throw new SerializationException(e); + } + } +} diff --git a/core/src/main/com/sinch/sdk/core/exceptions/SerializationException.java b/core/src/main/com/sinch/sdk/core/exceptions/SerializationException.java new file mode 100644 index 000000000..1e34abaa0 --- /dev/null +++ b/core/src/main/com/sinch/sdk/core/exceptions/SerializationException.java @@ -0,0 +1,33 @@ +package com.sinch.sdk.core.exceptions; + +/** + * Exception related to serialization + * + * @since __TO_BE_DEFINED__ + */ +public class SerializationException extends RuntimeException { + + private static final long serialVersionUID = -1L; + + /** + * Constructs a new exception with the specified cause and a detail message of (cause==null ? null + * : cause.toString()) (which typically contains the class and detail message of cause). This + * constructor is useful for exceptions that are little more than wrappers for other throwables + * + * @param throwable Cause + * @since __TO_BE_DEFINED__ + */ + public SerializationException(Throwable throwable) { + super(null, throwable); + } + + /** + * Constructs an SerializationException with the specified detail message. + * + * @param message the detail message. + * @since __TO_BE_DEFINED__ + */ + public SerializationException(String message) { + super(message, null); + } +} diff --git a/core/src/main/com/sinch/sdk/core/http/HttpContentType.java b/core/src/main/com/sinch/sdk/core/http/HttpContentType.java index 70ac59401..879da3f88 100644 --- a/core/src/main/com/sinch/sdk/core/http/HttpContentType.java +++ b/core/src/main/com/sinch/sdk/core/http/HttpContentType.java @@ -11,7 +11,7 @@ public class HttpContentType { public static final String CONTENT_TYPE_HEADER = "content-type"; public static final String APPLICATION_JSON = "application/json"; public static final String TEXT_PLAIN = "text/plain"; - + public static final String MULTIPART_FORM_DATA = "multipart/form-data"; static Pattern charsetPattern = Pattern.compile("(.*;$)?\\s*?charset=\\s*([^;\\s]+)"); public static boolean isMimeJson(Collection mimes) { @@ -24,6 +24,10 @@ public static boolean isMimeTextPlain(Collection mimes) { return mimes.stream().anyMatch(TEXT_PLAIN::equalsIgnoreCase); } + public static boolean isMimeMultiPartFormData(Collection mimes) { + return null != mimes && mimes.stream().anyMatch(MULTIPART_FORM_DATA::equalsIgnoreCase); + } + public static Optional getCharsetValue(String contentTypeHeader) { if (StringUtil.isEmpty(contentTypeHeader)) { return Optional.empty(); diff --git a/core/src/main/com/sinch/sdk/core/http/HttpMapper.java b/core/src/main/com/sinch/sdk/core/http/HttpMapper.java index 4fa8da25e..31019dfa2 100644 --- a/core/src/main/com/sinch/sdk/core/http/HttpMapper.java +++ b/core/src/main/com/sinch/sdk/core/http/HttpMapper.java @@ -6,9 +6,11 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.sinch.sdk.core.exceptions.ApiException; import com.sinch.sdk.core.utils.databind.Mapper; +import com.sinch.sdk.core.utils.databind.MultiPartMapper; import java.io.IOException; import java.io.InputStream; import java.util.Collection; +import java.util.Map; public class HttpMapper { @@ -52,6 +54,7 @@ public String serialize(Collection contentTypes, Object body) { if (null == body) { return null; } + if (null == contentTypes || contentTypes.isEmpty() || isMimeJson(contentTypes)) { try { return Mapper.getInstance().writeValueAsString(body); @@ -59,7 +62,24 @@ public String serialize(Collection contentTypes, Object body) { throw new ApiException(e); } } - throw new ApiException( - "Deserialization for content type '" + contentTypes + "' not supported "); + + throw new ApiException("Serialization for content type '" + contentTypes + "' not supported "); + } + + public Map serializeFormParameters( + Collection contentTypes, Object parameters) { + if (null == parameters) { + return null; + } + + if (isMimeMultiPartFormData(contentTypes)) { + try { + return MultiPartMapper.getInstance().serialize(parameters); + } catch (Exception e) { + throw new ApiException(e); + } + } + + throw new ApiException("Serialization for content type '" + contentTypes + "' not supported "); } } diff --git a/core/src/main/com/sinch/sdk/core/utils/databind/MultiPartMapper.java b/core/src/main/com/sinch/sdk/core/utils/databind/MultiPartMapper.java new file mode 100644 index 000000000..0ec4fceca --- /dev/null +++ b/core/src/main/com/sinch/sdk/core/utils/databind/MultiPartMapper.java @@ -0,0 +1,17 @@ +package com.sinch.sdk.core.utils.databind; + +import com.sinch.sdk.core.databind.multipart.ObjectMapper; + +public class MultiPartMapper { + + public static ObjectMapper getInstance() { + return LazyHolder.INSTANCE; + } + + private MultiPartMapper() {} + + private static class LazyHolder { + + public static final ObjectMapper INSTANCE = new ObjectMapper(); + } +} diff --git a/core/src/main/com/sinch/sdk/core/utils/databind/RFC822FormSerializer.java b/core/src/main/com/sinch/sdk/core/utils/databind/RFC822FormSerializer.java new file mode 100644 index 000000000..d6ba53853 --- /dev/null +++ b/core/src/main/com/sinch/sdk/core/utils/databind/RFC822FormSerializer.java @@ -0,0 +1,14 @@ +package com.sinch.sdk.core.utils.databind; + +import com.sinch.sdk.core.databind.FormSerializer; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; + +public class RFC822FormSerializer extends FormSerializer { + + @Override + public String serialize(Instant in) { + return DateTimeFormatter.RFC_1123_DATE_TIME.format(in.atZone(ZoneId.of("UTC"))); + } +} diff --git a/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java b/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java new file mode 100644 index 000000000..27c80882e --- /dev/null +++ b/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java @@ -0,0 +1,260 @@ +package com.sinch.sdk.core.databind.multipart; + +import com.sinch.sdk.core.TestHelpers; +import com.sinch.sdk.core.databind.FormSerializer; +import com.sinch.sdk.core.databind.annotation.FormSerialize; +import com.sinch.sdk.core.databind.annotation.PropertiesOrder; +import com.sinch.sdk.core.databind.annotation.Property; +import com.sinch.sdk.core.databind.multipart.ObjectMapperTest.SerializableObject.AnEnum; +import com.sinch.sdk.core.models.OptionalValue; +import com.sinch.sdk.core.utils.EnumDynamic; +import com.sinch.sdk.core.utils.EnumSupportDynamic; +import com.sinch.sdk.core.utils.databind.RFC822FormSerializer; +import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendEmailRequestTest; +import java.io.File; +import java.time.Instant; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.Stream; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +class ObjectMapperTest { + + static File fileAttachment1; + static File fileAttachment2; + + static Map serialized; + + static { + ClassLoader classLoader = SendEmailRequestTest.class.getClassLoader(); + fileAttachment1 = + new File( + classLoader.getResource("domains/mailgun/v1/emails/request/attachment1.txt").getFile()); + fileAttachment2 = + new File( + classLoader.getResource("domains/mailgun/v1/emails/request/attachment2.txt").getFile()); + + SerializableObject object = + new SerializableObject( + OptionalValue.of("text value"), + OptionalValue.of(AnEnum.from("a dyn value")), + OptionalValue.of(fileAttachment1), + OptionalValue.of(Instant.parse("2024-11-25T09:06:54Z")), + OptionalValue.of(Arrays.asList("text 1", "text2")), + OptionalValue.of(Arrays.asList(AnEnum.from("a dyn value"), AnEnum.YES)), + OptionalValue.of(Arrays.asList(fileAttachment1, fileAttachment2)), + OptionalValue.of( + Arrays.asList( + Instant.parse("2024-11-25T10:06:54Z"), Instant.parse("2024-11-25T09:06:54Z")))); + + try { + serialized = new ObjectMapper().serialize(object); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + @Test + void countValue() { + Assertions.assertEquals(8, serialized.size()); + } + + @Test + void order() { + + String[] expectedOrder = { + SerializableObject.PROPERTY_RFC822_COLLECTION, + SerializableObject.PROPERTY_TEXT, + SerializableObject.PROPERTY_FILE_COLLECTION, + SerializableObject.PROPERTY_RFC822, + SerializableObject.PROPERTY_FILE, + SerializableObject.PROPERTY_ENUM, + SerializableObject.PROPERTY_ENUM_COLLECTION, + SerializableObject.PROPERTY_TEXT_COLLECTION + }; + String[] keys = serialized.keySet().toArray(new String[0]); + TestHelpers.recursiveEquals(expectedOrder, keys); + } + + @Test + void textValue() { + TestHelpers.recursiveEquals("text value", serialized.get("aText")); + } + + @Test + void enumValue() { + TestHelpers.recursiveEquals("a dyn value", serialized.get("anEnum")); + } + + @Test + void fileValue() { + TestHelpers.recursiveEquals(fileAttachment1, serialized.get("aFile")); + } + + @Test + void rfc822Value() { + TestHelpers.recursiveEquals("Mon, 25 Nov 2024 09:06:54 GMT", serialized.get("aRfc822")); + } + + @Test + void textCollectionValue() { + TestHelpers.recursiveEquals( + Arrays.asList("text 1", "text2"), serialized.get("aTextCollection")); + } + + @Test + void enumCollectionValue() { + TestHelpers.recursiveEquals( + Arrays.asList(AnEnum.from("a dyn value"), AnEnum.YES), serialized.get("anEnumCollection")); + } + + @Test + void fileCollectionValue() { + TestHelpers.recursiveEquals( + Arrays.asList(fileAttachment1, fileAttachment2), serialized.get("aFileCollection")); + } + + @Test + void rfc822CollectionValue() { + TestHelpers.recursiveEquals( + new ArrayList<>( + Arrays.asList("Mon, 25 Nov 2024 10:06:54 GMT", "Mon, 25 Nov 2024 09:06:54 GMT")), + serialized.get("aRfc822Collection")); + } + + @PropertiesOrder({ + SerializableObject.PROPERTY_RFC822_COLLECTION, + SerializableObject.PROPERTY_TEXT, + SerializableObject.PROPERTY_FILE_COLLECTION, + SerializableObject.PROPERTY_RFC822, + SerializableObject.PROPERTY_FILE, + SerializableObject.PROPERTY_ENUM, + SerializableObject.PROPERTY_ENUM_COLLECTION, + SerializableObject.PROPERTY_RFC822_COLLECTION, + SerializableObject.PROPERTY_TEXT_COLLECTION + }) + static class SerializableObject { + public static final String PROPERTY_TEXT = "aText"; + public static final String PROPERTY_ENUM = "anEnum"; + public static final String PROPERTY_FILE = "aFile"; + public static final String PROPERTY_RFC822 = "aRfc822"; + + public static final String PROPERTY_TEXT_COLLECTION = "aTextCollection"; + public static final String PROPERTY_ENUM_COLLECTION = "anEnumCollection"; + public static final String PROPERTY_FILE_COLLECTION = "aFileCollection"; + public static final String PROPERTY_RFC822_COLLECTION = "aRfc822Collection"; + + private final OptionalValue text; + private final OptionalValue _enum; + private final OptionalValue file; + private final OptionalValue instant; + + private final OptionalValue> textCollection; + private final OptionalValue> enumCollection; + private final OptionalValue> fileCollection; + private final OptionalValue> instantCollection; + + public SerializableObject( + OptionalValue text, + OptionalValue _enum, + OptionalValue file, + OptionalValue instant, + OptionalValue> textCollection, + OptionalValue> enumCollection, + OptionalValue> fileCollection, + OptionalValue> instantCollection) { + this.text = text; + this._enum = _enum; + this.file = file; + this.instant = instant; + this.instantCollection = instantCollection; + this.textCollection = textCollection; + this.enumCollection = enumCollection; + this.fileCollection = fileCollection; + } + + @Property(PROPERTY_TEXT) + public OptionalValue text() { + return text; + } + + @Property(PROPERTY_ENUM) + public OptionalValue _enum() { + return _enum; + } + + @Property(PROPERTY_FILE) + public OptionalValue file() { + return file; + } + + @Property(PROPERTY_RFC822) + @FormSerialize(using = RFC822FormSerializer.class) + public OptionalValue instant() { + return instant; + } + + @Property(PROPERTY_TEXT_COLLECTION) + public OptionalValue> textCollection() { + return textCollection; + } + + @Property(PROPERTY_ENUM_COLLECTION) + public OptionalValue> enumCollection() { + return enumCollection; + } + + @Property(PROPERTY_FILE_COLLECTION) + public OptionalValue> fileCollection() { + return fileCollection; + } + + @Property(PROPERTY_RFC822_COLLECTION) + @FormSerialize(using = RFC822ListFormSerializer.class) + public OptionalValue> instantCollection() { + return instantCollection; + } + + public static class AnEnum extends EnumDynamic { + public static final AnEnum YES = new AnEnum("yes"); + public static final AnEnum NO = new AnEnum("no"); + + private static final EnumSupportDynamic ENUM_SUPPORT = + new EnumSupportDynamic<>(AnEnum.class, AnEnum::new, Arrays.asList(YES, NO)); + + private AnEnum(String value) { + super(value); + } + + public static Stream values() { + return ENUM_SUPPORT.values(); + } + + public static AnEnum from(String value) { + return ENUM_SUPPORT.from(value); + } + + public static String valueOf(AnEnum e) { + return ENUM_SUPPORT.valueOf(e); + } + } + } + + public static class RFC822ListFormSerializer extends FormSerializer> { + + @Override + public Collection serialize(Collection in) { + return in.stream() + .map( + instant -> + DateTimeFormatter.RFC_1123_DATE_TIME.format(instant.atZone(ZoneId.of("UTC")))) + .collect(Collectors.toList()); + } + } +} diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequestTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequestTest.java new file mode 100644 index 000000000..f5d52dd23 --- /dev/null +++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequestTest.java @@ -0,0 +1,127 @@ +package com.sinch.sdk.domains.mailgun.models.v1.emails.request; + +import com.adelean.inject.resources.junit.jupiter.TestWithResources; +import com.sinch.sdk.BaseTest; +import com.sinch.sdk.core.TestHelpers; +import com.sinch.sdk.core.http.HttpMapper; +import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendEmailRequest.DkimSignatureEnum; +import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendEmailRequest.RequireTlsEnum; +import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendEmailRequest.SkipVerificationEnum; +import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendEmailRequest.TemplateTextEnum; +import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendEmailRequest.TestModeEnum; +import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendEmailRequest.TrackingClicksEnum; +import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendEmailRequest.TrackingEnum; +import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendEmailRequest.TrackingOpensEnum; +import java.io.File; +import java.time.Instant; +import java.util.Arrays; +import java.util.LinkedHashMap; +import java.util.Map; +import org.junit.jupiter.api.Test; + +@TestWithResources +public class SendEmailRequestTest extends BaseTest { + + static Map expected; + static File fileAttachment1; + static File fileAttachment2; + + static { + ClassLoader classLoader = SendEmailRequestTest.class.getClassLoader(); + fileAttachment1 = + new File( + classLoader.getResource("domains/mailgun/v1/emails/request/attachment1.txt").getFile()); + fileAttachment2 = + new File( + classLoader.getResource("domains/mailgun/v1/emails/request/attachment2.txt").getFile()); + + expected = + fillMap( + // spotless:off + "from", "User ", + "to", Arrays.asList("aRecipient@mailgun-by-sinch.com"), + "cc",Arrays.asList("cc-dest@sinch.com"), + "bcc",Arrays.asList("bcc-dest@sinch.com"), + "subject", "\uD83D\uDCE7 From Sinch SDK Java", + "text", "Sent from Sinch SDK Java with 📧", + "html", "📧 HTML sent with Sinch SDK Java", + "amp-html", "amp html value", + "attachment", Arrays.asList(fileAttachment1, fileAttachment2), + "inline",Arrays.asList( fileAttachment2), + "template","template value", + "t:version","2", + "t:text","yes", + "t:variables","{\"key\": \"value\"}", + "o:tag", Arrays.asList("tag1", "tag2"), + "o:dkim","true", + "o:secondary-dkim","example.com/s1", + "o:secondary-dkim-public","public.example.com/s1", + "o:deliverytime", "Sat, 22 Jan 2000 11:23:45 GMT", + "o:deliverytime-optimize-period", "29h", + "o:time-zone-localize","02:04PM", + "o:testmode", "no", + "o:tracking","htmlonly", + "o:tracking-clicks","true", + "o:tracking-opens","false", + "o:require-tls","true", + "o:skip-verification","no", + "o:sending-ip","192.168.0.10", + "o:sending-ip-pool","sending pool ID", + "o:tracking-pixel-location-top","foo", + "recipient-variables","{\"cc-dest@sinch.com\": {\"variable1\": \"value1\"}}" + // spotless:on + ); + } + + public static SendEmailRequest sendEmailRequest = + SendEmailRequest.builder() + .setInline(Arrays.asList(fileAttachment2)) + .setAttachment(Arrays.asList(fileAttachment1, fileAttachment2)) + .setTag(Arrays.asList("tag1", "tag2")) + .setDeliveryTime(Instant.parse("2000-01-22T11:23:45Z")) + .setTestMode(TestModeEnum.from("no")) + .setTo(Arrays.asList("aRecipient@mailgun-by-sinch.com")) + .setFrom("User ") + .setText("Sent from Sinch SDK Java with 📧") + .setTemplateText(TemplateTextEnum.YES) + .setHtml("📧 HTML sent with Sinch SDK Java") + .setSubject("📧 From Sinch SDK Java") + .setCc(Arrays.asList("cc-dest@sinch.com")) + .setBcc(Arrays.asList("bcc-dest@sinch.com")) + .setAmpHtml("amp html value") + .setTemplateVersion("2") + .setTemplateVariables("{\"key\": \"value\"}") + .setEnableDkimSignature(DkimSignatureEnum.TRUE) + .setSecondaryDkim("example.com/s1") + .setSecondaryDkimPublic("public.example.com/s1") + .setDeliveryTimeOptimizePeriod(29) + .setTimezoneLocalize("02:04PM") + .setTracking(TrackingEnum.HTMLONLY) + .setTrackingClicks(TrackingClicksEnum.TRUE) + .setTrackingOpens(TrackingOpensEnum.FALSE) + .setRequireTls(RequireTlsEnum.TRUE) + .setSkipVerification(SkipVerificationEnum.NO) + .setSendingIp("192.168.0.10") + .setSendingIpPool("sending pool ID") + .setTrackingPixelLocationTop("foo") + .setRecipientVariables("{\"cc-dest@sinch.com\": {\"variable1\": \"value1\"}}") + .setTemplate("template value") + .build(); + + @Test + void serialize() { + Object serialized = + new HttpMapper() + .serializeFormParameters(Arrays.asList("multipart/form-data"), sendEmailRequest); + + TestHelpers.recursiveEquals(expected, serialized); + } + + private static Map fillMap(Object... pairs) { + LinkedHashMap map = new LinkedHashMap<>(); + for (int i = 0; i < pairs.length; ) { + map.put(pairs[i++], pairs[i++]); + } + return map; + } +} diff --git a/openapi-contracts/src/test/resources/domains/mailgun/v1/emails/request/attachment1.txt b/openapi-contracts/src/test/resources/domains/mailgun/v1/emails/request/attachment1.txt new file mode 100644 index 000000000..6624e0106 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/mailgun/v1/emails/request/attachment1.txt @@ -0,0 +1,2 @@ +📧 file content +second line \ No newline at end of file diff --git a/openapi-contracts/src/test/resources/domains/mailgun/v1/emails/request/attachment2.txt b/openapi-contracts/src/test/resources/domains/mailgun/v1/emails/request/attachment2.txt new file mode 100644 index 000000000..272767838 --- /dev/null +++ b/openapi-contracts/src/test/resources/domains/mailgun/v1/emails/request/attachment2.txt @@ -0,0 +1,3 @@ +📧 file content 2 +second line +3rd line diff --git a/pom.xml b/pom.xml index f7a9ee392..7132a23a8 100644 --- a/pom.xml +++ b/pom.xml @@ -370,7 +370,7 @@ **/*.java - + 1.22.0 From 7b57bcb1010a090a0784fd09bd7e853595edd9b7 Mon Sep 17 00:00:00 2001 From: Jean-Pierre Portier Date: Tue, 26 Nov 2024 11:01:41 +0100 Subject: [PATCH 02/10] refactor (Mailgun/Java): Updated generated files for Form parameters serialization --- .../mailgun/api/v1/internal/EmailsApi.java | 136 +----- .../v1/emails/request/SendEmailRequest.java | 43 +- .../emails/request/SendEmailRequestImpl.java | 419 ++++++------------ .../emails/request/SendMimeEmailRequest.java | 43 +- .../request/SendMimeEmailRequestImpl.java | 339 +++++--------- 5 files changed, 273 insertions(+), 707 deletions(-) diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/api/v1/internal/EmailsApi.java b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/api/v1/internal/EmailsApi.java index 3d34bd32f..651ef5b9b 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/api/v1/internal/EmailsApi.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/api/v1/internal/EmailsApi.java @@ -24,9 +24,7 @@ import com.sinch.sdk.core.http.URLPathUtils; import com.sinch.sdk.core.models.ServerConfiguration; import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendEmailRequest; -import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendEmailRequestImpl; import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendMimeEmailRequest; -import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendMimeEmailRequestImpl; import com.sinch.sdk.domains.mailgun.models.v1.emails.response.GetStoredEmailResponse; import com.sinch.sdk.domains.mailgun.models.v1.emails.response.SendEmailResponse; import com.sinch.sdk.domains.mailgun.models.v1.emails.response.SendingQueuesStatusResponse; @@ -324,8 +322,8 @@ public SendEmailResponse sendEmail(String domainName, SendEmailRequest requestPa mapper.deserialize(response, new TypeReference>() {})); } - private HttpRequest sendEmailRequestBuilder( - String domainName, SendEmailRequest _requestParameters) throws ApiException { + private HttpRequest sendEmailRequestBuilder(String domainName, SendEmailRequest requestParameters) + throws ApiException { // verify the required parameter 'domainName' is set if (domainName == null) { throw new ApiException( @@ -338,79 +336,15 @@ private HttpRequest sendEmailRequestBuilder( "\\{" + "domain_name" + "\\}", URLPathUtils.encodePathSegment(domainName.toString())); - SendEmailRequestImpl requestParameters = (SendEmailRequestImpl) _requestParameters; List localVarQueryParams = new ArrayList<>(); Map localVarHeaderParams = new HashMap<>(); final Collection localVarAccepts = Arrays.asList("application/json"); - final Collection localVarContentTypes = Arrays.asList("multipart/form-data"); - final Collection localVarAuthNames = Arrays.asList("basicAuth"); - - HashMap localFormParams = new HashMap<>(); - requestParameters.from().ifPresent(value -> localFormParams.put("from", value)); - requestParameters.to().ifPresent(value -> localFormParams.put("to", value)); - requestParameters.cc().ifPresent(value -> localFormParams.put("cc", value)); - requestParameters.bcc().ifPresent(value -> localFormParams.put("bcc", value)); - requestParameters.subject().ifPresent(value -> localFormParams.put("subject", value)); - requestParameters.text().ifPresent(value -> localFormParams.put("text", value)); - requestParameters.html().ifPresent(value -> localFormParams.put("html", value)); - requestParameters.ampHtml().ifPresent(value -> localFormParams.put("amp-html", value)); - requestParameters.attachment().ifPresent(value -> localFormParams.put("attachment", value)); - requestParameters.inline().ifPresent(value -> localFormParams.put("inline", value)); - requestParameters.template().ifPresent(value -> localFormParams.put("template", value)); - requestParameters.templateVersion().ifPresent(value -> localFormParams.put("t:version", value)); - requestParameters.templateText().ifPresent(value -> localFormParams.put("t:text", value)); - requestParameters - .templateVariables() - .ifPresent(value -> localFormParams.put("t:variables", value)); - requestParameters.tag().ifPresent(value -> localFormParams.put("o:tag", value)); - requestParameters - .enableDkimSignature() - .ifPresent(value -> localFormParams.put("o:dkim", value)); - requestParameters - .secondaryDkim() - .ifPresent(value -> localFormParams.put("o:secondary-dkim", value)); - requestParameters - .secondaryDkimPublic() - .ifPresent(value -> localFormParams.put("o:secondary-dkim-public", value)); - requestParameters - .deliveryTime() - .ifPresent(value -> localFormParams.put("o:deliverytime", value)); - requestParameters - .deliveryTimeOptimizePeriod() - .ifPresent(value -> localFormParams.put("o:deliverytime-optimize-period", value)); - requestParameters - .timezoneLocalize() - .ifPresent(value -> localFormParams.put("o:time-zone-localize", value)); - requestParameters.testMode().ifPresent(value -> localFormParams.put("o:testmode", value)); - requestParameters.tracking().ifPresent(value -> localFormParams.put("o:tracking", value)); - requestParameters - .trackingClicks() - .ifPresent(value -> localFormParams.put("o:tracking-clicks", value)); - requestParameters - .trackingOpens() - .ifPresent(value -> localFormParams.put("o:tracking-opens", value)); - requestParameters.requireTls().ifPresent(value -> localFormParams.put("o:require-tls", value)); - requestParameters - .skipVerification() - .ifPresent(value -> localFormParams.put("o:skip-verification", value)); - requestParameters.sendingIp().ifPresent(value -> localFormParams.put("o:sending-ip", value)); - requestParameters - .sendingIpPool() - .ifPresent(value -> localFormParams.put("o:sending-ip-pool", value)); - requestParameters - .trackingPixelLocationTop() - .ifPresent(value -> localFormParams.put("o:tracking-pixel-location-top", value)); - requestParameters - .hColonXMyHeader() - .ifPresent(value -> localFormParams.put("h:X-My-Header", value)); - requestParameters.vColonMyVar().ifPresent(value -> localFormParams.put("v:my-var", value)); - requestParameters - .recipientVariables() - .ifPresent(value -> localFormParams.put("recipient-variables", value)); + final Map localFormParams = + mapper.serializeFormParameters(localVarContentTypes, requestParameters); return new HttpRequest( localVarPath, @@ -457,7 +391,7 @@ public SendEmailResponse sendMimeEmail(String domainName, SendMimeEmailRequest r } private HttpRequest sendMimeEmailRequestBuilder( - String domainName, SendMimeEmailRequest _requestParameters) throws ApiException { + String domainName, SendMimeEmailRequest requestParameters) throws ApiException { // verify the required parameter 'domainName' is set if (domainName == null) { throw new ApiException( @@ -470,71 +404,15 @@ private HttpRequest sendMimeEmailRequestBuilder( "\\{" + "domain_name" + "\\}", URLPathUtils.encodePathSegment(domainName.toString())); - SendMimeEmailRequestImpl requestParameters = (SendMimeEmailRequestImpl) _requestParameters; List localVarQueryParams = new ArrayList<>(); Map localVarHeaderParams = new HashMap<>(); final Collection localVarAccepts = Arrays.asList("application/json"); - final Collection localVarContentTypes = Arrays.asList("multipart/form-data"); - final Collection localVarAuthNames = Arrays.asList("basicAuth"); - - HashMap localFormParams = new HashMap<>(); - requestParameters.to().ifPresent(value -> localFormParams.put("to", value)); - requestParameters.message().ifPresent(value -> localFormParams.put("message", value)); - requestParameters.template().ifPresent(value -> localFormParams.put("template", value)); - requestParameters.templateVersion().ifPresent(value -> localFormParams.put("t:version", value)); - requestParameters.templateText().ifPresent(value -> localFormParams.put("t:text", value)); - requestParameters - .templateVariables() - .ifPresent(value -> localFormParams.put("t:variables", value)); - requestParameters.tag().ifPresent(value -> localFormParams.put("o:tag", value)); - requestParameters - .enableDkimSignature() - .ifPresent(value -> localFormParams.put("o:dkim", value)); - requestParameters - .secondaryDkim() - .ifPresent(value -> localFormParams.put("o:secondary-dkim", value)); - requestParameters - .secondaryDkimPublic() - .ifPresent(value -> localFormParams.put("o:secondary-dkim-public", value)); - requestParameters - .deliveryTime() - .ifPresent(value -> localFormParams.put("o:deliverytime", value)); - requestParameters - .deliveryTimeOptimizePeriod() - .ifPresent(value -> localFormParams.put("o:deliverytime-optimize-period", value)); - requestParameters - .timezoneLocalize() - .ifPresent(value -> localFormParams.put("o:time-zone-localize", value)); - requestParameters.isTestMode().ifPresent(value -> localFormParams.put("o:testmode", value)); - requestParameters.tracking().ifPresent(value -> localFormParams.put("o:tracking", value)); - requestParameters - .trackingClicks() - .ifPresent(value -> localFormParams.put("o:tracking-clicks", value)); - requestParameters - .trackingOpens() - .ifPresent(value -> localFormParams.put("o:tracking-opens", value)); - requestParameters.requireTls().ifPresent(value -> localFormParams.put("o:require-tls", value)); - requestParameters - .skipVerification() - .ifPresent(value -> localFormParams.put("o:skip-verification", value)); - requestParameters.sendingIp().ifPresent(value -> localFormParams.put("o:sending-ip", value)); - requestParameters - .sendingIpPool() - .ifPresent(value -> localFormParams.put("o:sending-ip-pool", value)); - requestParameters - .trackingPixelLocationTop() - .ifPresent(value -> localFormParams.put("o:tracking-pixel-location-top", value)); - requestParameters - .hColonXMyHeader() - .ifPresent(value -> localFormParams.put("h:X-My-Header", value)); - requestParameters.vColonMyVar().ifPresent(value -> localFormParams.put("v:my-var", value)); - requestParameters - .recipientVariables() - .ifPresent(value -> localFormParams.put("recipient-variables", value)); + final Map localFormParams = + mapper.serializeFormParameters(localVarContentTypes, requestParameters); return new HttpRequest( localVarPath, diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequest.java b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequest.java index 61aee2ad9..bf8458201 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequest.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequest.java @@ -14,6 +14,7 @@ import com.sinch.sdk.core.utils.EnumDynamic; import com.sinch.sdk.core.utils.EnumSupportDynamic; import java.io.File; +import java.time.Instant; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; @@ -226,7 +227,7 @@ public static String valueOf(DkimSignatureEnum e) { * * @return deliveryTime */ - String getDeliveryTime(); + Instant getDeliveryTime(); /** * Toggles Send Time Optimization (STO) on a per-message basis. String should be set to the number @@ -238,7 +239,7 @@ public static String valueOf(DkimSignatureEnum e) { * * @return deliveryTimeOptimizePeriod */ - String getDeliveryTimeOptimizePeriod(); + Integer getDeliveryTimeOptimizePeriod(); /** * Toggles Timezone Optimization (TZO) on a per message basis. String should be set to preferred @@ -530,22 +531,6 @@ public static String valueOf(SkipVerificationEnum e) { */ String getTrackingPixelLocationTop(); - /** - * h: prefix followed by a Header/Value pair. For example: - * h:X-Mailgun-Sending-Ip-Pool=xx.xx.xxx.x. - * - * @return hColonXMyHeader - */ - String gethColonXMyHeader(); - - /** - * v: prefix followed by an arbitrary name allows to attach a custom JSON data to the - * message. See Attaching Data to Messages for more information - * - * @return vColonMyVar - */ - String getvColonMyVar(); - /** * A valid JSON-encoded dictionary, where key is a plain recipient address and value is a * dictionary with variables that can be referenced in the message body. See Batch @@ -744,7 +729,7 @@ interface Builder { * @return Current builder * @see #getDeliveryTime */ - Builder setDeliveryTime(String deliveryTime); + Builder setDeliveryTime(Instant deliveryTime); /** * see getter @@ -753,7 +738,7 @@ interface Builder { * @return Current builder * @see #getDeliveryTimeOptimizePeriod */ - Builder setDeliveryTimeOptimizePeriod(String deliveryTimeOptimizePeriod); + Builder setDeliveryTimeOptimizePeriod(Integer deliveryTimeOptimizePeriod); /** * see getter @@ -845,24 +830,6 @@ interface Builder { */ Builder setTrackingPixelLocationTop(String trackingPixelLocationTop); - /** - * see getter - * - * @param hColonXMyHeader see getter - * @return Current builder - * @see #gethColonXMyHeader - */ - Builder sethColonXMyHeader(String hColonXMyHeader); - - /** - * see getter - * - * @param vColonMyVar see getter - * @return Current builder - * @see #getvColonMyVar - */ - Builder setvColonMyVar(String vColonMyVar); - /** * see getter * diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequestImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequestImpl.java index f858333a4..9befa99ab 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequestImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequestImpl.java @@ -1,192 +1,175 @@ package com.sinch.sdk.domains.mailgun.models.v1.emails.request; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonFilter; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import com.sinch.sdk.core.databind.annotation.FormSerialize; +import com.sinch.sdk.core.databind.annotation.PropertiesOrder; +import com.sinch.sdk.core.databind.annotation.Property; import com.sinch.sdk.core.models.OptionalValue; import java.io.File; +import java.time.Instant; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -@JsonPropertyOrder({ - SendEmailRequestImpl.JSON_PROPERTY_FROM, - SendEmailRequestImpl.JSON_PROPERTY_TO, - SendEmailRequestImpl.JSON_PROPERTY_CC, - SendEmailRequestImpl.JSON_PROPERTY_BCC, - SendEmailRequestImpl.JSON_PROPERTY_SUBJECT, - SendEmailRequestImpl.JSON_PROPERTY_TEXT, - SendEmailRequestImpl.JSON_PROPERTY_HTML, - SendEmailRequestImpl.JSON_PROPERTY_AMP_HTML, - SendEmailRequestImpl.JSON_PROPERTY_ATTACHMENT, - SendEmailRequestImpl.JSON_PROPERTY_INLINE, - SendEmailRequestImpl.JSON_PROPERTY_TEMPLATE, - SendEmailRequestImpl.JSON_PROPERTY_T_COLON_VERSION, - SendEmailRequestImpl.JSON_PROPERTY_T_COLON_TEXT, - SendEmailRequestImpl.JSON_PROPERTY_T_COLON_VARIABLES, - SendEmailRequestImpl.JSON_PROPERTY_O_COLON_TAG, - SendEmailRequestImpl.JSON_PROPERTY_O_COLON_DKIM, - SendEmailRequestImpl.JSON_PROPERTY_O_COLON_SECONDARY_DKIM, - SendEmailRequestImpl.JSON_PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC, - SendEmailRequestImpl.JSON_PROPERTY_O_COLON_DELIVERYTIME, - SendEmailRequestImpl.JSON_PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD, - SendEmailRequestImpl.JSON_PROPERTY_O_COLON_TIME_ZONE_LOCALIZE, - SendEmailRequestImpl.JSON_PROPERTY_O_COLON_TESTMODE, - SendEmailRequestImpl.JSON_PROPERTY_O_COLON_TRACKING, - SendEmailRequestImpl.JSON_PROPERTY_O_COLON_TRACKING_CLICKS, - SendEmailRequestImpl.JSON_PROPERTY_O_COLON_TRACKING_OPENS, - SendEmailRequestImpl.JSON_PROPERTY_O_COLON_REQUIRE_TLS, - SendEmailRequestImpl.JSON_PROPERTY_O_COLON_SKIP_VERIFICATION, - SendEmailRequestImpl.JSON_PROPERTY_O_COLON_SENDING_IP, - SendEmailRequestImpl.JSON_PROPERTY_O_COLON_SENDING_IP_POOL, - SendEmailRequestImpl.JSON_PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP, - SendEmailRequestImpl.JSON_PROPERTY_H_COLON_X_MY_HEADER, - SendEmailRequestImpl.JSON_PROPERTY_V_COLON_MY_VAR, - SendEmailRequestImpl.JSON_PROPERTY_RECIPIENT_VARIABLES +@PropertiesOrder({ + SendEmailRequestImpl.PROPERTY_FROM, + SendEmailRequestImpl.PROPERTY_TO, + SendEmailRequestImpl.PROPERTY_CC, + SendEmailRequestImpl.PROPERTY_BCC, + SendEmailRequestImpl.PROPERTY_SUBJECT, + SendEmailRequestImpl.PROPERTY_TEXT, + SendEmailRequestImpl.PROPERTY_HTML, + SendEmailRequestImpl.PROPERTY_AMP_HTML, + SendEmailRequestImpl.PROPERTY_ATTACHMENT, + SendEmailRequestImpl.PROPERTY_INLINE, + SendEmailRequestImpl.PROPERTY_TEMPLATE, + SendEmailRequestImpl.PROPERTY_T_COLON_VERSION, + SendEmailRequestImpl.PROPERTY_T_COLON_TEXT, + SendEmailRequestImpl.PROPERTY_T_COLON_VARIABLES, + SendEmailRequestImpl.PROPERTY_O_COLON_TAG, + SendEmailRequestImpl.PROPERTY_O_COLON_DKIM, + SendEmailRequestImpl.PROPERTY_O_COLON_SECONDARY_DKIM, + SendEmailRequestImpl.PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC, + SendEmailRequestImpl.PROPERTY_O_COLON_DELIVERYTIME, + SendEmailRequestImpl.PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD, + SendEmailRequestImpl.PROPERTY_O_COLON_TIME_ZONE_LOCALIZE, + SendEmailRequestImpl.PROPERTY_O_COLON_TESTMODE, + SendEmailRequestImpl.PROPERTY_O_COLON_TRACKING, + SendEmailRequestImpl.PROPERTY_O_COLON_TRACKING_CLICKS, + SendEmailRequestImpl.PROPERTY_O_COLON_TRACKING_OPENS, + SendEmailRequestImpl.PROPERTY_O_COLON_REQUIRE_TLS, + SendEmailRequestImpl.PROPERTY_O_COLON_SKIP_VERIFICATION, + SendEmailRequestImpl.PROPERTY_O_COLON_SENDING_IP, + SendEmailRequestImpl.PROPERTY_O_COLON_SENDING_IP_POOL, + SendEmailRequestImpl.PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP, + SendEmailRequestImpl.PROPERTY_RECIPIENT_VARIABLES }) -@JsonFilter("uninitializedFilter") -@JsonInclude(value = JsonInclude.Include.CUSTOM) public class SendEmailRequestImpl implements SendEmailRequest { private static final long serialVersionUID = 1L; - public static final String JSON_PROPERTY_FROM = "from"; + public static final String PROPERTY_FROM = "from"; private OptionalValue from; - public static final String JSON_PROPERTY_TO = "to"; + public static final String PROPERTY_TO = "to"; private OptionalValue> to; - public static final String JSON_PROPERTY_CC = "cc"; + public static final String PROPERTY_CC = "cc"; private OptionalValue> cc; - public static final String JSON_PROPERTY_BCC = "bcc"; + public static final String PROPERTY_BCC = "bcc"; private OptionalValue> bcc; - public static final String JSON_PROPERTY_SUBJECT = "subject"; + public static final String PROPERTY_SUBJECT = "subject"; private OptionalValue subject; - public static final String JSON_PROPERTY_TEXT = "text"; + public static final String PROPERTY_TEXT = "text"; private OptionalValue text; - public static final String JSON_PROPERTY_HTML = "html"; + public static final String PROPERTY_HTML = "html"; private OptionalValue html; - public static final String JSON_PROPERTY_AMP_HTML = "amp-html"; + public static final String PROPERTY_AMP_HTML = "amp-html"; private OptionalValue ampHtml; - public static final String JSON_PROPERTY_ATTACHMENT = "attachment"; + public static final String PROPERTY_ATTACHMENT = "attachment"; private OptionalValue> attachment; - public static final String JSON_PROPERTY_INLINE = "inline"; + public static final String PROPERTY_INLINE = "inline"; private OptionalValue> inline; - public static final String JSON_PROPERTY_TEMPLATE = "template"; + public static final String PROPERTY_TEMPLATE = "template"; private OptionalValue template; - public static final String JSON_PROPERTY_T_COLON_VERSION = "t:version"; + public static final String PROPERTY_T_COLON_VERSION = "t:version"; private OptionalValue templateVersion; - public static final String JSON_PROPERTY_T_COLON_TEXT = "t:text"; + public static final String PROPERTY_T_COLON_TEXT = "t:text"; private OptionalValue templateText; - public static final String JSON_PROPERTY_T_COLON_VARIABLES = "t:variables"; + public static final String PROPERTY_T_COLON_VARIABLES = "t:variables"; private OptionalValue templateVariables; - public static final String JSON_PROPERTY_O_COLON_TAG = "o:tag"; + public static final String PROPERTY_O_COLON_TAG = "o:tag"; private OptionalValue> tag; - public static final String JSON_PROPERTY_O_COLON_DKIM = "o:dkim"; + public static final String PROPERTY_O_COLON_DKIM = "o:dkim"; private OptionalValue enableDkimSignature; - public static final String JSON_PROPERTY_O_COLON_SECONDARY_DKIM = "o:secondary-dkim"; + public static final String PROPERTY_O_COLON_SECONDARY_DKIM = "o:secondary-dkim"; private OptionalValue secondaryDkim; - public static final String JSON_PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC = - "o:secondary-dkim-public"; + public static final String PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC = "o:secondary-dkim-public"; private OptionalValue secondaryDkimPublic; - public static final String JSON_PROPERTY_O_COLON_DELIVERYTIME = "o:deliverytime"; + public static final String PROPERTY_O_COLON_DELIVERYTIME = "o:deliverytime"; - private OptionalValue deliveryTime; + private OptionalValue deliveryTime; - public static final String JSON_PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD = + public static final String PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD = "o:deliverytime-optimize-period"; - private OptionalValue deliveryTimeOptimizePeriod; + private OptionalValue deliveryTimeOptimizePeriod; - public static final String JSON_PROPERTY_O_COLON_TIME_ZONE_LOCALIZE = "o:time-zone-localize"; + public static final String PROPERTY_O_COLON_TIME_ZONE_LOCALIZE = "o:time-zone-localize"; private OptionalValue timezoneLocalize; - public static final String JSON_PROPERTY_O_COLON_TESTMODE = "o:testmode"; + public static final String PROPERTY_O_COLON_TESTMODE = "o:testmode"; private OptionalValue testMode; - public static final String JSON_PROPERTY_O_COLON_TRACKING = "o:tracking"; + public static final String PROPERTY_O_COLON_TRACKING = "o:tracking"; private OptionalValue tracking; - public static final String JSON_PROPERTY_O_COLON_TRACKING_CLICKS = "o:tracking-clicks"; + public static final String PROPERTY_O_COLON_TRACKING_CLICKS = "o:tracking-clicks"; private OptionalValue trackingClicks; - public static final String JSON_PROPERTY_O_COLON_TRACKING_OPENS = "o:tracking-opens"; + public static final String PROPERTY_O_COLON_TRACKING_OPENS = "o:tracking-opens"; private OptionalValue trackingOpens; - public static final String JSON_PROPERTY_O_COLON_REQUIRE_TLS = "o:require-tls"; + public static final String PROPERTY_O_COLON_REQUIRE_TLS = "o:require-tls"; private OptionalValue requireTls; - public static final String JSON_PROPERTY_O_COLON_SKIP_VERIFICATION = "o:skip-verification"; + public static final String PROPERTY_O_COLON_SKIP_VERIFICATION = "o:skip-verification"; private OptionalValue skipVerification; - public static final String JSON_PROPERTY_O_COLON_SENDING_IP = "o:sending-ip"; + public static final String PROPERTY_O_COLON_SENDING_IP = "o:sending-ip"; private OptionalValue sendingIp; - public static final String JSON_PROPERTY_O_COLON_SENDING_IP_POOL = "o:sending-ip-pool"; + public static final String PROPERTY_O_COLON_SENDING_IP_POOL = "o:sending-ip-pool"; private OptionalValue sendingIpPool; - public static final String JSON_PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP = + public static final String PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP = "o:tracking-pixel-location-top"; private OptionalValue trackingPixelLocationTop; - public static final String JSON_PROPERTY_H_COLON_X_MY_HEADER = "h:X-My-Header"; - - private OptionalValue hColonXMyHeader; - - public static final String JSON_PROPERTY_V_COLON_MY_VAR = "v:my-var"; - - private OptionalValue vColonMyVar; - - public static final String JSON_PROPERTY_RECIPIENT_VARIABLES = "recipient-variables"; + public static final String PROPERTY_RECIPIENT_VARIABLES = "recipient-variables"; private OptionalValue recipientVariables; @@ -217,8 +200,8 @@ protected SendEmailRequestImpl( OptionalValue enableDkimSignature, OptionalValue secondaryDkim, OptionalValue secondaryDkimPublic, - OptionalValue deliveryTime, - OptionalValue deliveryTimeOptimizePeriod, + OptionalValue deliveryTime, + OptionalValue deliveryTimeOptimizePeriod, OptionalValue timezoneLocalize, OptionalValue testMode, OptionalValue tracking, @@ -229,8 +212,6 @@ protected SendEmailRequestImpl( OptionalValue sendingIp, OptionalValue sendingIpPool, OptionalValue trackingPixelLocationTop, - OptionalValue hColonXMyHeader, - OptionalValue vColonMyVar, OptionalValue recipientVariables, OptionalValue> additionalProperties) { this.from = from; @@ -263,376 +244,292 @@ protected SendEmailRequestImpl( this.sendingIp = sendingIp; this.sendingIpPool = sendingIpPool; this.trackingPixelLocationTop = trackingPixelLocationTop; - this.hColonXMyHeader = hColonXMyHeader; - this.vColonMyVar = vColonMyVar; this.recipientVariables = recipientVariables; this.additionalProperties = additionalProperties; } - @JsonIgnore public String getFrom() { return from.orElse(null); } - @JsonProperty(JSON_PROPERTY_FROM) - @JsonInclude(value = JsonInclude.Include.ALWAYS) + @Property(PROPERTY_FROM) public OptionalValue from() { return from; } - @JsonIgnore public List getTo() { return to.orElse(null); } - @JsonProperty(JSON_PROPERTY_TO) - @JsonInclude(value = JsonInclude.Include.ALWAYS) + @Property(PROPERTY_TO) public OptionalValue> to() { return to; } - @JsonIgnore public List getCc() { return cc.orElse(null); } - @JsonProperty(JSON_PROPERTY_CC) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_CC) public OptionalValue> cc() { return cc; } - @JsonIgnore public List getBcc() { return bcc.orElse(null); } - @JsonProperty(JSON_PROPERTY_BCC) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_BCC) public OptionalValue> bcc() { return bcc; } - @JsonIgnore public String getSubject() { return subject.orElse(null); } - @JsonProperty(JSON_PROPERTY_SUBJECT) - @JsonInclude(value = JsonInclude.Include.ALWAYS) + @Property(PROPERTY_SUBJECT) public OptionalValue subject() { return subject; } - @JsonIgnore public String getText() { return text.orElse(null); } - @JsonProperty(JSON_PROPERTY_TEXT) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_TEXT) public OptionalValue text() { return text; } - @JsonIgnore public String getHtml() { return html.orElse(null); } - @JsonProperty(JSON_PROPERTY_HTML) - @JsonInclude(value = JsonInclude.Include.ALWAYS) + @Property(PROPERTY_HTML) public OptionalValue html() { return html; } - @JsonIgnore public String getAmpHtml() { return ampHtml.orElse(null); } - @JsonProperty(JSON_PROPERTY_AMP_HTML) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_AMP_HTML) public OptionalValue ampHtml() { return ampHtml; } - @JsonIgnore public List getAttachment() { return attachment.orElse(null); } - @JsonProperty(JSON_PROPERTY_ATTACHMENT) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_ATTACHMENT) public OptionalValue> attachment() { return attachment; } - @JsonIgnore public List getInline() { return inline.orElse(null); } - @JsonProperty(JSON_PROPERTY_INLINE) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_INLINE) public OptionalValue> inline() { return inline; } - @JsonIgnore public String getTemplate() { return template.orElse(null); } - @JsonProperty(JSON_PROPERTY_TEMPLATE) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_TEMPLATE) public OptionalValue template() { return template; } - @JsonIgnore public String getTemplateVersion() { return templateVersion.orElse(null); } - @JsonProperty(JSON_PROPERTY_T_COLON_VERSION) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_T_COLON_VERSION) public OptionalValue templateVersion() { return templateVersion; } - @JsonIgnore public TemplateTextEnum getTemplateText() { return templateText.orElse(null); } - @JsonProperty(JSON_PROPERTY_T_COLON_TEXT) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_T_COLON_TEXT) public OptionalValue templateText() { return templateText; } - @JsonIgnore public String getTemplateVariables() { return templateVariables.orElse(null); } - @JsonProperty(JSON_PROPERTY_T_COLON_VARIABLES) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_T_COLON_VARIABLES) public OptionalValue templateVariables() { return templateVariables; } - @JsonIgnore public List getTag() { return tag.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_TAG) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_TAG) public OptionalValue> tag() { return tag; } - @JsonIgnore public DkimSignatureEnum getEnableDkimSignature() { return enableDkimSignature.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_DKIM) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_DKIM) public OptionalValue enableDkimSignature() { return enableDkimSignature; } - @JsonIgnore public String getSecondaryDkim() { return secondaryDkim.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_SECONDARY_DKIM) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_SECONDARY_DKIM) public OptionalValue secondaryDkim() { return secondaryDkim; } - @JsonIgnore public String getSecondaryDkimPublic() { return secondaryDkimPublic.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC) public OptionalValue secondaryDkimPublic() { return secondaryDkimPublic; } - @JsonIgnore - public String getDeliveryTime() { + public Instant getDeliveryTime() { return deliveryTime.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_DELIVERYTIME) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public OptionalValue deliveryTime() { + @Property(PROPERTY_O_COLON_DELIVERYTIME) + @FormSerialize(using = com.sinch.sdk.core.utils.databind.RFC822FormSerializer.class) + public OptionalValue deliveryTime() { return deliveryTime; } - @JsonIgnore - public String getDeliveryTimeOptimizePeriod() { + public Integer getDeliveryTimeOptimizePeriod() { return deliveryTimeOptimizePeriod.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public OptionalValue deliveryTimeOptimizePeriod() { + @Property(PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD) + @FormSerialize( + using = com.sinch.sdk.domains.mailgun.api.v1.adapters.DeliveryTimeFormSerializer.class) + public OptionalValue deliveryTimeOptimizePeriod() { return deliveryTimeOptimizePeriod; } - @JsonIgnore public String getTimezoneLocalize() { return timezoneLocalize.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_TIME_ZONE_LOCALIZE) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_TIME_ZONE_LOCALIZE) public OptionalValue timezoneLocalize() { return timezoneLocalize; } - @JsonIgnore public TestModeEnum getTestMode() { return testMode.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_TESTMODE) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_TESTMODE) public OptionalValue testMode() { return testMode; } - @JsonIgnore public TrackingEnum getTracking() { return tracking.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_TRACKING) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_TRACKING) public OptionalValue tracking() { return tracking; } - @JsonIgnore public TrackingClicksEnum getTrackingClicks() { return trackingClicks.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_TRACKING_CLICKS) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_TRACKING_CLICKS) public OptionalValue trackingClicks() { return trackingClicks; } - @JsonIgnore public TrackingOpensEnum getTrackingOpens() { return trackingOpens.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_TRACKING_OPENS) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_TRACKING_OPENS) public OptionalValue trackingOpens() { return trackingOpens; } - @JsonIgnore public RequireTlsEnum getRequireTls() { return requireTls.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_REQUIRE_TLS) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_REQUIRE_TLS) public OptionalValue requireTls() { return requireTls; } - @JsonIgnore public SkipVerificationEnum getSkipVerification() { return skipVerification.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_SKIP_VERIFICATION) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_SKIP_VERIFICATION) public OptionalValue skipVerification() { return skipVerification; } - @JsonIgnore public String getSendingIp() { return sendingIp.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_SENDING_IP) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_SENDING_IP) public OptionalValue sendingIp() { return sendingIp; } - @JsonIgnore public String getSendingIpPool() { return sendingIpPool.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_SENDING_IP_POOL) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_SENDING_IP_POOL) public OptionalValue sendingIpPool() { return sendingIpPool; } - @JsonIgnore public String getTrackingPixelLocationTop() { return trackingPixelLocationTop.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP) public OptionalValue trackingPixelLocationTop() { return trackingPixelLocationTop; } - @JsonIgnore - public String gethColonXMyHeader() { - return hColonXMyHeader.orElse(null); - } - - @JsonProperty(JSON_PROPERTY_H_COLON_X_MY_HEADER) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public OptionalValue hColonXMyHeader() { - return hColonXMyHeader; - } - - @JsonIgnore - public String getvColonMyVar() { - return vColonMyVar.orElse(null); - } - - @JsonProperty(JSON_PROPERTY_V_COLON_MY_VAR) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public OptionalValue vColonMyVar() { - return vColonMyVar; - } - - @JsonIgnore public String getRecipientVariables() { return recipientVariables.orElse(null); } - @JsonProperty(JSON_PROPERTY_RECIPIENT_VARIABLES) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_RECIPIENT_VARIABLES) public OptionalValue recipientVariables() { return recipientVariables; } - @JsonIgnore public Object get(String key) { if (null == this.additionalProperties || !additionalProperties.isPresent()) { @@ -641,7 +538,6 @@ public Object get(String key) { return this.additionalProperties.get().get(key); } - @JsonAnyGetter public Map additionalProperties() { if (null == this.additionalProperties || !additionalProperties.isPresent()) { return null; @@ -724,11 +620,6 @@ public boolean equals(Object o) { && Objects.equals( this.trackingPixelLocationTop, poSTV3DomainNameMessagesMultipartFormDataRequestBody.trackingPixelLocationTop) - && Objects.equals( - this.hColonXMyHeader, - poSTV3DomainNameMessagesMultipartFormDataRequestBody.hColonXMyHeader) - && Objects.equals( - this.vColonMyVar, poSTV3DomainNameMessagesMultipartFormDataRequestBody.vColonMyVar) && Objects.equals( this.recipientVariables, poSTV3DomainNameMessagesMultipartFormDataRequestBody.recipientVariables) @@ -771,8 +662,6 @@ public int hashCode() { sendingIp, sendingIpPool, trackingPixelLocationTop, - hColonXMyHeader, - vColonMyVar, recipientVariables, super.hashCode(), additionalProperties); @@ -821,8 +710,6 @@ public String toString() { sb.append(" trackingPixelLocationTop: ") .append(toIndentedString(trackingPixelLocationTop)) .append("\n"); - sb.append(" hColonXMyHeader: ").append(toIndentedString(hColonXMyHeader)).append("\n"); - sb.append(" vColonMyVar: ").append(toIndentedString(vColonMyVar)).append("\n"); sb.append(" recipientVariables: ").append(toIndentedString(recipientVariables)).append("\n"); sb.append(" additionalProperties: ") .append(toIndentedString(additionalProperties)) @@ -841,7 +728,6 @@ private String toIndentedString(Object o) { return o.toString().replace("\n", "\n "); } - @JsonPOJOBuilder(withPrefix = "set") static class Builder implements SendEmailRequest.Builder { OptionalValue from = OptionalValue.empty(); OptionalValue> to = OptionalValue.empty(); @@ -861,8 +747,8 @@ static class Builder implements SendEmailRequest.Builder { OptionalValue enableDkimSignature = OptionalValue.empty(); OptionalValue secondaryDkim = OptionalValue.empty(); OptionalValue secondaryDkimPublic = OptionalValue.empty(); - OptionalValue deliveryTime = OptionalValue.empty(); - OptionalValue deliveryTimeOptimizePeriod = OptionalValue.empty(); + OptionalValue deliveryTime = OptionalValue.empty(); + OptionalValue deliveryTimeOptimizePeriod = OptionalValue.empty(); OptionalValue timezoneLocalize = OptionalValue.empty(); OptionalValue testMode = OptionalValue.empty(); OptionalValue tracking = OptionalValue.empty(); @@ -873,210 +759,195 @@ static class Builder implements SendEmailRequest.Builder { OptionalValue sendingIp = OptionalValue.empty(); OptionalValue sendingIpPool = OptionalValue.empty(); OptionalValue trackingPixelLocationTop = OptionalValue.empty(); - OptionalValue hColonXMyHeader = OptionalValue.empty(); - OptionalValue vColonMyVar = OptionalValue.empty(); OptionalValue recipientVariables = OptionalValue.empty(); OptionalValue> additionalProperties = OptionalValue.empty(); - @JsonProperty(JSON_PROPERTY_FROM) + @Property(value = PROPERTY_FROM) public Builder setFrom(String from) { this.from = OptionalValue.of(from); return this; } - @JsonProperty(JSON_PROPERTY_TO) + @Property(value = PROPERTY_TO) public Builder setTo(List to) { this.to = OptionalValue.of(to); return this; } - @JsonProperty(JSON_PROPERTY_CC) + @Property(value = PROPERTY_CC) public Builder setCc(List cc) { this.cc = OptionalValue.of(cc); return this; } - @JsonProperty(JSON_PROPERTY_BCC) + @Property(value = PROPERTY_BCC) public Builder setBcc(List bcc) { this.bcc = OptionalValue.of(bcc); return this; } - @JsonProperty(JSON_PROPERTY_SUBJECT) + @Property(value = PROPERTY_SUBJECT) public Builder setSubject(String subject) { this.subject = OptionalValue.of(subject); return this; } - @JsonProperty(JSON_PROPERTY_TEXT) + @Property(value = PROPERTY_TEXT) public Builder setText(String text) { this.text = OptionalValue.of(text); return this; } - @JsonProperty(JSON_PROPERTY_HTML) + @Property(value = PROPERTY_HTML) public Builder setHtml(String html) { this.html = OptionalValue.of(html); return this; } - @JsonProperty(JSON_PROPERTY_AMP_HTML) + @Property(value = PROPERTY_AMP_HTML) public Builder setAmpHtml(String ampHtml) { this.ampHtml = OptionalValue.of(ampHtml); return this; } - @JsonProperty(JSON_PROPERTY_ATTACHMENT) + @Property(value = PROPERTY_ATTACHMENT) public Builder setAttachment(List attachment) { this.attachment = OptionalValue.of(attachment); return this; } - @JsonProperty(JSON_PROPERTY_INLINE) + @Property(value = PROPERTY_INLINE) public Builder setInline(List inline) { this.inline = OptionalValue.of(inline); return this; } - @JsonProperty(JSON_PROPERTY_TEMPLATE) + @Property(value = PROPERTY_TEMPLATE) public Builder setTemplate(String template) { this.template = OptionalValue.of(template); return this; } - @JsonProperty(JSON_PROPERTY_T_COLON_VERSION) + @Property(value = PROPERTY_T_COLON_VERSION) public Builder setTemplateVersion(String templateVersion) { this.templateVersion = OptionalValue.of(templateVersion); return this; } - @JsonProperty(JSON_PROPERTY_T_COLON_TEXT) + @Property(value = PROPERTY_T_COLON_TEXT) public Builder setTemplateText(TemplateTextEnum templateText) { this.templateText = OptionalValue.of(templateText); return this; } - @JsonProperty(JSON_PROPERTY_T_COLON_VARIABLES) + @Property(value = PROPERTY_T_COLON_VARIABLES) public Builder setTemplateVariables(String templateVariables) { this.templateVariables = OptionalValue.of(templateVariables); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_TAG) + @Property(value = PROPERTY_O_COLON_TAG) public Builder setTag(List tag) { this.tag = OptionalValue.of(tag); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_DKIM) + @Property(value = PROPERTY_O_COLON_DKIM) public Builder setEnableDkimSignature(DkimSignatureEnum enableDkimSignature) { this.enableDkimSignature = OptionalValue.of(enableDkimSignature); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_SECONDARY_DKIM) + @Property(value = PROPERTY_O_COLON_SECONDARY_DKIM) public Builder setSecondaryDkim(String secondaryDkim) { this.secondaryDkim = OptionalValue.of(secondaryDkim); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC) + @Property(value = PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC) public Builder setSecondaryDkimPublic(String secondaryDkimPublic) { this.secondaryDkimPublic = OptionalValue.of(secondaryDkimPublic); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_DELIVERYTIME) - public Builder setDeliveryTime(String deliveryTime) { + @Property(value = PROPERTY_O_COLON_DELIVERYTIME) + public Builder setDeliveryTime(Instant deliveryTime) { this.deliveryTime = OptionalValue.of(deliveryTime); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD) - public Builder setDeliveryTimeOptimizePeriod(String deliveryTimeOptimizePeriod) { + @Property(value = PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD) + public Builder setDeliveryTimeOptimizePeriod(Integer deliveryTimeOptimizePeriod) { this.deliveryTimeOptimizePeriod = OptionalValue.of(deliveryTimeOptimizePeriod); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_TIME_ZONE_LOCALIZE) + @Property(value = PROPERTY_O_COLON_TIME_ZONE_LOCALIZE) public Builder setTimezoneLocalize(String timezoneLocalize) { this.timezoneLocalize = OptionalValue.of(timezoneLocalize); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_TESTMODE) + @Property(value = PROPERTY_O_COLON_TESTMODE) public Builder setTestMode(TestModeEnum testMode) { this.testMode = OptionalValue.of(testMode); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_TRACKING) + @Property(value = PROPERTY_O_COLON_TRACKING) public Builder setTracking(TrackingEnum tracking) { this.tracking = OptionalValue.of(tracking); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_TRACKING_CLICKS) + @Property(value = PROPERTY_O_COLON_TRACKING_CLICKS) public Builder setTrackingClicks(TrackingClicksEnum trackingClicks) { this.trackingClicks = OptionalValue.of(trackingClicks); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_TRACKING_OPENS) + @Property(value = PROPERTY_O_COLON_TRACKING_OPENS) public Builder setTrackingOpens(TrackingOpensEnum trackingOpens) { this.trackingOpens = OptionalValue.of(trackingOpens); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_REQUIRE_TLS) + @Property(value = PROPERTY_O_COLON_REQUIRE_TLS) public Builder setRequireTls(RequireTlsEnum requireTls) { this.requireTls = OptionalValue.of(requireTls); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_SKIP_VERIFICATION) + @Property(value = PROPERTY_O_COLON_SKIP_VERIFICATION) public Builder setSkipVerification(SkipVerificationEnum skipVerification) { this.skipVerification = OptionalValue.of(skipVerification); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_SENDING_IP) + @Property(value = PROPERTY_O_COLON_SENDING_IP) public Builder setSendingIp(String sendingIp) { this.sendingIp = OptionalValue.of(sendingIp); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_SENDING_IP_POOL) + @Property(value = PROPERTY_O_COLON_SENDING_IP_POOL) public Builder setSendingIpPool(String sendingIpPool) { this.sendingIpPool = OptionalValue.of(sendingIpPool); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP) + @Property(value = PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP) public Builder setTrackingPixelLocationTop(String trackingPixelLocationTop) { this.trackingPixelLocationTop = OptionalValue.of(trackingPixelLocationTop); return this; } - @JsonProperty(JSON_PROPERTY_H_COLON_X_MY_HEADER) - public Builder sethColonXMyHeader(String hColonXMyHeader) { - this.hColonXMyHeader = OptionalValue.of(hColonXMyHeader); - return this; - } - - @JsonProperty(JSON_PROPERTY_V_COLON_MY_VAR) - public Builder setvColonMyVar(String vColonMyVar) { - this.vColonMyVar = OptionalValue.of(vColonMyVar); - return this; - } - - @JsonProperty(JSON_PROPERTY_RECIPIENT_VARIABLES) + @Property(value = PROPERTY_RECIPIENT_VARIABLES) public Builder setRecipientVariables(String recipientVariables) { this.recipientVariables = OptionalValue.of(recipientVariables); return this; } - @JsonAnySetter public Builder put(String key, Object value) { if (!this.additionalProperties.isPresent()) { this.additionalProperties = OptionalValue.of(new HashMap()); @@ -1117,8 +988,6 @@ public SendEmailRequest build() { sendingIp, sendingIpPool, trackingPixelLocationTop, - hColonXMyHeader, - vColonMyVar, recipientVariables, additionalProperties); } diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequest.java b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequest.java index 86f645e6a..cadb8ac4f 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequest.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequest.java @@ -14,6 +14,7 @@ import com.sinch.sdk.core.utils.EnumDynamic; import com.sinch.sdk.core.utils.EnumSupportDynamic; import java.io.File; +import java.time.Instant; import java.util.Arrays; import java.util.List; import java.util.stream.Stream; @@ -164,7 +165,7 @@ public static String valueOf(DkimSignatureEnum e) { * * @return deliveryTime */ - String getDeliveryTime(); + Instant getDeliveryTime(); /** * Toggles Send Time Optimization (STO) on a per-message basis. String should be set to the number @@ -176,7 +177,7 @@ public static String valueOf(DkimSignatureEnum e) { * * @return deliveryTimeOptimizePeriod */ - String getDeliveryTimeOptimizePeriod(); + Integer getDeliveryTimeOptimizePeriod(); /** * Toggles Timezone Optimization (TZO) on a per message basis. String should be set to preferred @@ -468,22 +469,6 @@ public static String valueOf(SkipVerificationEnum e) { */ String getTrackingPixelLocationTop(); - /** - * h: prefix followed by a Header/Value pair. For example: - * h:X-Mailgun-Sending-Ip-Pool=xx.xx.xxx.x. - * - * @return hColonXMyHeader - */ - String gethColonXMyHeader(); - - /** - * v: prefix followed by an arbitrary name allows to attach a custom JSON data to the - * message. See Attaching Data to Messages for more information - * - * @return vColonMyVar - */ - String getvColonMyVar(); - /** * A valid JSON-encoded dictionary, where key is a plain recipient address and value is a * dictionary with variables that can be referenced in the message body. See Batch @@ -610,7 +595,7 @@ interface Builder { * @return Current builder * @see #getDeliveryTime */ - Builder setDeliveryTime(String deliveryTime); + Builder setDeliveryTime(Instant deliveryTime); /** * see getter @@ -619,7 +604,7 @@ interface Builder { * @return Current builder * @see #getDeliveryTimeOptimizePeriod */ - Builder setDeliveryTimeOptimizePeriod(String deliveryTimeOptimizePeriod); + Builder setDeliveryTimeOptimizePeriod(Integer deliveryTimeOptimizePeriod); /** * see getter @@ -711,24 +696,6 @@ interface Builder { */ Builder setTrackingPixelLocationTop(String trackingPixelLocationTop); - /** - * see getter - * - * @param hColonXMyHeader see getter - * @return Current builder - * @see #gethColonXMyHeader - */ - Builder sethColonXMyHeader(String hColonXMyHeader); - - /** - * see getter - * - * @param vColonMyVar see getter - * @return Current builder - * @see #getvColonMyVar - */ - Builder setvColonMyVar(String vColonMyVar); - /** * see getter * diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequestImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequestImpl.java index 34021d497..7270ef183 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequestImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequestImpl.java @@ -1,152 +1,135 @@ package com.sinch.sdk.domains.mailgun.models.v1.emails.request; -import com.fasterxml.jackson.annotation.JsonAnyGetter; -import com.fasterxml.jackson.annotation.JsonAnySetter; -import com.fasterxml.jackson.annotation.JsonFilter; -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; +import com.sinch.sdk.core.databind.annotation.FormSerialize; +import com.sinch.sdk.core.databind.annotation.PropertiesOrder; +import com.sinch.sdk.core.databind.annotation.Property; import com.sinch.sdk.core.models.OptionalValue; import java.io.File; +import java.time.Instant; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -@JsonPropertyOrder({ - SendMimeEmailRequestImpl.JSON_PROPERTY_TO, - SendMimeEmailRequestImpl.JSON_PROPERTY_MESSAGE, - SendMimeEmailRequestImpl.JSON_PROPERTY_TEMPLATE, - SendMimeEmailRequestImpl.JSON_PROPERTY_T_COLON_VERSION, - SendMimeEmailRequestImpl.JSON_PROPERTY_T_COLON_TEXT, - SendMimeEmailRequestImpl.JSON_PROPERTY_T_COLON_VARIABLES, - SendMimeEmailRequestImpl.JSON_PROPERTY_O_COLON_TAG, - SendMimeEmailRequestImpl.JSON_PROPERTY_O_COLON_DKIM, - SendMimeEmailRequestImpl.JSON_PROPERTY_O_COLON_SECONDARY_DKIM, - SendMimeEmailRequestImpl.JSON_PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC, - SendMimeEmailRequestImpl.JSON_PROPERTY_O_COLON_DELIVERYTIME, - SendMimeEmailRequestImpl.JSON_PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD, - SendMimeEmailRequestImpl.JSON_PROPERTY_O_COLON_TIME_ZONE_LOCALIZE, - SendMimeEmailRequestImpl.JSON_PROPERTY_O_COLON_TESTMODE, - SendMimeEmailRequestImpl.JSON_PROPERTY_O_COLON_TRACKING, - SendMimeEmailRequestImpl.JSON_PROPERTY_O_COLON_TRACKING_CLICKS, - SendMimeEmailRequestImpl.JSON_PROPERTY_O_COLON_TRACKING_OPENS, - SendMimeEmailRequestImpl.JSON_PROPERTY_O_COLON_REQUIRE_TLS, - SendMimeEmailRequestImpl.JSON_PROPERTY_O_COLON_SKIP_VERIFICATION, - SendMimeEmailRequestImpl.JSON_PROPERTY_O_COLON_SENDING_IP, - SendMimeEmailRequestImpl.JSON_PROPERTY_O_COLON_SENDING_IP_POOL, - SendMimeEmailRequestImpl.JSON_PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP, - SendMimeEmailRequestImpl.JSON_PROPERTY_H_COLON_X_MY_HEADER, - SendMimeEmailRequestImpl.JSON_PROPERTY_V_COLON_MY_VAR, - SendMimeEmailRequestImpl.JSON_PROPERTY_RECIPIENT_VARIABLES +@PropertiesOrder({ + SendMimeEmailRequestImpl.PROPERTY_TO, + SendMimeEmailRequestImpl.PROPERTY_MESSAGE, + SendMimeEmailRequestImpl.PROPERTY_TEMPLATE, + SendMimeEmailRequestImpl.PROPERTY_T_COLON_VERSION, + SendMimeEmailRequestImpl.PROPERTY_T_COLON_TEXT, + SendMimeEmailRequestImpl.PROPERTY_T_COLON_VARIABLES, + SendMimeEmailRequestImpl.PROPERTY_O_COLON_TAG, + SendMimeEmailRequestImpl.PROPERTY_O_COLON_DKIM, + SendMimeEmailRequestImpl.PROPERTY_O_COLON_SECONDARY_DKIM, + SendMimeEmailRequestImpl.PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC, + SendMimeEmailRequestImpl.PROPERTY_O_COLON_DELIVERYTIME, + SendMimeEmailRequestImpl.PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD, + SendMimeEmailRequestImpl.PROPERTY_O_COLON_TIME_ZONE_LOCALIZE, + SendMimeEmailRequestImpl.PROPERTY_O_COLON_TESTMODE, + SendMimeEmailRequestImpl.PROPERTY_O_COLON_TRACKING, + SendMimeEmailRequestImpl.PROPERTY_O_COLON_TRACKING_CLICKS, + SendMimeEmailRequestImpl.PROPERTY_O_COLON_TRACKING_OPENS, + SendMimeEmailRequestImpl.PROPERTY_O_COLON_REQUIRE_TLS, + SendMimeEmailRequestImpl.PROPERTY_O_COLON_SKIP_VERIFICATION, + SendMimeEmailRequestImpl.PROPERTY_O_COLON_SENDING_IP, + SendMimeEmailRequestImpl.PROPERTY_O_COLON_SENDING_IP_POOL, + SendMimeEmailRequestImpl.PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP, + SendMimeEmailRequestImpl.PROPERTY_RECIPIENT_VARIABLES }) -@JsonFilter("uninitializedFilter") -@JsonInclude(value = JsonInclude.Include.CUSTOM) public class SendMimeEmailRequestImpl implements SendMimeEmailRequest { private static final long serialVersionUID = 1L; - public static final String JSON_PROPERTY_TO = "to"; + public static final String PROPERTY_TO = "to"; private OptionalValue> to; - public static final String JSON_PROPERTY_MESSAGE = "message"; + public static final String PROPERTY_MESSAGE = "message"; private OptionalValue message; - public static final String JSON_PROPERTY_TEMPLATE = "template"; + public static final String PROPERTY_TEMPLATE = "template"; private OptionalValue template; - public static final String JSON_PROPERTY_T_COLON_VERSION = "t:version"; + public static final String PROPERTY_T_COLON_VERSION = "t:version"; private OptionalValue templateVersion; - public static final String JSON_PROPERTY_T_COLON_TEXT = "t:text"; + public static final String PROPERTY_T_COLON_TEXT = "t:text"; private OptionalValue templateText; - public static final String JSON_PROPERTY_T_COLON_VARIABLES = "t:variables"; + public static final String PROPERTY_T_COLON_VARIABLES = "t:variables"; private OptionalValue templateVariables; - public static final String JSON_PROPERTY_O_COLON_TAG = "o:tag"; + public static final String PROPERTY_O_COLON_TAG = "o:tag"; private OptionalValue> tag; - public static final String JSON_PROPERTY_O_COLON_DKIM = "o:dkim"; + public static final String PROPERTY_O_COLON_DKIM = "o:dkim"; private OptionalValue enableDkimSignature; - public static final String JSON_PROPERTY_O_COLON_SECONDARY_DKIM = "o:secondary-dkim"; + public static final String PROPERTY_O_COLON_SECONDARY_DKIM = "o:secondary-dkim"; private OptionalValue secondaryDkim; - public static final String JSON_PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC = - "o:secondary-dkim-public"; + public static final String PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC = "o:secondary-dkim-public"; private OptionalValue secondaryDkimPublic; - public static final String JSON_PROPERTY_O_COLON_DELIVERYTIME = "o:deliverytime"; + public static final String PROPERTY_O_COLON_DELIVERYTIME = "o:deliverytime"; - private OptionalValue deliveryTime; + private OptionalValue deliveryTime; - public static final String JSON_PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD = + public static final String PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD = "o:deliverytime-optimize-period"; - private OptionalValue deliveryTimeOptimizePeriod; + private OptionalValue deliveryTimeOptimizePeriod; - public static final String JSON_PROPERTY_O_COLON_TIME_ZONE_LOCALIZE = "o:time-zone-localize"; + public static final String PROPERTY_O_COLON_TIME_ZONE_LOCALIZE = "o:time-zone-localize"; private OptionalValue timezoneLocalize; - public static final String JSON_PROPERTY_O_COLON_TESTMODE = "o:testmode"; + public static final String PROPERTY_O_COLON_TESTMODE = "o:testmode"; private OptionalValue isTestMode; - public static final String JSON_PROPERTY_O_COLON_TRACKING = "o:tracking"; + public static final String PROPERTY_O_COLON_TRACKING = "o:tracking"; private OptionalValue tracking; - public static final String JSON_PROPERTY_O_COLON_TRACKING_CLICKS = "o:tracking-clicks"; + public static final String PROPERTY_O_COLON_TRACKING_CLICKS = "o:tracking-clicks"; private OptionalValue trackingClicks; - public static final String JSON_PROPERTY_O_COLON_TRACKING_OPENS = "o:tracking-opens"; + public static final String PROPERTY_O_COLON_TRACKING_OPENS = "o:tracking-opens"; private OptionalValue trackingOpens; - public static final String JSON_PROPERTY_O_COLON_REQUIRE_TLS = "o:require-tls"; + public static final String PROPERTY_O_COLON_REQUIRE_TLS = "o:require-tls"; private OptionalValue requireTls; - public static final String JSON_PROPERTY_O_COLON_SKIP_VERIFICATION = "o:skip-verification"; + public static final String PROPERTY_O_COLON_SKIP_VERIFICATION = "o:skip-verification"; private OptionalValue skipVerification; - public static final String JSON_PROPERTY_O_COLON_SENDING_IP = "o:sending-ip"; + public static final String PROPERTY_O_COLON_SENDING_IP = "o:sending-ip"; private OptionalValue sendingIp; - public static final String JSON_PROPERTY_O_COLON_SENDING_IP_POOL = "o:sending-ip-pool"; + public static final String PROPERTY_O_COLON_SENDING_IP_POOL = "o:sending-ip-pool"; private OptionalValue sendingIpPool; - public static final String JSON_PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP = + public static final String PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP = "o:tracking-pixel-location-top"; private OptionalValue trackingPixelLocationTop; - public static final String JSON_PROPERTY_H_COLON_X_MY_HEADER = "h:X-My-Header"; - - private OptionalValue hColonXMyHeader; - - public static final String JSON_PROPERTY_V_COLON_MY_VAR = "v:my-var"; - - private OptionalValue vColonMyVar; - - public static final String JSON_PROPERTY_RECIPIENT_VARIABLES = "recipient-variables"; + public static final String PROPERTY_RECIPIENT_VARIABLES = "recipient-variables"; private OptionalValue recipientVariables; @@ -169,8 +152,8 @@ protected SendMimeEmailRequestImpl( OptionalValue enableDkimSignature, OptionalValue secondaryDkim, OptionalValue secondaryDkimPublic, - OptionalValue deliveryTime, - OptionalValue deliveryTimeOptimizePeriod, + OptionalValue deliveryTime, + OptionalValue deliveryTimeOptimizePeriod, OptionalValue timezoneLocalize, OptionalValue isTestMode, OptionalValue tracking, @@ -181,8 +164,6 @@ protected SendMimeEmailRequestImpl( OptionalValue sendingIp, OptionalValue sendingIpPool, OptionalValue trackingPixelLocationTop, - OptionalValue hColonXMyHeader, - OptionalValue vColonMyVar, OptionalValue recipientVariables, OptionalValue> additionalProperties) { this.to = to; @@ -207,288 +188,220 @@ protected SendMimeEmailRequestImpl( this.sendingIp = sendingIp; this.sendingIpPool = sendingIpPool; this.trackingPixelLocationTop = trackingPixelLocationTop; - this.hColonXMyHeader = hColonXMyHeader; - this.vColonMyVar = vColonMyVar; this.recipientVariables = recipientVariables; this.additionalProperties = additionalProperties; } - @JsonIgnore public List getTo() { return to.orElse(null); } - @JsonProperty(JSON_PROPERTY_TO) - @JsonInclude(value = JsonInclude.Include.ALWAYS) + @Property(PROPERTY_TO) public OptionalValue> to() { return to; } - @JsonIgnore public File getMessage() { return message.orElse(null); } - @JsonProperty(JSON_PROPERTY_MESSAGE) - @JsonInclude(value = JsonInclude.Include.ALWAYS) + @Property(PROPERTY_MESSAGE) public OptionalValue message() { return message; } - @JsonIgnore public String getTemplate() { return template.orElse(null); } - @JsonProperty(JSON_PROPERTY_TEMPLATE) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_TEMPLATE) public OptionalValue template() { return template; } - @JsonIgnore public String getTemplateVersion() { return templateVersion.orElse(null); } - @JsonProperty(JSON_PROPERTY_T_COLON_VERSION) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_T_COLON_VERSION) public OptionalValue templateVersion() { return templateVersion; } - @JsonIgnore public TemplateTextEnum getTemplateText() { return templateText.orElse(null); } - @JsonProperty(JSON_PROPERTY_T_COLON_TEXT) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_T_COLON_TEXT) public OptionalValue templateText() { return templateText; } - @JsonIgnore public String getTemplateVariables() { return templateVariables.orElse(null); } - @JsonProperty(JSON_PROPERTY_T_COLON_VARIABLES) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_T_COLON_VARIABLES) public OptionalValue templateVariables() { return templateVariables; } - @JsonIgnore public List getTag() { return tag.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_TAG) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_TAG) public OptionalValue> tag() { return tag; } - @JsonIgnore public DkimSignatureEnum getEnableDkimSignature() { return enableDkimSignature.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_DKIM) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_DKIM) public OptionalValue enableDkimSignature() { return enableDkimSignature; } - @JsonIgnore public String getSecondaryDkim() { return secondaryDkim.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_SECONDARY_DKIM) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_SECONDARY_DKIM) public OptionalValue secondaryDkim() { return secondaryDkim; } - @JsonIgnore public String getSecondaryDkimPublic() { return secondaryDkimPublic.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC) public OptionalValue secondaryDkimPublic() { return secondaryDkimPublic; } - @JsonIgnore - public String getDeliveryTime() { + public Instant getDeliveryTime() { return deliveryTime.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_DELIVERYTIME) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public OptionalValue deliveryTime() { + @Property(PROPERTY_O_COLON_DELIVERYTIME) + @FormSerialize(using = com.sinch.sdk.core.utils.databind.RFC822FormSerializer.class) + public OptionalValue deliveryTime() { return deliveryTime; } - @JsonIgnore - public String getDeliveryTimeOptimizePeriod() { + public Integer getDeliveryTimeOptimizePeriod() { return deliveryTimeOptimizePeriod.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public OptionalValue deliveryTimeOptimizePeriod() { + @Property(PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD) + @FormSerialize( + using = com.sinch.sdk.domains.mailgun.api.v1.adapters.DeliveryTimeFormSerializer.class) + public OptionalValue deliveryTimeOptimizePeriod() { return deliveryTimeOptimizePeriod; } - @JsonIgnore public String getTimezoneLocalize() { return timezoneLocalize.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_TIME_ZONE_LOCALIZE) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_TIME_ZONE_LOCALIZE) public OptionalValue timezoneLocalize() { return timezoneLocalize; } - @JsonIgnore public TestModeEnum getIsTestMode() { return isTestMode.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_TESTMODE) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_TESTMODE) public OptionalValue isTestMode() { return isTestMode; } - @JsonIgnore public TrackingEnum getTracking() { return tracking.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_TRACKING) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_TRACKING) public OptionalValue tracking() { return tracking; } - @JsonIgnore public TrackingClicksEnum getTrackingClicks() { return trackingClicks.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_TRACKING_CLICKS) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_TRACKING_CLICKS) public OptionalValue trackingClicks() { return trackingClicks; } - @JsonIgnore public TrackingOpensEnum getTrackingOpens() { return trackingOpens.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_TRACKING_OPENS) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_TRACKING_OPENS) public OptionalValue trackingOpens() { return trackingOpens; } - @JsonIgnore public RequireTlsEnum getRequireTls() { return requireTls.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_REQUIRE_TLS) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_REQUIRE_TLS) public OptionalValue requireTls() { return requireTls; } - @JsonIgnore public SkipVerificationEnum getSkipVerification() { return skipVerification.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_SKIP_VERIFICATION) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_SKIP_VERIFICATION) public OptionalValue skipVerification() { return skipVerification; } - @JsonIgnore public String getSendingIp() { return sendingIp.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_SENDING_IP) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_SENDING_IP) public OptionalValue sendingIp() { return sendingIp; } - @JsonIgnore public String getSendingIpPool() { return sendingIpPool.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_SENDING_IP_POOL) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_SENDING_IP_POOL) public OptionalValue sendingIpPool() { return sendingIpPool; } - @JsonIgnore public String getTrackingPixelLocationTop() { return trackingPixelLocationTop.orElse(null); } - @JsonProperty(JSON_PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP) public OptionalValue trackingPixelLocationTop() { return trackingPixelLocationTop; } - @JsonIgnore - public String gethColonXMyHeader() { - return hColonXMyHeader.orElse(null); - } - - @JsonProperty(JSON_PROPERTY_H_COLON_X_MY_HEADER) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public OptionalValue hColonXMyHeader() { - return hColonXMyHeader; - } - - @JsonIgnore - public String getvColonMyVar() { - return vColonMyVar.orElse(null); - } - - @JsonProperty(JSON_PROPERTY_V_COLON_MY_VAR) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) - public OptionalValue vColonMyVar() { - return vColonMyVar; - } - - @JsonIgnore public String getRecipientVariables() { return recipientVariables.orElse(null); } - @JsonProperty(JSON_PROPERTY_RECIPIENT_VARIABLES) - @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS) + @Property(PROPERTY_RECIPIENT_VARIABLES) public OptionalValue recipientVariables() { return recipientVariables; } - @JsonIgnore public Object get(String key) { if (null == this.additionalProperties || !additionalProperties.isPresent()) { @@ -497,7 +410,6 @@ public Object get(String key) { return this.additionalProperties.get().get(key); } - @JsonAnyGetter public Map additionalProperties() { if (null == this.additionalProperties || !additionalProperties.isPresent()) { return null; @@ -575,11 +487,6 @@ public boolean equals(Object o) { && Objects.equals( this.trackingPixelLocationTop, poSTV3DomainNameMessagesMimeMultipartFormDataRequestBody.trackingPixelLocationTop) - && Objects.equals( - this.hColonXMyHeader, - poSTV3DomainNameMessagesMimeMultipartFormDataRequestBody.hColonXMyHeader) - && Objects.equals( - this.vColonMyVar, poSTV3DomainNameMessagesMimeMultipartFormDataRequestBody.vColonMyVar) && Objects.equals( this.recipientVariables, poSTV3DomainNameMessagesMimeMultipartFormDataRequestBody.recipientVariables) @@ -614,8 +521,6 @@ public int hashCode() { sendingIp, sendingIpPool, trackingPixelLocationTop, - hColonXMyHeader, - vColonMyVar, recipientVariables, super.hashCode(), additionalProperties); @@ -656,8 +561,6 @@ public String toString() { sb.append(" trackingPixelLocationTop: ") .append(toIndentedString(trackingPixelLocationTop)) .append("\n"); - sb.append(" hColonXMyHeader: ").append(toIndentedString(hColonXMyHeader)).append("\n"); - sb.append(" vColonMyVar: ").append(toIndentedString(vColonMyVar)).append("\n"); sb.append(" recipientVariables: ").append(toIndentedString(recipientVariables)).append("\n"); sb.append(" additionalProperties: ") .append(toIndentedString(additionalProperties)) @@ -676,7 +579,6 @@ private String toIndentedString(Object o) { return o.toString().replace("\n", "\n "); } - @JsonPOJOBuilder(withPrefix = "set") static class Builder implements SendMimeEmailRequest.Builder { OptionalValue> to = OptionalValue.empty(); OptionalValue message = OptionalValue.empty(); @@ -688,8 +590,8 @@ static class Builder implements SendMimeEmailRequest.Builder { OptionalValue enableDkimSignature = OptionalValue.empty(); OptionalValue secondaryDkim = OptionalValue.empty(); OptionalValue secondaryDkimPublic = OptionalValue.empty(); - OptionalValue deliveryTime = OptionalValue.empty(); - OptionalValue deliveryTimeOptimizePeriod = OptionalValue.empty(); + OptionalValue deliveryTime = OptionalValue.empty(); + OptionalValue deliveryTimeOptimizePeriod = OptionalValue.empty(); OptionalValue timezoneLocalize = OptionalValue.empty(); OptionalValue isTestMode = OptionalValue.empty(); OptionalValue tracking = OptionalValue.empty(); @@ -700,162 +602,147 @@ static class Builder implements SendMimeEmailRequest.Builder { OptionalValue sendingIp = OptionalValue.empty(); OptionalValue sendingIpPool = OptionalValue.empty(); OptionalValue trackingPixelLocationTop = OptionalValue.empty(); - OptionalValue hColonXMyHeader = OptionalValue.empty(); - OptionalValue vColonMyVar = OptionalValue.empty(); OptionalValue recipientVariables = OptionalValue.empty(); OptionalValue> additionalProperties = OptionalValue.empty(); - @JsonProperty(JSON_PROPERTY_TO) + @Property(value = PROPERTY_TO) public Builder setTo(List to) { this.to = OptionalValue.of(to); return this; } - @JsonProperty(JSON_PROPERTY_MESSAGE) + @Property(value = PROPERTY_MESSAGE) public Builder setMessage(File message) { this.message = OptionalValue.of(message); return this; } - @JsonProperty(JSON_PROPERTY_TEMPLATE) + @Property(value = PROPERTY_TEMPLATE) public Builder setTemplate(String template) { this.template = OptionalValue.of(template); return this; } - @JsonProperty(JSON_PROPERTY_T_COLON_VERSION) + @Property(value = PROPERTY_T_COLON_VERSION) public Builder setTemplateVersion(String templateVersion) { this.templateVersion = OptionalValue.of(templateVersion); return this; } - @JsonProperty(JSON_PROPERTY_T_COLON_TEXT) + @Property(value = PROPERTY_T_COLON_TEXT) public Builder setTemplateText(TemplateTextEnum templateText) { this.templateText = OptionalValue.of(templateText); return this; } - @JsonProperty(JSON_PROPERTY_T_COLON_VARIABLES) + @Property(value = PROPERTY_T_COLON_VARIABLES) public Builder setTemplateVariables(String templateVariables) { this.templateVariables = OptionalValue.of(templateVariables); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_TAG) + @Property(value = PROPERTY_O_COLON_TAG) public Builder setTag(List tag) { this.tag = OptionalValue.of(tag); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_DKIM) + @Property(value = PROPERTY_O_COLON_DKIM) public Builder setEnableDkimSignature(DkimSignatureEnum enableDkimSignature) { this.enableDkimSignature = OptionalValue.of(enableDkimSignature); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_SECONDARY_DKIM) + @Property(value = PROPERTY_O_COLON_SECONDARY_DKIM) public Builder setSecondaryDkim(String secondaryDkim) { this.secondaryDkim = OptionalValue.of(secondaryDkim); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC) + @Property(value = PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC) public Builder setSecondaryDkimPublic(String secondaryDkimPublic) { this.secondaryDkimPublic = OptionalValue.of(secondaryDkimPublic); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_DELIVERYTIME) - public Builder setDeliveryTime(String deliveryTime) { + @Property(value = PROPERTY_O_COLON_DELIVERYTIME) + public Builder setDeliveryTime(Instant deliveryTime) { this.deliveryTime = OptionalValue.of(deliveryTime); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD) - public Builder setDeliveryTimeOptimizePeriod(String deliveryTimeOptimizePeriod) { + @Property(value = PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD) + public Builder setDeliveryTimeOptimizePeriod(Integer deliveryTimeOptimizePeriod) { this.deliveryTimeOptimizePeriod = OptionalValue.of(deliveryTimeOptimizePeriod); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_TIME_ZONE_LOCALIZE) + @Property(value = PROPERTY_O_COLON_TIME_ZONE_LOCALIZE) public Builder setTimezoneLocalize(String timezoneLocalize) { this.timezoneLocalize = OptionalValue.of(timezoneLocalize); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_TESTMODE) + @Property(value = PROPERTY_O_COLON_TESTMODE) public Builder setIsTestMode(TestModeEnum isTestMode) { this.isTestMode = OptionalValue.of(isTestMode); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_TRACKING) + @Property(value = PROPERTY_O_COLON_TRACKING) public Builder setTracking(TrackingEnum tracking) { this.tracking = OptionalValue.of(tracking); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_TRACKING_CLICKS) + @Property(value = PROPERTY_O_COLON_TRACKING_CLICKS) public Builder setTrackingClicks(TrackingClicksEnum trackingClicks) { this.trackingClicks = OptionalValue.of(trackingClicks); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_TRACKING_OPENS) + @Property(value = PROPERTY_O_COLON_TRACKING_OPENS) public Builder setTrackingOpens(TrackingOpensEnum trackingOpens) { this.trackingOpens = OptionalValue.of(trackingOpens); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_REQUIRE_TLS) + @Property(value = PROPERTY_O_COLON_REQUIRE_TLS) public Builder setRequireTls(RequireTlsEnum requireTls) { this.requireTls = OptionalValue.of(requireTls); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_SKIP_VERIFICATION) + @Property(value = PROPERTY_O_COLON_SKIP_VERIFICATION) public Builder setSkipVerification(SkipVerificationEnum skipVerification) { this.skipVerification = OptionalValue.of(skipVerification); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_SENDING_IP) + @Property(value = PROPERTY_O_COLON_SENDING_IP) public Builder setSendingIp(String sendingIp) { this.sendingIp = OptionalValue.of(sendingIp); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_SENDING_IP_POOL) + @Property(value = PROPERTY_O_COLON_SENDING_IP_POOL) public Builder setSendingIpPool(String sendingIpPool) { this.sendingIpPool = OptionalValue.of(sendingIpPool); return this; } - @JsonProperty(JSON_PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP) + @Property(value = PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP) public Builder setTrackingPixelLocationTop(String trackingPixelLocationTop) { this.trackingPixelLocationTop = OptionalValue.of(trackingPixelLocationTop); return this; } - @JsonProperty(JSON_PROPERTY_H_COLON_X_MY_HEADER) - public Builder sethColonXMyHeader(String hColonXMyHeader) { - this.hColonXMyHeader = OptionalValue.of(hColonXMyHeader); - return this; - } - - @JsonProperty(JSON_PROPERTY_V_COLON_MY_VAR) - public Builder setvColonMyVar(String vColonMyVar) { - this.vColonMyVar = OptionalValue.of(vColonMyVar); - return this; - } - - @JsonProperty(JSON_PROPERTY_RECIPIENT_VARIABLES) + @Property(value = PROPERTY_RECIPIENT_VARIABLES) public Builder setRecipientVariables(String recipientVariables) { this.recipientVariables = OptionalValue.of(recipientVariables); return this; } - @JsonAnySetter public Builder put(String key, Object value) { if (!this.additionalProperties.isPresent()) { this.additionalProperties = OptionalValue.of(new HashMap()); @@ -888,8 +775,6 @@ public SendMimeEmailRequest build() { sendingIp, sendingIpPool, trackingPixelLocationTop, - hColonXMyHeader, - vColonMyVar, recipientVariables, additionalProperties); } From 6781a173975e0de69b3f86d5f404d76b67a3365c Mon Sep 17 00:00:00 2001 From: Jean-Pierre Portier Date: Tue, 26 Nov 2024 18:03:17 +0100 Subject: [PATCH 03/10] feat (Java): Support 'AdditionalProperty' interface for form parameters serialization --- .../adapters/DeliveryTimeFormSerializer.java | 5 +- .../sdk/core/databind/FormSerializer.java | 4 +- .../core/databind/multipart/ObjectMapper.java | 67 +++++++--- .../sdk/core/models/AdditionalProperties.java | 27 +++++ .../utils/databind/RFC822FormSerializer.java | 5 +- .../databind/multipart/ObjectMapperTest.java | 114 ++++++++++++++++-- .../v1/emails/request/SendEmailRequest.java | 13 +- .../emails/request/SendMimeEmailRequest.java | 13 +- .../internal/VerificationStartSmsOptions.java | 13 +- 9 files changed, 200 insertions(+), 61 deletions(-) create mode 100644 core/src/main/com/sinch/sdk/core/models/AdditionalProperties.java diff --git a/client/src/main/com/sinch/sdk/domains/mailgun/api/v1/adapters/DeliveryTimeFormSerializer.java b/client/src/main/com/sinch/sdk/domains/mailgun/api/v1/adapters/DeliveryTimeFormSerializer.java index c68d4d28a..652873490 100644 --- a/client/src/main/com/sinch/sdk/domains/mailgun/api/v1/adapters/DeliveryTimeFormSerializer.java +++ b/client/src/main/com/sinch/sdk/domains/mailgun/api/v1/adapters/DeliveryTimeFormSerializer.java @@ -1,11 +1,12 @@ package com.sinch.sdk.domains.mailgun.api.v1.adapters; import com.sinch.sdk.core.databind.FormSerializer; +import java.util.Map; public class DeliveryTimeFormSerializer extends FormSerializer { @Override - public String serialize(Integer in) { - return String.format("%dh", in); + public void serialize(Integer in, String fieldName, Map out) { + out.put(fieldName, String.format("%dh", in)); } } diff --git a/core/src/main/com/sinch/sdk/core/databind/FormSerializer.java b/core/src/main/com/sinch/sdk/core/databind/FormSerializer.java index 397eba1d0..a61ad0076 100644 --- a/core/src/main/com/sinch/sdk/core/databind/FormSerializer.java +++ b/core/src/main/com/sinch/sdk/core/databind/FormSerializer.java @@ -1,6 +1,8 @@ package com.sinch.sdk.core.databind; +import java.util.Map; + public abstract class FormSerializer { - public abstract Object serialize(T in); + public abstract void serialize(T in, String fieldName, Map out); } diff --git a/core/src/main/com/sinch/sdk/core/databind/multipart/ObjectMapper.java b/core/src/main/com/sinch/sdk/core/databind/multipart/ObjectMapper.java index b199fbd9a..048927f65 100644 --- a/core/src/main/com/sinch/sdk/core/databind/multipart/ObjectMapper.java +++ b/core/src/main/com/sinch/sdk/core/databind/multipart/ObjectMapper.java @@ -5,6 +5,7 @@ import com.sinch.sdk.core.databind.annotation.PropertiesOrder; import com.sinch.sdk.core.databind.annotation.Property; import com.sinch.sdk.core.exceptions.SerializationException; +import com.sinch.sdk.core.models.AdditionalProperties; import com.sinch.sdk.core.models.OptionalValue; import com.sinch.sdk.core.utils.EnumDynamic; import com.sinch.sdk.core.utils.Pair; @@ -16,6 +17,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -23,6 +25,8 @@ public class ObjectMapper { + static final String ADDITIONAL_PROPERTIES_IDENTIFIER = "additionalProperties"; + public Map serialize(Object value) throws IntrospectionException, InvocationTargetException, @@ -33,7 +37,13 @@ public Map serialize(Object value) BeanInfo beanInfo = Introspector.getBeanInfo(value.getClass(), Object.class); List> serializableProperties = collectSerializableProperties(beanInfo); - return serializeProperties(serializableProperties, value); + Map output = serializeProperties(serializableProperties, value); + if (value instanceof AdditionalProperties) { + serializeAdditionalProperties( + getAdditionalPropertiesGetter(beanInfo).getMethod(), value, output); + } + + return output; } private List> collectSerializableProperties(BeanInfo beanInfo) { @@ -77,49 +87,78 @@ private Optional> getPropertyGetter(Method method) { return Optional.of(new Pair<>(property.value(), method)); } + private MethodDescriptor getAdditionalPropertiesGetter(BeanInfo beanInfo) { + + return Arrays.stream(beanInfo.getMethodDescriptors()) + .filter(f -> f.getMethod().getName().equals(ADDITIONAL_PROPERTIES_IDENTIFIER)) + .findFirst() + .orElseThrow( + () -> + new SerializationException( + String.format("Missing '%s' getter", ADDITIONAL_PROPERTIES_IDENTIFIER))); + } + private Map serializeProperties( List> serializableProperties, Object object) throws InvocationTargetException, IllegalAccessException { - Map properties = new LinkedHashMap<>(); + Map out = new LinkedHashMap<>(); for (Pair property : serializableProperties) { + serializeProperty(object, property.getRight(), property.getLeft(), out); + } + return out; + } - serializeProperty(object, property.getRight()) - .ifPresent(v -> properties.put(property.getLeft(), v)); + private void serializeAdditionalProperties( + Method method, Object object, Map output) + throws InvocationTargetException, IllegalAccessException { + + @SuppressWarnings("unchecked") + Map propertyValue = (Map) method.invoke(object); + if (null == propertyValue) { + return; } - return properties; + + FormSerialize formSerialize = method.getDeclaredAnnotation(FormSerialize.class); + if (null != formSerialize) { + handleOverriddenSerialization(formSerialize, propertyValue, "", output); + return; + } + output.putAll(propertyValue); } - private OptionalValue serializeProperty(Object object, Method method) + private void serializeProperty( + Object object, Method method, String fieldName, Map out) throws InvocationTargetException, IllegalAccessException { OptionalValue propertyValue = (OptionalValue) method.invoke(object); - if (!propertyValue.isPresent() || null == propertyValue.get()) { - return propertyValue; + return; } Object value = propertyValue.get(); FormSerialize formSerialize = method.getDeclaredAnnotation(FormSerialize.class); if (null != formSerialize) { - value = handleOverriddenSerialization(formSerialize, value); + handleOverriddenSerialization(formSerialize, value, fieldName, out); + return; } if (value instanceof EnumDynamic) { EnumDynamic enumDynamic = (EnumDynamic) value; - return OptionalValue.of((enumDynamic.value().toString())); + out.put(fieldName, enumDynamic.value().toString()); + return; } - return OptionalValue.of(value); + out.put(fieldName, value); } - private Object handleOverriddenSerialization(FormSerialize formSerialize, Object value) { + private void handleOverriddenSerialization( + FormSerialize formSerialize, Object in, String fieldName, Map out) { try { Class clazz = Class.forName(formSerialize.using().getName()); @SuppressWarnings("unchecked") Constructor> ctor = (Constructor>) clazz.getConstructor(); - FormSerializer serializer = ctor.newInstance(); - return serializer.serialize(value); + ctor.newInstance().serialize(in, fieldName, out); } catch (Exception e) { throw new SerializationException(e); } diff --git a/core/src/main/com/sinch/sdk/core/models/AdditionalProperties.java b/core/src/main/com/sinch/sdk/core/models/AdditionalProperties.java new file mode 100644 index 000000000..d708d11b7 --- /dev/null +++ b/core/src/main/com/sinch/sdk/core/models/AdditionalProperties.java @@ -0,0 +1,27 @@ +package com.sinch.sdk.core.models; + +import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendEmailRequest.Builder; + +/** Interface definition for schemas supporting additional properties */ +public interface AdditionalProperties { + + /** + * Return the additional property with the specified name. + * + * @param key the name of the property + * @return the additional property with the specified name + * @since __TO_BE_DEFINED__ + */ + Object get(String key); + + interface Builder { + + /** + * see getter + * + * @return Current builder + * @see #get + */ + Builder put(String key, Object value); + } +} diff --git a/core/src/main/com/sinch/sdk/core/utils/databind/RFC822FormSerializer.java b/core/src/main/com/sinch/sdk/core/utils/databind/RFC822FormSerializer.java index d6ba53853..4d22a8fc4 100644 --- a/core/src/main/com/sinch/sdk/core/utils/databind/RFC822FormSerializer.java +++ b/core/src/main/com/sinch/sdk/core/utils/databind/RFC822FormSerializer.java @@ -4,11 +4,12 @@ import java.time.Instant; import java.time.ZoneId; import java.time.format.DateTimeFormatter; +import java.util.Map; public class RFC822FormSerializer extends FormSerializer { @Override - public String serialize(Instant in) { - return DateTimeFormatter.RFC_1123_DATE_TIME.format(in.atZone(ZoneId.of("UTC"))); + public void serialize(Instant in, String fieldName, Map out) { + out.put(fieldName, DateTimeFormatter.RFC_1123_DATE_TIME.format(in.atZone(ZoneId.of("UTC")))); } } diff --git a/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java b/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java index 27c80882e..091bdb667 100644 --- a/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java +++ b/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java @@ -6,6 +6,7 @@ import com.sinch.sdk.core.databind.annotation.PropertiesOrder; import com.sinch.sdk.core.databind.annotation.Property; import com.sinch.sdk.core.databind.multipart.ObjectMapperTest.SerializableObject.AnEnum; +import com.sinch.sdk.core.models.AdditionalProperties; import com.sinch.sdk.core.models.OptionalValue; import com.sinch.sdk.core.utils.EnumDynamic; import com.sinch.sdk.core.utils.EnumSupportDynamic; @@ -18,7 +19,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.LinkedHashMap; import java.util.Map; +import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; import org.junit.jupiter.api.Assertions; @@ -29,7 +32,7 @@ class ObjectMapperTest { static File fileAttachment1; static File fileAttachment2; - static Map serialized; + static Map serialized, defaultAdditionalPropertiesSerialized; static { ClassLoader classLoader = SendEmailRequestTest.class.getClassLoader(); @@ -40,6 +43,9 @@ class ObjectMapperTest { new File( classLoader.getResource("domains/mailgun/v1/emails/request/attachment2.txt").getFile()); + Map additionalProperties = + fillMap("header:toto", "toto-value", "variable:foo", "foo-value", "raw", "raw-value"); + SerializableObject object = new SerializableObject( OptionalValue.of("text value"), @@ -51,10 +57,16 @@ class ObjectMapperTest { OptionalValue.of(Arrays.asList(fileAttachment1, fileAttachment2)), OptionalValue.of( Arrays.asList( - Instant.parse("2024-11-25T10:06:54Z"), Instant.parse("2024-11-25T09:06:54Z")))); + Instant.parse("2024-11-25T10:06:54Z"), Instant.parse("2024-11-25T09:06:54Z"))), + additionalProperties); + + DefaultAdditionalPropertiesSerializableObject defaultAdditionalPropertiesSerializableObject = + new DefaultAdditionalPropertiesSerializableObject(additionalProperties); try { serialized = new ObjectMapper().serialize(object); + defaultAdditionalPropertiesSerialized = + new ObjectMapper().serialize(defaultAdditionalPropertiesSerializableObject); } catch (Exception e) { throw new RuntimeException(e); } @@ -62,7 +74,7 @@ class ObjectMapperTest { @Test void countValue() { - Assertions.assertEquals(8, serialized.size()); + Assertions.assertEquals(11, serialized.size()); } @Test @@ -76,7 +88,10 @@ void order() { SerializableObject.PROPERTY_FILE, SerializableObject.PROPERTY_ENUM, SerializableObject.PROPERTY_ENUM_COLLECTION, - SerializableObject.PROPERTY_TEXT_COLLECTION + SerializableObject.PROPERTY_TEXT_COLLECTION, + "h:toto", + "v:foo", + "raw" }; String[] keys = serialized.keySet().toArray(new String[0]); TestHelpers.recursiveEquals(expectedOrder, keys); @@ -128,6 +143,20 @@ void rfc822CollectionValue() { serialized.get("aRfc822Collection")); } + @Test + void additionalPropertiesValues() { + Assertions.assertEquals("toto-value", serialized.get("h:toto")); + Assertions.assertEquals("foo-value", serialized.get("v:foo")); + Assertions.assertEquals("raw-value", serialized.get("raw")); + } + + @Test + void defaultAdditionalPropertiesValues() { + TestHelpers.recursiveEquals( + fillMap("header:toto", "toto-value", "variable:foo", "foo-value", "raw", "raw-value"), + defaultAdditionalPropertiesSerialized); + } + @PropertiesOrder({ SerializableObject.PROPERTY_RFC822_COLLECTION, SerializableObject.PROPERTY_TEXT, @@ -139,7 +168,7 @@ void rfc822CollectionValue() { SerializableObject.PROPERTY_RFC822_COLLECTION, SerializableObject.PROPERTY_TEXT_COLLECTION }) - static class SerializableObject { + static class SerializableObject implements AdditionalProperties { public static final String PROPERTY_TEXT = "aText"; public static final String PROPERTY_ENUM = "anEnum"; public static final String PROPERTY_FILE = "aFile"; @@ -159,6 +188,7 @@ static class SerializableObject { private final OptionalValue> enumCollection; private final OptionalValue> fileCollection; private final OptionalValue> instantCollection; + private final Map additionalProperties; public SerializableObject( OptionalValue text, @@ -168,7 +198,8 @@ public SerializableObject( OptionalValue> textCollection, OptionalValue> enumCollection, OptionalValue> fileCollection, - OptionalValue> instantCollection) { + OptionalValue> instantCollection, + Map additionalProperties) { this.text = text; this._enum = _enum; this.file = file; @@ -177,6 +208,7 @@ public SerializableObject( this.textCollection = textCollection; this.enumCollection = enumCollection; this.fileCollection = fileCollection; + this.additionalProperties = additionalProperties; } @Property(PROPERTY_TEXT) @@ -221,6 +253,19 @@ public OptionalValue> instantCollection() { return instantCollection; } + @FormSerialize(using = AdditionalPropertiesFormSerializer.class) + public Map additionalProperties() { + return additionalProperties; + } + + public Object get(String key) { + return null; + } + + public Set keys() { + return additionalProperties.keySet(); + } + public static class AnEnum extends EnumDynamic { public static final AnEnum YES = new AnEnum("yes"); public static final AnEnum NO = new AnEnum("no"); @@ -246,15 +291,60 @@ public static String valueOf(AnEnum e) { } } + static class DefaultAdditionalPropertiesSerializableObject implements AdditionalProperties { + private final Map additionalProperties; + + public DefaultAdditionalPropertiesSerializableObject(Map additionalProperties) { + this.additionalProperties = additionalProperties; + } + + public Map additionalProperties() { + return additionalProperties; + } + + public Object get(String key) { + return null; + } + + public Set keys() { + return additionalProperties.keySet(); + } + } + public static class RFC822ListFormSerializer extends FormSerializer> { @Override - public Collection serialize(Collection in) { - return in.stream() - .map( - instant -> - DateTimeFormatter.RFC_1123_DATE_TIME.format(instant.atZone(ZoneId.of("UTC")))) - .collect(Collectors.toList()); + public void serialize(Collection in, String fieldName, Map out) { + out.put( + fieldName, + in.stream() + .map( + instant -> + DateTimeFormatter.RFC_1123_DATE_TIME.format(instant.atZone(ZoneId.of("UTC")))) + .collect(Collectors.toList())); + } + } + + public static class AdditionalPropertiesFormSerializer + extends FormSerializer> { + + @Override + public void serialize(Map in, String fieldName, Map out) { + + in.forEach( + (_key, value) -> { + String key = + ((String) _key).replaceAll("^header:", "h:").replaceAll("^variable:", "v:"); + out.put(key, value); + }); + } + } + + private static Map fillMap(Object... pairs) { + LinkedHashMap map = new LinkedHashMap<>(); + for (int i = 0; i < pairs.length; ) { + map.put((String) pairs[i++], pairs[i++]); } + return map; } } diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequest.java b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequest.java index bf8458201..45afb1198 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequest.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequest.java @@ -11,6 +11,7 @@ package com.sinch.sdk.domains.mailgun.models.v1.emails.request; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.sinch.sdk.core.models.AdditionalProperties; import com.sinch.sdk.core.utils.EnumDynamic; import com.sinch.sdk.core.utils.EnumSupportDynamic; import java.io.File; @@ -21,7 +22,7 @@ /** SendEmailRequest */ @JsonDeserialize(builder = SendEmailRequestImpl.Builder.class) -public interface SendEmailRequest { +public interface SendEmailRequest extends AdditionalProperties { /** * Email address for From header @@ -540,14 +541,6 @@ public static String valueOf(SkipVerificationEnum e) { */ String getRecipientVariables(); - /** - * Return the additional property with the specified name. - * - * @param key the name of the property - * @return the additional property with the specified name - */ - Object get(String key); - /** * Getting builder * @@ -558,7 +551,7 @@ static Builder builder() { } /** Dedicated Builder */ - interface Builder { + interface Builder extends AdditionalProperties.Builder { /** * see getter diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequest.java b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequest.java index cadb8ac4f..6b58b9ed4 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequest.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequest.java @@ -11,6 +11,7 @@ package com.sinch.sdk.domains.mailgun.models.v1.emails.request; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.sinch.sdk.core.models.AdditionalProperties; import com.sinch.sdk.core.utils.EnumDynamic; import com.sinch.sdk.core.utils.EnumSupportDynamic; import java.io.File; @@ -21,7 +22,7 @@ /** SendMimeEmailRequest */ @JsonDeserialize(builder = SendMimeEmailRequestImpl.Builder.class) -public interface SendMimeEmailRequest { +public interface SendMimeEmailRequest extends AdditionalProperties { /** * Email address of the recipient(s). Example: \"Bob <bob@host.com>\" @@ -478,14 +479,6 @@ public static String valueOf(SkipVerificationEnum e) { */ String getRecipientVariables(); - /** - * Return the additional property with the specified name. - * - * @param key the name of the property - * @return the additional property with the specified name - */ - Object get(String key); - /** * Getting builder * @@ -496,7 +489,7 @@ static Builder builder() { } /** Dedicated Builder */ - interface Builder { + interface Builder extends AdditionalProperties.Builder { /** * see getter diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/verification/models/v1/start/request/internal/VerificationStartSmsOptions.java b/openapi-contracts/src/main/com/sinch/sdk/domains/verification/models/v1/start/request/internal/VerificationStartSmsOptions.java index b9ae5e310..f5b8eb1be 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/verification/models/v1/start/request/internal/VerificationStartSmsOptions.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/verification/models/v1/start/request/internal/VerificationStartSmsOptions.java @@ -11,6 +11,7 @@ package com.sinch.sdk.domains.verification.models.v1.start.request.internal; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import com.sinch.sdk.core.models.AdditionalProperties; import com.sinch.sdk.core.utils.EnumDynamic; import com.sinch.sdk.core.utils.EnumSupportDynamic; import java.util.Arrays; @@ -21,7 +22,7 @@ * not provided. */ @JsonDeserialize(builder = VerificationStartSmsOptionsImpl.Builder.class) -public interface VerificationStartSmsOptions { +public interface VerificationStartSmsOptions extends AdditionalProperties { /** * The expiration time for a verification process is represented in the format HH:MM:SS @@ -82,14 +83,6 @@ public static String valueOf(CodeTypeEnum e) { */ String getAcceptLanguage(); - /** - * Return the additional property with the specified name. - * - * @param key the name of the property - * @return the additional property with the specified name - */ - Object get(String key); - /** * Getting builder * @@ -100,7 +93,7 @@ static Builder builder() { } /** Dedicated Builder */ - interface Builder { + interface Builder extends AdditionalProperties.Builder { /** * see getter From 3cafb58f59f7c784a887b7a447f4fb3d458e8c00 Mon Sep 17 00:00:00 2001 From: Jean-Pierre Portier Date: Wed, 27 Nov 2024 07:07:05 +0100 Subject: [PATCH 04/10] test (Mailgun): Unit tests --- .../api/v1/adapters/MailgunService.java | 3 +- .../api/v1/adapters/EmailsServiceTest.java | 103 ++++++++++++++++++ .../api/v1/adapters/MailgunServiceTest.java | 62 +++++++++++ .../databind/multipart/ObjectMapperTest.java | 4 +- .../emails/request/SendMimeEmailRequest.java | 18 +-- .../request/SendMimeEmailRequestImpl.java | 28 ++--- .../emails/request/SendEmailRequestTest.java | 14 +-- .../request/SendMimeEmailRequestTest.java | 95 ++++++++++++++++ 8 files changed, 289 insertions(+), 38 deletions(-) create mode 100644 client/src/test/java/com/sinch/sdk/domains/mailgun/api/v1/adapters/EmailsServiceTest.java create mode 100644 client/src/test/java/com/sinch/sdk/domains/mailgun/api/v1/adapters/MailgunServiceTest.java create mode 100644 openapi-contracts/src/test/java/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequestTest.java diff --git a/client/src/main/com/sinch/sdk/domains/mailgun/api/v1/adapters/MailgunService.java b/client/src/main/com/sinch/sdk/domains/mailgun/api/v1/adapters/MailgunService.java index 16e458584..3dc66f4bb 100644 --- a/client/src/main/com/sinch/sdk/domains/mailgun/api/v1/adapters/MailgunService.java +++ b/client/src/main/com/sinch/sdk/domains/mailgun/api/v1/adapters/MailgunService.java @@ -34,8 +34,7 @@ public MailgunService( credentials.getApiUser(), "Mailgun service requires 'apiUser' to be defined"); StringUtil.requireNonEmpty( credentials.getApiKey(), "Mailgun service requires 'apiKey' to be defined"); - StringUtil.requireNonEmpty( - context.getUrl(), "'Mailgun service requires mailgunUrl' to be defined"); + StringUtil.requireNonEmpty(context.getUrl(), "'Mailgun service requires 'url' to be defined"); LOGGER.fine("Activate Mailgun API with server='" + context.getServer().getUrl() + "'"); diff --git a/client/src/test/java/com/sinch/sdk/domains/mailgun/api/v1/adapters/EmailsServiceTest.java b/client/src/test/java/com/sinch/sdk/domains/mailgun/api/v1/adapters/EmailsServiceTest.java new file mode 100644 index 000000000..4b8185ef3 --- /dev/null +++ b/client/src/test/java/com/sinch/sdk/domains/mailgun/api/v1/adapters/EmailsServiceTest.java @@ -0,0 +1,103 @@ +package com.sinch.sdk.domains.mailgun.api.v1.adapters; + +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.adelean.inject.resources.junit.jupiter.TestWithResources; +import com.sinch.sdk.BaseTest; +import com.sinch.sdk.core.TestHelpers; +import com.sinch.sdk.core.http.AuthManager; +import com.sinch.sdk.core.http.HttpClient; +import com.sinch.sdk.domains.mailgun.api.v1.internal.EmailsApi; +import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendEmailRequestTest; +import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendMimeEmailRequestTest; +import com.sinch.sdk.domains.mailgun.models.v1.emails.response.GetStoredEmailResponse; +import com.sinch.sdk.domains.mailgun.models.v1.emails.response.GetStoredEmailResponseTest; +import com.sinch.sdk.domains.mailgun.models.v1.emails.response.SendEmailResponse; +import com.sinch.sdk.domains.mailgun.models.v1.emails.response.SendEmailResponseTest; +import com.sinch.sdk.domains.mailgun.models.v1.emails.response.SendingQueuesStatusResponse; +import com.sinch.sdk.domains.mailgun.models.v1.emails.response.SendingQueuesStatusResponseTest; +import com.sinch.sdk.models.MailgunContext; +import java.util.Map; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; + +@TestWithResources +class EmailsServiceTest extends BaseTest { + + @Mock MailgunContext context; + @Mock EmailsApi api; + @Mock HttpClient httpClient; + @Mock Map authManagers; + @Captor ArgumentCaptor domainNameCaptor; + + EmailsService service; + + String domainName = "fooDomain"; + String storageKey = "fooStorageKey"; + + @BeforeEach + public void initMocks() { + service = spy(new EmailsService(context, httpClient, authManagers)); + doReturn(api).when(service).getApi(); + } + + @Test + void send() { + when(api.sendEmail(eq(domainName), eq(SendEmailRequestTest.sendEmailRequest))) + .thenReturn(SendEmailResponseTest.expectedSendEmailResponse); + + SendEmailResponse response = service.send(domainName, SendEmailRequestTest.sendEmailRequest); + + TestHelpers.recursiveEquals(response, SendEmailResponseTest.expectedSendEmailResponse); + } + + @Test + void sendMime() { + when(api.sendMimeEmail(eq(domainName), eq(SendMimeEmailRequestTest.sendMimEmailRequest))) + .thenReturn(SendEmailResponseTest.expectedSendEmailResponse); + + SendEmailResponse response = + service.sendMime(domainName, SendMimeEmailRequestTest.sendMimEmailRequest); + + TestHelpers.recursiveEquals(response, SendEmailResponseTest.expectedSendEmailResponse); + } + + @Test + void get() { + when(api.getStoredEmail(eq(domainName), eq(storageKey))) + .thenReturn(GetStoredEmailResponseTest.expectedGetEmailResponse); + + GetStoredEmailResponse response = service.get(domainName, storageKey); + + TestHelpers.recursiveEquals(response, GetStoredEmailResponseTest.expectedGetEmailResponse); + } + + @Test + void getSendingQueuesStatus() { + when(api.getSendingQueuesStatus(eq(domainName))) + .thenReturn(SendingQueuesStatusResponseTest.expectedSendingQueuesStatusResponse); + + SendingQueuesStatusResponse response = service.getSendingQueuesStatus(domainName); + + TestHelpers.recursiveEquals( + response, SendingQueuesStatusResponseTest.expectedSendingQueuesStatusResponse); + } + + @Test + void purgeDomainQueues() { + + service.purgeDomainQueues(domainName); + + verify(api).purgeDomainQueues(domainNameCaptor.capture()); + + Assertions.assertThat(domainNameCaptor.getValue()).isEqualTo(domainName); + } +} diff --git a/client/src/test/java/com/sinch/sdk/domains/mailgun/api/v1/adapters/MailgunServiceTest.java b/client/src/test/java/com/sinch/sdk/domains/mailgun/api/v1/adapters/MailgunServiceTest.java new file mode 100644 index 000000000..e44be5293 --- /dev/null +++ b/client/src/test/java/com/sinch/sdk/domains/mailgun/api/v1/adapters/MailgunServiceTest.java @@ -0,0 +1,62 @@ +package com.sinch.sdk.domains.mailgun.api.v1.adapters; + +import static org.junit.jupiter.api.Assertions.*; + +import com.sinch.sdk.core.http.HttpClient; +import com.sinch.sdk.models.MailgunContext; +import com.sinch.sdk.models.MailgunCredentials; +import org.junit.jupiter.api.Test; +import org.mockito.Mock; + +class MailgunServiceTest { + @Mock HttpClient httpClient; + + @Test + void doNotAcceptNullKey() { + MailgunCredentials credentials = MailgunCredentials.builder().setApiKey(null).build(); + MailgunContext context = MailgunContext.builder().build(); + Exception exception = + assertThrows( + IllegalArgumentException.class, + () -> new MailgunService(credentials, context, httpClient)); + assertTrue(exception.getMessage().contains("apiKey")); + } + + @Test + void doNotAcceptNullContext() { + MailgunCredentials credentials = MailgunCredentials.builder().setApiKey("foo").build(); + Exception exception = + assertThrows( + NullPointerException.class, () -> new MailgunService(credentials, null, httpClient)); + assertTrue(exception.getMessage().contains("Mailgun service requires context to be defined")); + } + + @Test + void doNotAcceptEmptyURL() { + MailgunCredentials credentials = MailgunCredentials.builder().setApiKey("foo").build(); + MailgunContext context = MailgunContext.builder().setUrl("").build(); + Exception exception = + assertThrows( + IllegalArgumentException.class, + () -> new MailgunService(credentials, context, httpClient)); + assertTrue(exception.getMessage().contains("Mailgun service requires 'url' to be defined")); + } + + @Test + void doNotAcceptNullURL() { + MailgunCredentials credentials = MailgunCredentials.builder().setApiKey("foo").build(); + MailgunContext context = MailgunContext.builder().build(); + Exception exception = + assertThrows( + IllegalArgumentException.class, + () -> new MailgunService(credentials, context, httpClient)); + assertTrue(exception.getMessage().contains("Mailgun service requires 'url' to be defined")); + } + + @Test + void passInit() { + MailgunCredentials credentials = MailgunCredentials.builder().setApiKey("foo").build(); + MailgunContext context = MailgunContext.builder().setUrl("foo").build(); + assertDoesNotThrow(() -> new MailgunService(credentials, context, httpClient), "Init passed"); + } +} diff --git a/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java b/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java index 091bdb667..da8b9ed58 100644 --- a/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java +++ b/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java @@ -27,7 +27,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; -class ObjectMapperTest { +public class ObjectMapperTest { static File fileAttachment1; static File fileAttachment2; @@ -340,7 +340,7 @@ public void serialize(Map in, String fieldName, Map fillMap(Object... pairs) { + public static Map fillMap(Object... pairs) { LinkedHashMap map = new LinkedHashMap<>(); for (int i = 0; i < pairs.length; ) { map.put((String) pairs[i++], pairs[i++]); diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequest.java b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequest.java index 6b58b9ed4..9ab62142e 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequest.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequest.java @@ -224,9 +224,9 @@ public static String valueOf(TestModeEnum e) { * href="https://documentation.mailgun.com/docs/mailgun/user-manual/sending-messages/#sending-in-test-mode">Sending * in Test Mode * - * @return isTestMode + * @return testMode */ - TestModeEnum getIsTestMode(); + TestModeEnum getTestMode(); /** * Toggles both click and open tracking on a per-message basis, see . Has higher priority than domain-level setting. */ public class TrackingOpensEnum extends EnumDynamic { - public static final TrackingOpensEnum YES = new TrackingOpensEnum("test:yes"); - public static final TrackingOpensEnum NO = new TrackingOpensEnum("test:no"); - public static final TrackingOpensEnum TRUE = new TrackingOpensEnum("test:true"); - public static final TrackingOpensEnum FALSE = new TrackingOpensEnum("test:false"); + public static final TrackingOpensEnum YES = new TrackingOpensEnum("yes"); + public static final TrackingOpensEnum NO = new TrackingOpensEnum("no"); + public static final TrackingOpensEnum TRUE = new TrackingOpensEnum("true"); + public static final TrackingOpensEnum FALSE = new TrackingOpensEnum("false"); private static final EnumSupportDynamic ENUM_SUPPORT = new EnumSupportDynamic<>( @@ -611,11 +611,11 @@ interface Builder extends AdditionalProperties.Builder { /** * see getter * - * @param isTestMode see getter + * @param testMode see getter * @return Current builder - * @see #getIsTestMode + * @see #getTestMode */ - Builder setIsTestMode(TestModeEnum isTestMode); + Builder setTestMode(TestModeEnum testMode); /** * see getter diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequestImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequestImpl.java index 7270ef183..94ebe4e58 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequestImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequestImpl.java @@ -94,7 +94,7 @@ public class SendMimeEmailRequestImpl implements SendMimeEmailRequest { public static final String PROPERTY_O_COLON_TESTMODE = "o:testmode"; - private OptionalValue isTestMode; + private OptionalValue testMode; public static final String PROPERTY_O_COLON_TRACKING = "o:tracking"; @@ -155,7 +155,7 @@ protected SendMimeEmailRequestImpl( OptionalValue deliveryTime, OptionalValue deliveryTimeOptimizePeriod, OptionalValue timezoneLocalize, - OptionalValue isTestMode, + OptionalValue testMode, OptionalValue tracking, OptionalValue trackingClicks, OptionalValue trackingOpens, @@ -179,7 +179,7 @@ protected SendMimeEmailRequestImpl( this.deliveryTime = deliveryTime; this.deliveryTimeOptimizePeriod = deliveryTimeOptimizePeriod; this.timezoneLocalize = timezoneLocalize; - this.isTestMode = isTestMode; + this.testMode = testMode; this.tracking = tracking; this.trackingClicks = trackingClicks; this.trackingOpens = trackingOpens; @@ -312,13 +312,13 @@ public OptionalValue timezoneLocalize() { return timezoneLocalize; } - public TestModeEnum getIsTestMode() { - return isTestMode.orElse(null); + public TestModeEnum getTestMode() { + return testMode.orElse(null); } @Property(PROPERTY_O_COLON_TESTMODE) - public OptionalValue isTestMode() { - return isTestMode; + public OptionalValue testMode() { + return testMode; } public TrackingEnum getTracking() { @@ -465,7 +465,7 @@ public boolean equals(Object o) { this.timezoneLocalize, poSTV3DomainNameMessagesMimeMultipartFormDataRequestBody.timezoneLocalize) && Objects.equals( - this.isTestMode, poSTV3DomainNameMessagesMimeMultipartFormDataRequestBody.isTestMode) + this.testMode, poSTV3DomainNameMessagesMimeMultipartFormDataRequestBody.testMode) && Objects.equals( this.tracking, poSTV3DomainNameMessagesMimeMultipartFormDataRequestBody.tracking) && Objects.equals( @@ -512,7 +512,7 @@ public int hashCode() { deliveryTime, deliveryTimeOptimizePeriod, timezoneLocalize, - isTestMode, + testMode, tracking, trackingClicks, trackingOpens, @@ -550,7 +550,7 @@ public String toString() { .append(toIndentedString(deliveryTimeOptimizePeriod)) .append("\n"); sb.append(" timezoneLocalize: ").append(toIndentedString(timezoneLocalize)).append("\n"); - sb.append(" isTestMode: ").append(toIndentedString(isTestMode)).append("\n"); + sb.append(" testMode: ").append(toIndentedString(testMode)).append("\n"); sb.append(" tracking: ").append(toIndentedString(tracking)).append("\n"); sb.append(" trackingClicks: ").append(toIndentedString(trackingClicks)).append("\n"); sb.append(" trackingOpens: ").append(toIndentedString(trackingOpens)).append("\n"); @@ -593,7 +593,7 @@ static class Builder implements SendMimeEmailRequest.Builder { OptionalValue deliveryTime = OptionalValue.empty(); OptionalValue deliveryTimeOptimizePeriod = OptionalValue.empty(); OptionalValue timezoneLocalize = OptionalValue.empty(); - OptionalValue isTestMode = OptionalValue.empty(); + OptionalValue testMode = OptionalValue.empty(); OptionalValue tracking = OptionalValue.empty(); OptionalValue trackingClicks = OptionalValue.empty(); OptionalValue trackingOpens = OptionalValue.empty(); @@ -684,8 +684,8 @@ public Builder setTimezoneLocalize(String timezoneLocalize) { } @Property(value = PROPERTY_O_COLON_TESTMODE) - public Builder setIsTestMode(TestModeEnum isTestMode) { - this.isTestMode = OptionalValue.of(isTestMode); + public Builder setTestMode(TestModeEnum testMode) { + this.testMode = OptionalValue.of(testMode); return this; } @@ -766,7 +766,7 @@ public SendMimeEmailRequest build() { deliveryTime, deliveryTimeOptimizePeriod, timezoneLocalize, - isTestMode, + testMode, tracking, trackingClicks, trackingOpens, diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequestTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequestTest.java index f5d52dd23..69e8c267c 100644 --- a/openapi-contracts/src/test/java/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequestTest.java +++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequestTest.java @@ -3,6 +3,7 @@ import com.adelean.inject.resources.junit.jupiter.TestWithResources; import com.sinch.sdk.BaseTest; import com.sinch.sdk.core.TestHelpers; +import com.sinch.sdk.core.databind.multipart.ObjectMapperTest; import com.sinch.sdk.core.http.HttpMapper; import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendEmailRequest.DkimSignatureEnum; import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendEmailRequest.RequireTlsEnum; @@ -15,14 +16,13 @@ import java.io.File; import java.time.Instant; import java.util.Arrays; -import java.util.LinkedHashMap; import java.util.Map; import org.junit.jupiter.api.Test; @TestWithResources public class SendEmailRequestTest extends BaseTest { - static Map expected; + static Map expected; static File fileAttachment1; static File fileAttachment2; @@ -36,7 +36,7 @@ public class SendEmailRequestTest extends BaseTest { classLoader.getResource("domains/mailgun/v1/emails/request/attachment2.txt").getFile()); expected = - fillMap( + ObjectMapperTest.fillMap( // spotless:off "from", "User ", "to", Arrays.asList("aRecipient@mailgun-by-sinch.com"), @@ -116,12 +116,4 @@ void serialize() { TestHelpers.recursiveEquals(expected, serialized); } - - private static Map fillMap(Object... pairs) { - LinkedHashMap map = new LinkedHashMap<>(); - for (int i = 0; i < pairs.length; ) { - map.put(pairs[i++], pairs[i++]); - } - return map; - } } diff --git a/openapi-contracts/src/test/java/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequestTest.java b/openapi-contracts/src/test/java/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequestTest.java new file mode 100644 index 000000000..c37ca6c7d --- /dev/null +++ b/openapi-contracts/src/test/java/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequestTest.java @@ -0,0 +1,95 @@ +package com.sinch.sdk.domains.mailgun.models.v1.emails.request; + +import com.adelean.inject.resources.junit.jupiter.TestWithResources; +import com.sinch.sdk.BaseTest; +import com.sinch.sdk.core.TestHelpers; +import com.sinch.sdk.core.databind.multipart.ObjectMapperTest; +import com.sinch.sdk.core.http.HttpMapper; +import java.io.File; +import java.time.Instant; +import java.util.Arrays; +import java.util.Map; +import org.junit.jupiter.api.Test; + +@TestWithResources +public class SendMimeEmailRequestTest extends BaseTest { + + static Map expected; + static File fileAttachment1; + static File fileAttachment2; + + static { + ClassLoader classLoader = SendMimeEmailRequestTest.class.getClassLoader(); + fileAttachment1 = + new File( + classLoader.getResource("domains/mailgun/v1/emails/request/attachment1.txt").getFile()); + fileAttachment2 = + new File( + classLoader.getResource("domains/mailgun/v1/emails/request/attachment2.txt").getFile()); + + expected = + ObjectMapperTest.fillMap( + // spotless:off + "to", Arrays.asList("aRecipient@mailgun-by-sinch.com"), + "message", fileAttachment1, + "template","template value", + "t:version","2", + "t:text","yes", + "t:variables","{\"key\": \"value\"}", + "o:tag", Arrays.asList("tag1", "tag2"), + "o:dkim","true", + "o:secondary-dkim","example.com/s1", + "o:secondary-dkim-public","public.example.com/s1", + "o:deliverytime", "Sat, 22 Jan 2000 11:23:45 GMT", + "o:deliverytime-optimize-period", "29h", + "o:time-zone-localize","02:04PM", + "o:testmode", "no", + "o:tracking","htmlonly", + "o:tracking-clicks","true", + "o:tracking-opens","false", + "o:require-tls","true", + "o:skip-verification","no", + "o:sending-ip","192.168.0.10", + "o:sending-ip-pool","sending pool ID", + "o:tracking-pixel-location-top","foo", + "recipient-variables","{\"cc-dest@sinch.com\": {\"variable1\": \"value1\"}}" + // spotless:on + ); + } + + public static SendMimeEmailRequest sendMimEmailRequest = + SendMimeEmailRequest.builder() + .setMessage(fileAttachment1) + .setTag(Arrays.asList("tag1", "tag2")) + .setDeliveryTime(Instant.parse("2000-01-22T11:23:45Z")) + .setTestMode(SendMimeEmailRequest.TestModeEnum.from("no")) + .setTo(Arrays.asList("aRecipient@mailgun-by-sinch.com")) + .setTemplateText(SendMimeEmailRequest.TemplateTextEnum.YES) + .setTemplateVersion("2") + .setTemplateVariables("{\"key\": \"value\"}") + .setEnableDkimSignature(SendMimeEmailRequest.DkimSignatureEnum.TRUE) + .setSecondaryDkim("example.com/s1") + .setSecondaryDkimPublic("public.example.com/s1") + .setDeliveryTimeOptimizePeriod(29) + .setTimezoneLocalize("02:04PM") + .setTracking(SendMimeEmailRequest.TrackingEnum.HTMLONLY) + .setTrackingClicks(SendMimeEmailRequest.TrackingClicksEnum.TRUE) + .setTrackingOpens(SendMimeEmailRequest.TrackingOpensEnum.FALSE) + .setRequireTls(SendMimeEmailRequest.RequireTlsEnum.TRUE) + .setSkipVerification(SendMimeEmailRequest.SkipVerificationEnum.NO) + .setSendingIp("192.168.0.10") + .setSendingIpPool("sending pool ID") + .setTrackingPixelLocationTop("foo") + .setRecipientVariables("{\"cc-dest@sinch.com\": {\"variable1\": \"value1\"}}") + .setTemplate("template value") + .build(); + + @Test + void serialize() { + Object serialized = + new HttpMapper() + .serializeFormParameters(Arrays.asList("multipart/form-data"), sendMimEmailRequest); + + TestHelpers.recursiveEquals(expected, serialized); + } +} From 6db38a147c32eb127595a4e7c29210858e25c998 Mon Sep 17 00:00:00 2001 From: Jean-Pierre Portier Date: Wed, 27 Nov 2024 12:15:27 +0100 Subject: [PATCH 05/10] test (Mailgun/Emails): Adding Mailgun emails e2e tests --- .../test/java/com/sinch/sdk/e2e/Config.java | 10 + .../e2e/domains/mailgun/v1/EmailsSteps.java | 183 ++++++++++++++++++ .../sdk/e2e/domains/mailgun/v1/MailgunIT.java | 16 ++ pom.xml | 1 + 4 files changed, 210 insertions(+) create mode 100644 client/src/test/java/com/sinch/sdk/e2e/domains/mailgun/v1/EmailsSteps.java create mode 100644 client/src/test/java/com/sinch/sdk/e2e/domains/mailgun/v1/MailgunIT.java diff --git a/client/src/test/java/com/sinch/sdk/e2e/Config.java b/client/src/test/java/com/sinch/sdk/e2e/Config.java index 4c3d940f2..e0eec03ab 100644 --- a/client/src/test/java/com/sinch/sdk/e2e/Config.java +++ b/client/src/test/java/com/sinch/sdk/e2e/Config.java @@ -4,7 +4,9 @@ import com.sinch.sdk.models.Configuration; import com.sinch.sdk.models.ConversationContext; import com.sinch.sdk.models.ConversationRegion; +import com.sinch.sdk.models.MailgunContext; import com.sinch.sdk.models.VoiceContext; +import java.util.Arrays; public class Config { @@ -21,6 +23,10 @@ public class Config { public static final String VOICE_HOST_NAME = "http://localhost:3019"; public static final String VOICE_MANAGEMENT_HOST_NAME = "http://localhost:3020"; + public static final String MAILGUN_HOST_NAME = "http://localhost:3021"; + public static final String MAILGUN_API_KEY = "apiKey"; + public static final String MAILGUN_STORAGE = "http://localhost:3021"; + private final SinchClient client; private Config() { @@ -44,6 +50,10 @@ private Config() { .setVoiceApplicationMngmtUrl(VOICE_MANAGEMENT_HOST_NAME) .setVoiceUrl(VOICE_HOST_NAME) .build()) + .setMailgunContext( + MailgunContext.builder().setStorageUrls(Arrays.asList(MAILGUN_STORAGE)).build()) + .setMailgunApiKey(MAILGUN_API_KEY) + .setMailgunUrl(MAILGUN_HOST_NAME) .build(); client = new SinchClient(configuration); diff --git a/client/src/test/java/com/sinch/sdk/e2e/domains/mailgun/v1/EmailsSteps.java b/client/src/test/java/com/sinch/sdk/e2e/domains/mailgun/v1/EmailsSteps.java new file mode 100644 index 000000000..9af0035d7 --- /dev/null +++ b/client/src/test/java/com/sinch/sdk/e2e/domains/mailgun/v1/EmailsSteps.java @@ -0,0 +1,183 @@ +package com.sinch.sdk.e2e.domains.mailgun.v1; + +import com.sinch.sdk.core.TestHelpers; +import com.sinch.sdk.domains.mailgun.api.v1.EmailsService; +import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendEmailRequest; +import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendMimeEmailRequest; +import com.sinch.sdk.domains.mailgun.models.v1.emails.response.ExceededQueueQuotaRegular; +import com.sinch.sdk.domains.mailgun.models.v1.emails.response.ExceededQueueQuotaScheduled; +import com.sinch.sdk.domains.mailgun.models.v1.emails.response.GetStoredEmailResponse; +import com.sinch.sdk.domains.mailgun.models.v1.emails.response.QueueStatusDisabledDetails; +import com.sinch.sdk.domains.mailgun.models.v1.emails.response.SendEmailResponse; +import com.sinch.sdk.domains.mailgun.models.v1.emails.response.SendingQueuesStatusResponse; +import com.sinch.sdk.e2e.Config; +import io.cucumber.java.en.Given; +import io.cucumber.java.en.Then; +import io.cucumber.java.en.When; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import org.junit.jupiter.api.Assertions; + +public class EmailsSteps { + + EmailsService service; + + SendEmailResponse sendEmailResponse; + SendEmailResponse sendMimeEmailResponse; + GetStoredEmailResponse getStoredEmailResponse; + SendingQueuesStatusResponse sendingQueuesStatusResponse; + Boolean purgeDomainQueuesPassed; + + static final String domainName = "domainName"; + static final String storageKey = "storageKey"; + + @Given("^the Mailgun service \"Emails\" is available$") + public void serviceAvailable() { + service = Config.getSinchClient().mailgun().v1().emails(); + } + + @When("^I send a request to send a text email$") + public void send() { + + SendEmailRequest request = + SendEmailRequest.builder() + .setText("Hello, this is a text message for E2E testing.") + .setTo(Collections.singletonList("destination@e2e.tst")) + .setFrom("Excited E2E user \uD83D\uDCE7 ") + .setSubject("E2E test text email") + .build(); + + sendEmailResponse = service.send(domainName, request); + } + + @When("^I send a request to send a MIME email$") + public void sendMime() { + + File tempFile = new File("MimeMessage"); + tempFile.deleteOnExit(); + try (BufferedWriter out = new BufferedWriter(new FileWriter(tempFile))) { + out.write("\uD83D\uDCE7 Sample content \uD83D\uDCE7"); + } catch (IOException e) { + throw new RuntimeException(e); + } + + SendMimeEmailRequest request = + SendMimeEmailRequest.builder() + .setTo(Collections.singletonList("destination@e2e.tst")) + .setMessage(tempFile) + .build(); + + sendMimeEmailResponse = service.sendMime(domainName, request); + } + + @When("^I send a request to retrieve a stored email$") + public void getStoredEmail() { + + getStoredEmailResponse = service.get(domainName, storageKey); + } + + @When("^I send a request to get the sending queue status$") + public void getSendingQueuesStatus() { + + sendingQueuesStatusResponse = service.getSendingQueuesStatus(domainName); + } + + @When("^I send a request to purge the domain queues$") + public void purgeDomainQueues() { + + service.purgeDomainQueues(domainName); + purgeDomainQueuesPassed = true; + } + + @Then("the sendEmail response contains information about the text email") + public void sendResult() { + + SendEmailResponse expected = + SendEmailResponse.builder() + .setId("<20240606154318.027ac0b5fc80da62@sandbox123.mailgun.org>") + .setMessage("Queued. Thank you.") + .build(); + + TestHelpers.recursiveEquals(expected, sendEmailResponse); + } + + @Then("the sendMimeEmail response contains information about the email") + public void sendMimeResult() { + + SendEmailResponse expected = + SendEmailResponse.builder() + .setId("<20240606154852.a3fafd8a5230e166@sandbox123.mailgun.org>") + .setMessage("Queued. Thank you.") + .build(); + + TestHelpers.recursiveEquals(expected, sendMimeEmailResponse); + } + + @Then("the getEmail response contains the email details") + public void getStoredEmailResult() { + + GetStoredEmailResponse expected = + GetStoredEmailResponse.builder() + .setFrom("sender@e2e.tst") + .setSubject("Hello from mailgun") + .setTo("%recipient%") + .setSender("postmaster@sandbox123.mailgun.org") + .setRecipients("recipient@e2e.tst") + .setBodyHtml( + "

Hello %recipient.name%

This is an HTML" + + " email") + .setStrippedHtml( + "

Hello %recipient.name%

This is an HTML" + + " email") + .setBodyPlain("Message text only") + .setStrippedText("Message text only") + .setStrippedSignature("") + .setMessageHeaders( + Arrays.asList( + Arrays.asList("Mime-Version", "1.0"), + Arrays.asList( + "Content-Type", + "multipart/alternative;" + + " boundary=\"44eea75a00c7df3bdd541c89727faec0ce8d5b09663245a35789d6b264c6\""), + Arrays.asList("Subject", "Hello from mailgun"), + Arrays.asList("From", "sender@e2e.tst"), + Arrays.asList("To", "%recipient%"), + Arrays.asList("X-Mailgun-Deliver-By", "Thu, 06 Jun 2024 07:40:00 +0000"), + Arrays.asList( + "Message-Id", "<20240606162145.5f329edde3b4ed71@sandbox123.mailgun.org>"))) + .build(); + + TestHelpers.recursiveEquals(expected, getStoredEmailResponse); + } + + @Then("the response contains the sending queues status") + public void getSendingQueuesStatusResult() { + + SendingQueuesStatusResponse expected = + SendingQueuesStatusResponse.builder() + .setRegular( + ExceededQueueQuotaRegular.builder() + .setIsDisabled(false) + .setDisabled( + QueueStatusDisabledDetails.builder().setUntil("").setReason("").build()) + .build()) + .setScheduled( + ExceededQueueQuotaScheduled.builder() + .setIsDisabled(false) + .setDisabled( + QueueStatusDisabledDetails.builder().setUntil("").setReason("").build()) + .build()) + .build(); + + TestHelpers.recursiveEquals(expected, sendingQueuesStatusResponse); + } + + @Then("the response indicates the purge has been done") + public void purgeDomainQueuesValue() { + Assertions.assertTrue(purgeDomainQueuesPassed); + } +} diff --git a/client/src/test/java/com/sinch/sdk/e2e/domains/mailgun/v1/MailgunIT.java b/client/src/test/java/com/sinch/sdk/e2e/domains/mailgun/v1/MailgunIT.java new file mode 100644 index 000000000..68b48dfd6 --- /dev/null +++ b/client/src/test/java/com/sinch/sdk/e2e/domains/mailgun/v1/MailgunIT.java @@ -0,0 +1,16 @@ +package com.sinch.sdk.e2e.domains.mailgun.v1; + +import static io.cucumber.junit.platform.engine.Constants.GLUE_PROPERTY_NAME; + +import org.junit.platform.suite.api.ConfigurationParameter; +import org.junit.platform.suite.api.IncludeEngines; +import org.junit.platform.suite.api.SelectClasspathResource; +import org.junit.platform.suite.api.Suite; +import org.junit.platform.suite.api.SuiteDisplayName; + +@Suite +@SuiteDisplayName("Mailgun V1") +@IncludeEngines("cucumber") +@SelectClasspathResource("features/mailgun") +@ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "com.sinch.sdk.e2e.domains.mailgun.v1") +public class MailgunIT {} diff --git a/pom.xml b/pom.xml index 7132a23a8..73ec18153 100644 --- a/pom.xml +++ b/pom.xml @@ -321,6 +321,7 @@ + com.sinch.sdk.e2e.domains.mailgun.v1.MailgunIT com.sinch.sdk.e2e.domains.conversation.ConversationIT com.sinch.sdk.e2e.domains.voice.v0.VoiceIT com.sinch.sdk.e2e.domains.voice.v1.VoiceIT From d45ce941c4e56f52515c035439f129c7236277ce Mon Sep 17 00:00:00 2001 From: Jean-Pierre Portier Date: Wed, 27 Nov 2024 14:28:05 +0100 Subject: [PATCH 06/10] refactor (FormSerializer/Tests): Remove duplicated propery key from ordered list --- .../com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java b/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java index da8b9ed58..15fc0cc07 100644 --- a/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java +++ b/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java @@ -165,7 +165,6 @@ void defaultAdditionalPropertiesValues() { SerializableObject.PROPERTY_FILE, SerializableObject.PROPERTY_ENUM, SerializableObject.PROPERTY_ENUM_COLLECTION, - SerializableObject.PROPERTY_RFC822_COLLECTION, SerializableObject.PROPERTY_TEXT_COLLECTION }) static class SerializableObject implements AdditionalProperties { From 02bfb0e6d81c76b97780d0da906da682269552d4 Mon Sep 17 00:00:00 2001 From: Jean-Pierre Portier Date: Wed, 27 Nov 2024 16:01:34 +0100 Subject: [PATCH 07/10] feat (HttpCLient/Multipart): Set a default charset to 'UTF-8' is not specified --- .../src/main/com/sinch/sdk/http/HttpClientApache.java | 11 ++++++++--- .../sinch/sdk/e2e/domains/mailgun/v1/EmailsSteps.java | 2 +- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/client/src/main/com/sinch/sdk/http/HttpClientApache.java b/client/src/main/com/sinch/sdk/http/HttpClientApache.java index ef9b6de20..d6fc2b702 100644 --- a/client/src/main/com/sinch/sdk/http/HttpClientApache.java +++ b/client/src/main/com/sinch/sdk/http/HttpClientApache.java @@ -134,7 +134,7 @@ public HttpResponse invokeAPI( addBody(requestBuilder, body); } - addFormParams(requestBuilder, formParams); + addFormParams(requestBuilder, contentType, formParams); addAuth(requestBuilder, authManagersByOasSecuritySchemes, authNames, body); @@ -225,14 +225,19 @@ private void addBody(ClassicRequestBuilder requestBuilder, String body) { requestBuilder.setEntity(new StringEntity(body, charset)); } - private void addFormParams(ClassicRequestBuilder requestBuilder, Map formParams) { + private void addFormParams( + ClassicRequestBuilder requestBuilder, + Collection contentType, + Map formParams) { if (null == formParams) { return; } MultipartEntityBuilder multiPartBuilder = MultipartEntityBuilder.create(); - + if (contentType.stream().noneMatch(cType -> cType.toLowerCase().contains("charset="))) { + multiPartBuilder.setCharset(StandardCharsets.UTF_8); + } formParams.forEach((key, value) -> addMultiPart(requestBuilder, multiPartBuilder, key, value)); requestBuilder.setEntity(multiPartBuilder.build()); diff --git a/client/src/test/java/com/sinch/sdk/e2e/domains/mailgun/v1/EmailsSteps.java b/client/src/test/java/com/sinch/sdk/e2e/domains/mailgun/v1/EmailsSteps.java index 9af0035d7..8776e7d4e 100644 --- a/client/src/test/java/com/sinch/sdk/e2e/domains/mailgun/v1/EmailsSteps.java +++ b/client/src/test/java/com/sinch/sdk/e2e/domains/mailgun/v1/EmailsSteps.java @@ -47,7 +47,7 @@ public void send() { SendEmailRequest.builder() .setText("Hello, this is a text message for E2E testing.") .setTo(Collections.singletonList("destination@e2e.tst")) - .setFrom("Excited E2E user \uD83D\uDCE7 ") + .setFrom("Excited E2E user ✉️ ") .setSubject("E2E test text email") .build(); From b2d7acb077439ed9a113463befb0b5de4e880a75 Mon Sep 17 00:00:00 2001 From: Jean-Pierre Portier Date: Wed, 27 Nov 2024 17:42:14 +0100 Subject: [PATCH 08/10] refactor (FormSerializer): Sorting properties optimization --- .../core/databind/multipart/ObjectMapper.java | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/core/src/main/com/sinch/sdk/core/databind/multipart/ObjectMapper.java b/core/src/main/com/sinch/sdk/core/databind/multipart/ObjectMapper.java index 048927f65..3f97b718a 100644 --- a/core/src/main/com/sinch/sdk/core/databind/multipart/ObjectMapper.java +++ b/core/src/main/com/sinch/sdk/core/databind/multipart/ObjectMapper.java @@ -18,6 +18,7 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; +import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -54,28 +55,24 @@ private List> collectSerializableProperties(BeanInfo beanIn for (MethodDescriptor methodDescriptor : methodDescriptors) { getPropertyGetter(methodDescriptor.getMethod()).ifPresent(result::add); } - return sortProperties(beanInfo, result); + + sortProperties(beanInfo, result); + return result; } - private List> sortProperties( - BeanInfo beanInfo, List> properties) { + private void sortProperties(BeanInfo beanInfo, List> properties) { - PropertiesOrder propertyOrder = + PropertiesOrder propertiesOrder = beanInfo.getBeanDescriptor().getBeanClass().getAnnotation(PropertiesOrder.class); - if (null == propertyOrder) { - return properties; + if (null == propertiesOrder + || null == propertiesOrder.value() + || 0 == propertiesOrder.value().length) { + return; } - ArrayList> sorted = new ArrayList<>(properties.size()); - - for (String property : propertyOrder.value()) { - properties.stream() - .filter(p -> p.getLeft().equals(property)) - .findFirst() - .ifPresent(sorted::add); - } - return sorted; + List order = java.util.Arrays.asList(propertiesOrder.value()); + properties.sort(Comparator.comparingInt(l -> order.indexOf(l.getLeft()))); } private Optional> getPropertyGetter(Method method) { From cc4789e2ef78047742ae1e95b350c64c45dcc894 Mon Sep 17 00:00:00 2001 From: Jean-Pierre Portier Date: Thu, 28 Nov 2024 09:59:10 +0100 Subject: [PATCH 09/10] feat (FormSerializer): Remove 'PropertiesOrder' feature --- .../databind/annotation/PropertiesOrder.java | 14 -------- .../core/databind/multipart/ObjectMapper.java | 18 ---------- .../databind/multipart/ObjectMapperTest.java | 31 ----------------- .../emails/request/SendEmailRequestImpl.java | 34 ------------------- .../request/SendMimeEmailRequestImpl.java | 26 -------------- 5 files changed, 123 deletions(-) delete mode 100644 core/src/main/com/sinch/sdk/core/databind/annotation/PropertiesOrder.java diff --git a/core/src/main/com/sinch/sdk/core/databind/annotation/PropertiesOrder.java b/core/src/main/com/sinch/sdk/core/databind/annotation/PropertiesOrder.java deleted file mode 100644 index 9fedef100..000000000 --- a/core/src/main/com/sinch/sdk/core/databind/annotation/PropertiesOrder.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.sinch.sdk.core.databind.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -@Target({ElementType.TYPE}) -@Retention(RetentionPolicy.RUNTIME) -@SinchAnnotation -public @interface PropertiesOrder { - - String[] value() default {}; -} diff --git a/core/src/main/com/sinch/sdk/core/databind/multipart/ObjectMapper.java b/core/src/main/com/sinch/sdk/core/databind/multipart/ObjectMapper.java index 3f97b718a..2401658db 100644 --- a/core/src/main/com/sinch/sdk/core/databind/multipart/ObjectMapper.java +++ b/core/src/main/com/sinch/sdk/core/databind/multipart/ObjectMapper.java @@ -2,7 +2,6 @@ import com.sinch.sdk.core.databind.FormSerializer; import com.sinch.sdk.core.databind.annotation.FormSerialize; -import com.sinch.sdk.core.databind.annotation.PropertiesOrder; import com.sinch.sdk.core.databind.annotation.Property; import com.sinch.sdk.core.exceptions.SerializationException; import com.sinch.sdk.core.models.AdditionalProperties; @@ -18,7 +17,6 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; -import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -56,25 +54,9 @@ private List> collectSerializableProperties(BeanInfo beanIn getPropertyGetter(methodDescriptor.getMethod()).ifPresent(result::add); } - sortProperties(beanInfo, result); return result; } - private void sortProperties(BeanInfo beanInfo, List> properties) { - - PropertiesOrder propertiesOrder = - beanInfo.getBeanDescriptor().getBeanClass().getAnnotation(PropertiesOrder.class); - - if (null == propertiesOrder - || null == propertiesOrder.value() - || 0 == propertiesOrder.value().length) { - return; - } - - List order = java.util.Arrays.asList(propertiesOrder.value()); - properties.sort(Comparator.comparingInt(l -> order.indexOf(l.getLeft()))); - } - private Optional> getPropertyGetter(Method method) { Property property = method.getDeclaredAnnotation(Property.class); diff --git a/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java b/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java index 15fc0cc07..db12a0920 100644 --- a/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java +++ b/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java @@ -3,7 +3,6 @@ import com.sinch.sdk.core.TestHelpers; import com.sinch.sdk.core.databind.FormSerializer; import com.sinch.sdk.core.databind.annotation.FormSerialize; -import com.sinch.sdk.core.databind.annotation.PropertiesOrder; import com.sinch.sdk.core.databind.annotation.Property; import com.sinch.sdk.core.databind.multipart.ObjectMapperTest.SerializableObject.AnEnum; import com.sinch.sdk.core.models.AdditionalProperties; @@ -77,26 +76,6 @@ void countValue() { Assertions.assertEquals(11, serialized.size()); } - @Test - void order() { - - String[] expectedOrder = { - SerializableObject.PROPERTY_RFC822_COLLECTION, - SerializableObject.PROPERTY_TEXT, - SerializableObject.PROPERTY_FILE_COLLECTION, - SerializableObject.PROPERTY_RFC822, - SerializableObject.PROPERTY_FILE, - SerializableObject.PROPERTY_ENUM, - SerializableObject.PROPERTY_ENUM_COLLECTION, - SerializableObject.PROPERTY_TEXT_COLLECTION, - "h:toto", - "v:foo", - "raw" - }; - String[] keys = serialized.keySet().toArray(new String[0]); - TestHelpers.recursiveEquals(expectedOrder, keys); - } - @Test void textValue() { TestHelpers.recursiveEquals("text value", serialized.get("aText")); @@ -157,16 +136,6 @@ void defaultAdditionalPropertiesValues() { defaultAdditionalPropertiesSerialized); } - @PropertiesOrder({ - SerializableObject.PROPERTY_RFC822_COLLECTION, - SerializableObject.PROPERTY_TEXT, - SerializableObject.PROPERTY_FILE_COLLECTION, - SerializableObject.PROPERTY_RFC822, - SerializableObject.PROPERTY_FILE, - SerializableObject.PROPERTY_ENUM, - SerializableObject.PROPERTY_ENUM_COLLECTION, - SerializableObject.PROPERTY_TEXT_COLLECTION - }) static class SerializableObject implements AdditionalProperties { public static final String PROPERTY_TEXT = "aText"; public static final String PROPERTY_ENUM = "anEnum"; diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequestImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequestImpl.java index 9befa99ab..6233c9e1a 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequestImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendEmailRequestImpl.java @@ -1,7 +1,6 @@ package com.sinch.sdk.domains.mailgun.models.v1.emails.request; import com.sinch.sdk.core.databind.annotation.FormSerialize; -import com.sinch.sdk.core.databind.annotation.PropertiesOrder; import com.sinch.sdk.core.databind.annotation.Property; import com.sinch.sdk.core.models.OptionalValue; import java.io.File; @@ -11,39 +10,6 @@ import java.util.Map; import java.util.Objects; -@PropertiesOrder({ - SendEmailRequestImpl.PROPERTY_FROM, - SendEmailRequestImpl.PROPERTY_TO, - SendEmailRequestImpl.PROPERTY_CC, - SendEmailRequestImpl.PROPERTY_BCC, - SendEmailRequestImpl.PROPERTY_SUBJECT, - SendEmailRequestImpl.PROPERTY_TEXT, - SendEmailRequestImpl.PROPERTY_HTML, - SendEmailRequestImpl.PROPERTY_AMP_HTML, - SendEmailRequestImpl.PROPERTY_ATTACHMENT, - SendEmailRequestImpl.PROPERTY_INLINE, - SendEmailRequestImpl.PROPERTY_TEMPLATE, - SendEmailRequestImpl.PROPERTY_T_COLON_VERSION, - SendEmailRequestImpl.PROPERTY_T_COLON_TEXT, - SendEmailRequestImpl.PROPERTY_T_COLON_VARIABLES, - SendEmailRequestImpl.PROPERTY_O_COLON_TAG, - SendEmailRequestImpl.PROPERTY_O_COLON_DKIM, - SendEmailRequestImpl.PROPERTY_O_COLON_SECONDARY_DKIM, - SendEmailRequestImpl.PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC, - SendEmailRequestImpl.PROPERTY_O_COLON_DELIVERYTIME, - SendEmailRequestImpl.PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD, - SendEmailRequestImpl.PROPERTY_O_COLON_TIME_ZONE_LOCALIZE, - SendEmailRequestImpl.PROPERTY_O_COLON_TESTMODE, - SendEmailRequestImpl.PROPERTY_O_COLON_TRACKING, - SendEmailRequestImpl.PROPERTY_O_COLON_TRACKING_CLICKS, - SendEmailRequestImpl.PROPERTY_O_COLON_TRACKING_OPENS, - SendEmailRequestImpl.PROPERTY_O_COLON_REQUIRE_TLS, - SendEmailRequestImpl.PROPERTY_O_COLON_SKIP_VERIFICATION, - SendEmailRequestImpl.PROPERTY_O_COLON_SENDING_IP, - SendEmailRequestImpl.PROPERTY_O_COLON_SENDING_IP_POOL, - SendEmailRequestImpl.PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP, - SendEmailRequestImpl.PROPERTY_RECIPIENT_VARIABLES -}) public class SendEmailRequestImpl implements SendEmailRequest { private static final long serialVersionUID = 1L; diff --git a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequestImpl.java b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequestImpl.java index 94ebe4e58..05cd10244 100644 --- a/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequestImpl.java +++ b/openapi-contracts/src/main/com/sinch/sdk/domains/mailgun/models/v1/emails/request/SendMimeEmailRequestImpl.java @@ -1,7 +1,6 @@ package com.sinch.sdk.domains.mailgun.models.v1.emails.request; import com.sinch.sdk.core.databind.annotation.FormSerialize; -import com.sinch.sdk.core.databind.annotation.PropertiesOrder; import com.sinch.sdk.core.databind.annotation.Property; import com.sinch.sdk.core.models.OptionalValue; import java.io.File; @@ -11,31 +10,6 @@ import java.util.Map; import java.util.Objects; -@PropertiesOrder({ - SendMimeEmailRequestImpl.PROPERTY_TO, - SendMimeEmailRequestImpl.PROPERTY_MESSAGE, - SendMimeEmailRequestImpl.PROPERTY_TEMPLATE, - SendMimeEmailRequestImpl.PROPERTY_T_COLON_VERSION, - SendMimeEmailRequestImpl.PROPERTY_T_COLON_TEXT, - SendMimeEmailRequestImpl.PROPERTY_T_COLON_VARIABLES, - SendMimeEmailRequestImpl.PROPERTY_O_COLON_TAG, - SendMimeEmailRequestImpl.PROPERTY_O_COLON_DKIM, - SendMimeEmailRequestImpl.PROPERTY_O_COLON_SECONDARY_DKIM, - SendMimeEmailRequestImpl.PROPERTY_O_COLON_SECONDARY_DKIM_PUBLIC, - SendMimeEmailRequestImpl.PROPERTY_O_COLON_DELIVERYTIME, - SendMimeEmailRequestImpl.PROPERTY_O_COLON_DELIVERYTIME_OPTIMIZE_PERIOD, - SendMimeEmailRequestImpl.PROPERTY_O_COLON_TIME_ZONE_LOCALIZE, - SendMimeEmailRequestImpl.PROPERTY_O_COLON_TESTMODE, - SendMimeEmailRequestImpl.PROPERTY_O_COLON_TRACKING, - SendMimeEmailRequestImpl.PROPERTY_O_COLON_TRACKING_CLICKS, - SendMimeEmailRequestImpl.PROPERTY_O_COLON_TRACKING_OPENS, - SendMimeEmailRequestImpl.PROPERTY_O_COLON_REQUIRE_TLS, - SendMimeEmailRequestImpl.PROPERTY_O_COLON_SKIP_VERIFICATION, - SendMimeEmailRequestImpl.PROPERTY_O_COLON_SENDING_IP, - SendMimeEmailRequestImpl.PROPERTY_O_COLON_SENDING_IP_POOL, - SendMimeEmailRequestImpl.PROPERTY_O_COLON_TRACKING_PIXEL_LOCATION_TOP, - SendMimeEmailRequestImpl.PROPERTY_RECIPIENT_VARIABLES -}) public class SendMimeEmailRequestImpl implements SendMimeEmailRequest { private static final long serialVersionUID = 1L; From d075b64e8d1a33e950e1d054b98bc3dbe50b3994 Mon Sep 17 00:00:00 2001 From: Jean-Pierre Portier Date: Thu, 28 Nov 2024 16:55:50 +0100 Subject: [PATCH 10/10] refactor (Core/RFC822 formatter): Use Core RFC822 formatter from ObjectMapper test --- .../core/utils/databind/RFC822FormSerializer.java | 6 +++++- .../core/databind/multipart/ObjectMapperTest.java | 14 +++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/core/src/main/com/sinch/sdk/core/utils/databind/RFC822FormSerializer.java b/core/src/main/com/sinch/sdk/core/utils/databind/RFC822FormSerializer.java index 4d22a8fc4..51c84e3aa 100644 --- a/core/src/main/com/sinch/sdk/core/utils/databind/RFC822FormSerializer.java +++ b/core/src/main/com/sinch/sdk/core/utils/databind/RFC822FormSerializer.java @@ -10,6 +10,10 @@ public class RFC822FormSerializer extends FormSerializer { @Override public void serialize(Instant in, String fieldName, Map out) { - out.put(fieldName, DateTimeFormatter.RFC_1123_DATE_TIME.format(in.atZone(ZoneId.of("UTC")))); + out.put(fieldName, format(in)); + } + + public static String format(Instant instant) { + return DateTimeFormatter.RFC_1123_DATE_TIME.format(instant.atZone(ZoneId.of("UTC"))); } } diff --git a/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java b/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java index db12a0920..c1f1668b2 100644 --- a/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java +++ b/core/src/test/java/com/sinch/sdk/core/databind/multipart/ObjectMapperTest.java @@ -13,8 +13,6 @@ import com.sinch.sdk.domains.mailgun.models.v1.emails.request.SendEmailRequestTest; import java.io.File; import java.time.Instant; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -283,13 +281,11 @@ public static class RFC822ListFormSerializer extends FormSerializer in, String fieldName, Map out) { - out.put( - fieldName, - in.stream() - .map( - instant -> - DateTimeFormatter.RFC_1123_DATE_TIME.format(instant.atZone(ZoneId.of("UTC")))) - .collect(Collectors.toList())); + + Collection formatted = + in.stream().map(RFC822FormSerializer::format).collect(Collectors.toList()); + + out.put(fieldName, formatted); } }